diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 0000000000..3aa26f6a70 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,19 @@ +--- +name: Bug report +about: Create a report to help us improve +--- + + + + + +- SQL Operations Studio Version: +- OS Version: + +Steps to Reproduce: + +1. +2. + + +Does this issue occur when all extensions are disabled?: Yes/No diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 0000000000..a820760fc4 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,9 @@ +--- +name: Feature request +about: Suggest an idea for this project + +--- + + + + diff --git a/.github/ISSUE_TEMPLATE/question.md b/.github/ISSUE_TEMPLATE/question.md new file mode 100644 index 0000000000..4217aa2af2 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/question.md @@ -0,0 +1,4 @@ +--- +name: Question +--- + diff --git a/.gitignore b/.gitignore index ccf4cca05f..08adb4af66 100644 --- a/.gitignore +++ b/.gitignore @@ -6,6 +6,8 @@ node_modules/ out/ out-build/ out-editor/ +out-editor-src/ +out-editor-build/ out-editor-esm/ out-editor-min/ out-monaco-editor-core/ @@ -14,4 +16,5 @@ out-vscode-min/ build/node_modules coverage/ test_data/ +test-results/ yarn-error.log \ No newline at end of file diff --git a/.vscode/launch.json b/.vscode/launch.json index 6f41f7f7f4..9a4c86bff1 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -106,6 +106,7 @@ "runtimeExecutable": "${workspaceFolder}/.build/electron/sqlops" }, "stopOnEntry": false, + "outputCapture": "std", "args": [ "--delay", "--timeout", @@ -118,6 +119,15 @@ "outFiles": [ "${workspaceFolder}/out/**/*.js" ] + }, + { + "name": "Launch Built-in Extension", + "type": "extensionHost", + "request": "launch", + "runtimeExecutable": "${execPath}", + "args": [ + "--extensionDevelopmentPath=${workspaceRoot}/extensions/debug-auto-launch" + ] } ], "compounds": [ @@ -134,6 +144,13 @@ "Launch sqlops", "Attach to Search Process" ] + }, + { + "name": "Renderer and Extension Host processes", + "configurations": [ + "Launch SQL Ops", + "Attach to Extension Host" + ] } ] } \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json index 1c028192b3..f2fd56dc49 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -39,5 +39,10 @@ } ], "typescript.tsdk": "node_modules/typescript/lib", - "git.ignoreLimitWarning": true + "npm.exclude": "**/extensions/**", + "git.ignoreLimitWarning": true, + "emmet.excludeLanguages": [], + "typescript.preferences.importModuleSpecifier": "non-relative", + "typescript.preferences.quoteStyle": "single" + } diff --git a/.yarnrc b/.yarnrc index 476597b2d2..58d37cc88f 100644 --- a/.yarnrc +++ b/.yarnrc @@ -1,3 +1,3 @@ disturl "https://atom.io/download/electron" -target "1.7.16" +target "2.0.7" runtime "electron" diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 580378bafe..9d7d569d7f 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -5,9 +5,9 @@ First, please do a search in [open issues](https://github.com/Microsoft/sqlopsst If you find your issue already exists, make relevant comments and add your [reaction](https://github.com/blog/2119-add-reactions-to-pull-requests-issues-and-comments). Use a reaction in place of a "+1" comment. -👍 - upvote +� - upvote -👎 - downvote +� - downvote If you cannot find an existing issue that describes your bug or feature, submit an issue using the guidelines below. diff --git a/OSSREADME.json b/OSSREADME.json index 518965880e..2a84b28114 100644 --- a/OSSREADME.json +++ b/OSSREADME.json @@ -62,7 +62,7 @@ }, { "name": "chromium", - "version": "58.0.3029.110", + "version": "61.0.3163.100", "repositoryURL": "http://www.chromium.org/Home", "licenseDetail": [ "BSD License", @@ -98,20 +98,20 @@ }, { "name": "libchromiumcontent", - "version": "58.0.3029.110", + "version": "61.0.3163.100", "license": "MIT", "repositoryURL": "https://github.com/electron/libchromiumcontent", "isProd": true }, { "name": "nodejs", - "version": "7.9.0", + "version": "8.9.3", "repositoryURL": "https://github.com/nodejs/node", "isProd": true }, { "name": "electron", - "version": "1.7.3", + "version": "2.0.5", "license": "MIT", "repositoryURL": "https://github.com/electron/electron", "isProd": true @@ -1192,5 +1192,560 @@ " This Source Code Form is \"Incompatible With Secondary Licenses\", as", " defined by the Mozilla Public License, v. 2.0." ] +}, +{ + "name": "mdn-data", + "version": "1.1.12", + "repositoryURL": "https://github.com/mdn/data", + "license": "MPL", + "licenseDetail": [ + "Mozilla Public License Version 2.0", + "", + "Copyright (c) 2018 Mozilla Corporation", + "", + "==================================", + "", + "1. Definitions", + "--------------", + "", + "1.1. \"Contributor\"", + " means each individual or legal entity that creates, contributes to", + " the creation of, or owns Covered Software.", + "", + "1.2. \"Contributor Version\"", + " means the combination of the Contributions of others (if any) used", + " by a Contributor and that particular Contributor's Contribution.", + "", + "1.3. \"Contribution\"", + " means Covered Software of a particular Contributor.", + "", + "1.4. \"Covered Software\"", + " means Source Code Form to which the initial Contributor has attached", + " the notice in Exhibit A, the Executable Form of such Source Code", + " Form, and Modifications of such Source Code Form, in each case", + " including portions thereof.", + "", + "1.5. \"Incompatible With Secondary Licenses\"", + " means", + "", + " (a) that the initial Contributor has attached the notice described", + " in Exhibit B to the Covered Software; or", + "", + " (b) that the Covered Software was made available under the terms of", + " version 1.1 or earlier of the License, but not also under the", + " terms of a Secondary License.", + "", + "1.6. \"Executable Form\"", + " means any form of the work other than Source Code Form.", + "", + "1.7. \"Larger Work\"", + " means a work that combines Covered Software with other material, in", + " a separate file or files, that is not Covered Software.", + "", + "1.8. \"License\"", + " means this document.", + "", + "1.9. \"Licensable\"", + " means having the right to grant, to the maximum extent possible,", + " whether at the time of the initial grant or subsequently, any and", + " all of the rights conveyed by this License.", + "", + "1.10. \"Modifications\"", + " means any of the following:", + "", + " (a) any file in Source Code Form that results from an addition to,", + " deletion from, or modification of the contents of Covered", + " Software; or", + "", + " (b) any new file in Source Code Form that contains any Covered", + " Software.", + "", + "1.11. \"Patent Claims\" of a Contributor", + " means any patent claim(s), including without limitation, method,", + " process, and apparatus claims, in any patent Licensable by such", + " Contributor that would be infringed, but for the grant of the", + " License, by the making, using, selling, offering for sale, having", + " made, import, or transfer of either its Contributions or its", + " Contributor Version.", + "", + "1.12. \"Secondary License\"", + " means either the GNU General Public License, Version 2.0, the GNU", + " Lesser General Public License, Version 2.1, the GNU Affero General", + " Public License, Version 3.0, or any later versions of those", + " licenses.", + "", + "1.13. \"Source Code Form\"", + " means the form of the work preferred for making modifications.", + "", + "1.14. \"You\" (or \"Your\")", + " means an individual or a legal entity exercising rights under this", + " License. For legal entities, \"You\" includes any entity that", + " controls, is controlled by, or is under common control with You. For", + " purposes of this definition, \"control\" means (a) the power, direct", + " or indirect, to cause the direction or management of such entity,", + " whether by contract or otherwise, or (b) ownership of more than", + " fifty percent (50%) of the outstanding shares or beneficial", + " ownership of such entity.", + "", + "2. License Grants and Conditions", + "--------------------------------", + "", + "2.1. Grants", + "", + "Each Contributor hereby grants You a world-wide, royalty-free,", + "non-exclusive license:", + "", + "(a) under intellectual property rights (other than patent or trademark)", + " Licensable by such Contributor to use, reproduce, make available,", + " modify, display, perform, distribute, and otherwise exploit its", + " Contributions, either on an unmodified basis, with Modifications, or", + " as part of a Larger Work; and", + "", + "(b) under Patent Claims of such Contributor to make, use, sell, offer", + " for sale, have made, import, and otherwise transfer either its", + " Contributions or its Contributor Version.", + "", + "2.2. Effective Date", + "", + "The licenses granted in Section 2.1 with respect to any Contribution", + "become effective for each Contribution on the date the Contributor first", + "distributes such Contribution.", + "", + "2.3. Limitations on Grant Scope", + "", + "The licenses granted in this Section 2 are the only rights granted under", + "this License. No additional rights or licenses will be implied from the", + "distribution or licensing of Covered Software under this License.", + "Notwithstanding Section 2.1(b) above, no patent license is granted by a", + "Contributor:", + "", + "(a) for any code that a Contributor has removed from Covered Software;", + " or", + "", + "(b) for infringements caused by: (i) Your and any other third party's", + " modifications of Covered Software, or (ii) the combination of its", + " Contributions with other software (except as part of its Contributor", + " Version); or", + "", + "(c) under Patent Claims infringed by Covered Software in the absence of", + " its Contributions.", + "", + "This License does not grant any rights in the trademarks, service marks,", + "or logos of any Contributor (except as may be necessary to comply with", + "the notice requirements in Section 3.4).", + "", + "2.4. Subsequent Licenses", + "", + "No Contributor makes additional grants as a result of Your choice to", + "distribute the Covered Software under a subsequent version of this", + "License (see Section 10.2) or under the terms of a Secondary License (if", + "permitted under the terms of Section 3.3).", + "", + "2.5. Representation", + "", + "Each Contributor represents that the Contributor believes its", + "Contributions are its original creation(s) or it has sufficient rights", + "to grant the rights to its Contributions conveyed by this License.", + "", + "2.6. Fair Use", + "", + "This License is not intended to limit any rights You have under", + "applicable copyright doctrines of fair use, fair dealing, or other", + "equivalents.", + "", + "2.7. Conditions", + "", + "Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted", + "in Section 2.1.", + "", + "3. Responsibilities", + "-------------------", + "", + "3.1. Distribution of Source Form", + "", + "All distribution of Covered Software in Source Code Form, including any", + "Modifications that You create or to which You contribute, must be under", + "the terms of this License. You must inform recipients that the Source", + "Code Form of the Covered Software is governed by the terms of this", + "License, and how they can obtain a copy of this License. You may not", + "attempt to alter or restrict the recipients' rights in the Source Code", + "Form.", + "", + "3.2. Distribution of Executable Form", + "", + "If You distribute Covered Software in Executable Form then:", + "", + "(a) such Covered Software must also be made available in Source Code", + " Form, as described in Section 3.1, and You must inform recipients of", + " the Executable Form how they can obtain a copy of such Source Code", + " Form by reasonable means in a timely manner, at a charge no more", + " than the cost of distribution to the recipient; and", + "", + "(b) You may distribute such Executable Form under the terms of this", + " License, or sublicense it under different terms, provided that the", + " license for the Executable Form does not attempt to limit or alter", + " the recipients' rights in the Source Code Form under this License.", + "", + "3.3. Distribution of a Larger Work", + "", + "You may create and distribute a Larger Work under terms of Your choice,", + "provided that You also comply with the requirements of this License for", + "the Covered Software. If the Larger Work is a combination of Covered", + "Software with a work governed by one or more Secondary Licenses, and the", + "Covered Software is not Incompatible With Secondary Licenses, this", + "License permits You to additionally distribute such Covered Software", + "under the terms of such Secondary License(s), so that the recipient of", + "the Larger Work may, at their option, further distribute the Covered", + "Software under the terms of either this License or such Secondary", + "License(s).", + "", + "3.4. Notices", + "", + "You may not remove or alter the substance of any license notices", + "(including copyright notices, patent notices, disclaimers of warranty,", + "or limitations of liability) contained within the Source Code Form of", + "the Covered Software, except that You may alter any license notices to", + "the extent required to remedy known factual inaccuracies.", + "", + "3.5. Application of Additional Terms", + "", + "You may choose to offer, and to charge a fee for, warranty, support,", + "indemnity or liability obligations to one or more recipients of Covered", + "Software. However, You may do so only on Your own behalf, and not on", + "behalf of any Contributor. You must make it absolutely clear that any", + "such warranty, support, indemnity, or liability obligation is offered by", + "You alone, and You hereby agree to indemnify every Contributor for any", + "liability incurred by such Contributor as a result of warranty, support,", + "indemnity or liability terms You offer. You may include additional", + "disclaimers of warranty and limitations of liability specific to any", + "jurisdiction.", + "", + "4. Inability to Comply Due to Statute or Regulation", + "---------------------------------------------------", + "", + "If it is impossible for You to comply with any of the terms of this", + "License with respect to some or all of the Covered Software due to", + "statute, judicial order, or regulation then You must: (a) comply with", + "the terms of this License to the maximum extent possible; and (b)", + "describe the limitations and the code they affect. Such description must", + "be placed in a text file included with all distributions of the Covered", + "Software under this License. Except to the extent prohibited by statute", + "or regulation, such description must be sufficiently detailed for a", + "recipient of ordinary skill to be able to understand it.", + "", + "5. Termination", + "--------------", + "", + "5.1. The rights granted under this License will terminate automatically", + "if You fail to comply with any of its terms. However, if You become", + "compliant, then the rights granted under this License from a particular", + "Contributor are reinstated (a) provisionally, unless and until such", + "Contributor explicitly and finally terminates Your grants, and (b) on an", + "ongoing basis, if such Contributor fails to notify You of the", + "non-compliance by some reasonable means prior to 60 days after You have", + "come back into compliance. Moreover, Your grants from a particular", + "Contributor are reinstated on an ongoing basis if such Contributor", + "notifies You of the non-compliance by some reasonable means, this is the", + "first time You have received notice of non-compliance with this License", + "from such Contributor, and You become compliant prior to 30 days after", + "Your receipt of the notice.", + "", + "5.2. If You initiate litigation against any entity by asserting a patent", + "infringement claim (excluding declaratory judgment actions,", + "counter-claims, and cross-claims) alleging that a Contributor Version", + "directly or indirectly infringes any patent, then the rights granted to", + "You by any and all Contributors for the Covered Software under Section", + "2.1 of this License shall terminate.", + "", + "5.3. In the event of termination under Sections 5.1 or 5.2 above, all", + "end user license agreements (excluding distributors and resellers) which", + "have been validly granted by You or Your distributors under this License", + "prior to termination shall survive termination.", + "", + "************************************************************************", + "* *", + "* 6. Disclaimer of Warranty *", + "* ------------------------- *", + "* *", + "* Covered Software is provided under this License on an \"as is\" *", + "* basis, without warranty of any kind, either expressed, implied, or *", + "* statutory, including, without limitation, warranties that the *", + "* Covered Software is free of defects, merchantable, fit for a *", + "* particular purpose or non-infringing. The entire risk as to the *", + "* quality and performance of the Covered Software is with You. *", + "* Should any Covered Software prove defective in any respect, You *", + "* (not any Contributor) assume the cost of any necessary servicing, *", + "* repair, or correction. This disclaimer of warranty constitutes an *", + "* essential part of this License. No use of any Covered Software is *", + "* authorized under this License except under this disclaimer. *", + "* *", + "************************************************************************", + "", + "************************************************************************", + "* *", + "* 7. Limitation of Liability *", + "* -------------------------- *", + "* *", + "* Under no circumstances and under no legal theory, whether tort *", + "* (including negligence), contract, or otherwise, shall any *", + "* Contributor, or anyone who distributes Covered Software as *", + "* permitted above, be liable to You for any direct, indirect, *", + "* special, incidental, or consequential damages of any character *", + "* including, without limitation, damages for lost profits, loss of *", + "* goodwill, work stoppage, computer failure or malfunction, or any *", + "* and all other commercial damages or losses, even if such party *", + "* shall have been informed of the possibility of such damages. This *", + "* limitation of liability shall not apply to liability for death or *", + "* personal injury resulting from such party's negligence to the *", + "* extent applicable law prohibits such limitation. Some *", + "* jurisdictions do not allow the exclusion or limitation of *", + "* incidental or consequential damages, so this exclusion and *", + "* limitation may not apply to You. *", + "* *", + "************************************************************************", + "", + "8. Litigation", + "-------------", + "", + "Any litigation relating to this License may be brought only in the", + "courts of a jurisdiction where the defendant maintains its principal", + "place of business and such litigation shall be governed by laws of that", + "jurisdiction, without reference to its conflict-of-law provisions.", + "Nothing in this Section shall prevent a party's ability to bring", + "cross-claims or counter-claims.", + "", + "9. Miscellaneous", + "----------------", + "", + "This License represents the complete agreement concerning the subject", + "matter hereof. If any provision of this License is held to be", + "unenforceable, such provision shall be reformed only to the extent", + "necessary to make it enforceable. Any law or regulation which provides", + "that the language of a contract shall be construed against the drafter", + "shall not be used to construe this License against a Contributor.", + "", + "10. Versions of the License", + "---------------------------", + "", + "10.1. New Versions", + "", + "Mozilla Foundation is the license steward. Except as provided in Section", + "10.3, no one other than the license steward has the right to modify or", + "publish new versions of this License. Each version will be given a", + "distinguishing version number.", + "", + "10.2. Effect of New Versions", + "", + "You may distribute the Covered Software under the terms of the version", + "of the License under which You originally received the Covered Software,", + "or under the terms of any subsequent version published by the license", + "steward.", + "", + "10.3. Modified Versions", + "", + "If you create software not governed by this License, and you want to", + "create a new license for such software, you may create and use a", + "modified version of this License if you rename the license and remove", + "any references to the name of the license steward (except to note that", + "such modified license differs from this License).", + "", + "10.4. Distributing Source Code Form that is Incompatible With Secondary", + "Licenses", + "", + "If You choose to distribute Source Code Form that is Incompatible With", + "Secondary Licenses under the terms of this version of the License, the", + "notice described in Exhibit B of this License must be attached.", + "", + "Exhibit A - Source Code Form License Notice", + "-------------------------------------------", + "", + " This Source Code Form is subject to the terms of the Mozilla Public", + " License, v. 2.0. If a copy of the MPL was not distributed with this", + " file, You can obtain one at http://mozilla.org/MPL/2.0/.", + "", + "If it is not possible or desirable to put the notice in a particular", + "file, then You may include the notice in a location (such as a LICENSE", + "file in a relevant directory) where a recipient would be likely to look", + "for such a notice.", + "", + "You may add additional accurate notices of copyright ownership.", + "", + "Exhibit B - \"Incompatible With Secondary Licenses\" Notice", + "---------------------------------------------------------", + "", + " This Source Code Form is \"Incompatible With Secondary Licenses\", as", + " defined by the Mozilla Public License, v. 2.0." + ] +}, +{ + "isLicense": true, + "name": "devtools-protocol", + "licenseDetail": [ + " Copyright 2015 The Chromium Authors. All rights reserved.", + "", + " Redistribution and use in source and binary forms, with or without", + " modification, are permitted provided that the following conditions are", + " met:", + "", + " * Redistributions of source code must retain the above copyright", + " notice, this list of conditions and the following disclaimer.", + " * Redistributions in binary form must reproduce the above", + " copyright notice, this list of conditions and the following disclaimer", + " in the documentation and/or other materials provided with the", + " distribution.", + " * Neither the name of Google Inc. nor the names of its", + " contributors may be used to endorse or promote products derived from", + " this software without specific prior written permission.", + "", + " THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS", + " \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT", + " LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR", + " A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT", + " OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,", + " SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT", + " LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,", + " DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY", + " THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT", + " (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE", + " OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." + ] +}, +{ + "isLicense": true, + "name": "buffer-alloc", + "licenseDetail": [ + "This project is licensed under the MIT license.", + "Copyrights are respective of each contributor listed at the beginning of each definition file.", + "", + "Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:", + "", + "The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.", + "", + "THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE." + ] +}, +{ + "isLicense": true, + "name": "expand-template", + "licenseDetail": [ + " DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE", + " Version 2, December 2004", + "", + " Copyright (C) 2004 Sam Hocevar ", + "", + " Everyone is permitted to copy and distribute verbatim or modified", + " copies of this license document, and changing it is allowed as long", + " as the name is changed.", + "", + " DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE", + " TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION", + "", + " 0. You just DO WHAT THE FUCK YOU WANT TO." + ] +}, +{ + "isLicense": true, + "name": "tunnel-agent", + "licenseDetail": [ + "Copyright (c) tunnel-agent authors", + "", + "Apache License", + "", + "Version 2.0, January 2004", + "", + "http://www.apache.org/licenses/", + "", + "TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION", + "", + "1. Definitions.", + "", + "\"License\" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.", + "", + "\"Licensor\" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.", + "", + "\"Legal Entity\" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, \"control\" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.", + "", + "\"You\" (or \"Your\") shall mean an individual or Legal Entity exercising permissions granted by this License.", + "", + "\"Source\" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.", + "", + "\"Object\" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.", + "", + "\"Work\" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).", + "", + "\"Derivative Works\" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.", + "", + "\"Contribution\" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, \"submitted\" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as \"Not a Contribution.\"", + "", + "\"Contributor\" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.", + "", + "2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.", + "", + "3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.", + "", + "4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:", + "", + "You must give any other recipients of the Work or Derivative Works a copy of this License; and", + "", + "You must cause any modified files to carry prominent notices stating that You changed the files; and", + "", + "You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and", + "", + "If the Work includes a \"NOTICE\" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.", + "", + "5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.", + "", + "6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.", + "", + "7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.", + "", + "8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.", + "", + "9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability.", + "", + "END OF TERMS AND CONDITIONS" + ] +}, +{ + "isLicense": true, + "name": "noop-logger", + "licenseDetail": [ + "This project is licensed under the MIT license.", + "Copyrights are respective of each contributor listed at the beginning of each definition file.", + "", + "Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:", + "", + "The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.", + "", + "THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE." + ] +}, +{ + "isLicense": true, + "name": "buffer-alloc-unsafe", + "licenseDetail": [ + "This project is licensed under the MIT license.", + "Copyrights are respective of each contributor listed at the beginning of each definition file.", + "", + "Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:", + "", + "The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.", + "", + "THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE." + ] +}, +{ + "isLicense": true, + "name": "buffer-fill", + "licenseDetail": [ + "This project is licensed under the MIT license.", + "Copyrights are respective of each contributor listed at the beginning of each definition file.", + "", + "Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:", + "", + "The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.", + "", + "THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE." + ] } ] diff --git a/ThirdPartyNotices.txt b/ThirdPartyNotices.txt index 6798c67a2f..a9c3981bdf 100644 --- a/ThirdPartyNotices.txt +++ b/ThirdPartyNotices.txt @@ -2039,4 +2039,4 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ========================================= -END OF zone.js NOTICES AND INFORMATION \ No newline at end of file +END OF zone.js NOTICES AND INFORMATION diff --git a/build/builtInExtensions.json b/build/builtInExtensions.json index 0c7ae4ea8a..e607dada4f 100644 --- a/build/builtInExtensions.json +++ b/build/builtInExtensions.json @@ -1,12 +1,12 @@ [ { "name": "ms-vscode.node-debug", - "version": "1.23.3", + "version": "1.26.7", "repo": "https://github.com/Microsoft/vscode-node-debug" }, { "name": "ms-vscode.node-debug2", - "version": "1.23.5", + "version": "1.26.8", "repo": "https://github.com/Microsoft/vscode-node-debug2" } ] diff --git a/build/gulpfile.editor.js b/build/gulpfile.editor.js index e6f95e5a91..cb2994ead6 100644 --- a/build/gulpfile.editor.js +++ b/build/gulpfile.editor.js @@ -12,10 +12,12 @@ const File = require('vinyl'); const i18n = require('./lib/i18n'); const standalone = require('./lib/standalone'); const cp = require('child_process'); +const compilation = require('./lib/compilation'); +const monacoapi = require('./monaco/api'); +const fs = require('fs'); var root = path.dirname(__dirname); var sha1 = util.getVersion(root); -// @ts-ignore Microsoft/TypeScript#21262 complains about a require of a JSON file var semver = require('./monaco/package.json').version; var headerVersion = semver + '(' + sha1 + ')'; @@ -59,29 +61,56 @@ var BUNDLED_FILE_HEADER = [ '' ].join('\n'); -function editorLoaderConfig() { - var result = common.loaderConfig(); - - // never ship octicons in editor - result.paths['vs/base/browser/ui/octiconLabel/octiconLabel'] = 'out-build/vs/base/browser/ui/octiconLabel/octiconLabel.mock'; - - // force css inlining to use base64 -- see https://github.com/Microsoft/monaco-editor/issues/148 - result['vs/css'] = { - inlineResources: 'base64', - inlineResourcesLimit: 3000 // see https://github.com/Microsoft/monaco-editor/issues/336 - }; - - return result; -} - const languages = i18n.defaultLanguages.concat([]); // i18n.defaultLanguages.concat(process.env.VSCODE_QUALITY !== 'stable' ? i18n.extraLanguages : []); +gulp.task('clean-editor-src', util.rimraf('out-editor-src')); +gulp.task('extract-editor-src', ['clean-editor-src'], function () { + console.log(`If the build fails, consider tweaking shakeLevel below to a lower value.`); + const apiusages = monacoapi.execute().usageContent; + const extrausages = fs.readFileSync(path.join(root, 'build', 'monaco', 'monaco.usage.recipe')).toString(); + standalone.extractEditor({ + sourcesRoot: path.join(root, 'src'), + entryPoints: [ + 'vs/editor/editor.main', + 'vs/editor/editor.worker', + 'vs/base/worker/workerMain', + ], + inlineEntryPoints: [ + apiusages, + extrausages + ], + libs: [ + `lib.d.ts`, + `lib.es2015.collection.d.ts` + ], + redirects: { + 'vs/base/browser/ui/octiconLabel/octiconLabel': 'vs/base/browser/ui/octiconLabel/octiconLabel.mock', + }, + compilerOptions: { + module: 2, // ModuleKind.AMD + }, + shakeLevel: 2, // 0-Files, 1-InnerFile, 2-ClassMembers + importIgnorePattern: /^vs\/css!/, + destRoot: path.join(root, 'out-editor-src') + }); +}); + +// Full compile, including nls and inline sources in sourcemaps, for build +gulp.task('clean-editor-build', util.rimraf('out-editor-build')); +gulp.task('compile-editor-build', ['clean-editor-build', 'extract-editor-src'], compilation.compileTask('out-editor-src', 'out-editor-build', true)); + gulp.task('clean-optimized-editor', util.rimraf('out-editor')); -gulp.task('optimize-editor', ['clean-optimized-editor', 'compile-client-build'], common.optimizeTask({ +gulp.task('optimize-editor', ['clean-optimized-editor', 'compile-editor-build'], common.optimizeTask({ + src: 'out-editor-build', entryPoints: editorEntryPoints, otherSources: editorOtherSources, resources: editorResources, - loaderConfig: editorLoaderConfig(), + loaderConfig: { + paths: { + 'vs': 'out-editor-build/vs', + 'vscode': 'empty:' + } + }, bundleLoader: false, header: BUNDLED_FILE_HEADER, bundleInfo: true, @@ -114,6 +143,41 @@ gulp.task('compile-editor-esm', ['extract-editor-esm', 'clean-editor-distro'], f console.log(result.stdout.toString()); }); +function toExternalDTS(contents) { + let lines = contents.split('\n'); + let killNextCloseCurlyBrace = false; + for (let i = 0; i < lines.length; i++) { + let line = lines[i]; + + if (killNextCloseCurlyBrace) { + if ('}' === line) { + lines[i] = ''; + killNextCloseCurlyBrace = false; + continue; + } + + if (line.indexOf(' ') === 0) { + lines[i] = line.substr(4); + } else if (line.charAt(0) === '\t') { + lines[i] = line.substr(1); + } + + continue; + } + + if ('declare namespace monaco {' === line) { + lines[i] = ''; + killNextCloseCurlyBrace = true; + continue; + } + + if (line.indexOf('declare namespace monaco.') === 0) { + lines[i] = line.replace('declare namespace monaco.', 'export namespace '); + } + } + return lines.join('\n'); +} + gulp.task('clean-editor-distro', util.rimraf('out-monaco-editor-core')); gulp.task('editor-distro', ['clean-editor-distro', 'compile-editor-esm', 'minify-editor', 'optimize-editor'], function () { return es.merge( @@ -130,7 +194,7 @@ gulp.task('editor-distro', ['clean-editor-distro', 'compile-editor-esm', 'minify this.emit('data', new File({ path: data.path.replace(/monaco\.d\.ts/, 'editor.api.d.ts'), base: data.base, - contents: data.contents + contents: new Buffer(toExternalDTS(data.contents.toString())) })); })) .pipe(gulp.dest('out-monaco-editor-core/esm/vs/editor')), @@ -195,7 +259,7 @@ gulp.task('editor-distro', ['clean-editor-distro', 'compile-editor-esm', 'minify }); gulp.task('analyze-editor-distro', function () { - // @ts-ignore Microsoft/TypeScript#21262 complains about a require of a JSON file + // @ts-ignore var bundleInfo = require('../out-editor/bundleInfo.json'); var graph = bundleInfo.graph; var bundles = bundleInfo.bundles; diff --git a/build/gulpfile.extensions.js b/build/gulpfile.extensions.js index 5ac30c8197..6e0ae29227 100644 --- a/build/gulpfile.extensions.js +++ b/build/gulpfile.extensions.js @@ -20,7 +20,6 @@ const sourcemaps = require('gulp-sourcemaps'); const nlsDev = require('vscode-nls-dev'); const root = path.dirname(__dirname); const commit = util.getVersion(root); -const i18n = require('./lib/i18n'); const plumber = require('gulp-plumber'); const extensionsPath = path.join(path.dirname(__dirname), 'extensions'); @@ -32,8 +31,6 @@ const compilations = glob.sync('**/tsconfig.json', { const getBaseUrl = out => `https://ticino.blob.core.windows.net/sourcemaps/${commit}/${out}`; -const languages = i18n.defaultLanguages.concat(process.env.VSCODE_QUALITY !== 'stable' ? i18n.extraLanguages : []); - const tasks = compilations.map(function (tsconfigFile) { const absolutePath = path.join(extensionsPath, tsconfigFile); const relativeDirname = path.dirname(tsconfigFile); @@ -58,7 +55,6 @@ const tasks = compilations.map(function (tsconfigFile) { const srcBase = path.join(root, 'src'); const src = path.join(srcBase, '**'); const out = path.join(root, 'out'); - const i18nPath = path.join(__dirname, '..', 'i18n'); const baseUrl = getBaseUrl(out); let headerId, headerOut; @@ -102,9 +98,9 @@ const tasks = compilations.map(function (tsconfigFile) { sourceRoot: '../src' })) .pipe(tsFilter.restore) - .pipe(build ? nlsDev.createAdditionalLanguageFiles(languages, i18nPath, out) : es.through()) .pipe(build ? nlsDev.bundleMetaDataFiles(headerId, headerOut) : es.through()) - .pipe(build ? nlsDev.bundleLanguageFiles() : es.through()) + // Filter out *.nls.json file. We needed them only to bundle meta data file. + .pipe(filter(['**', '!**/*.nls.json'])) .pipe(reporter.end(emitError)); return es.duplex(input, output); diff --git a/build/gulpfile.hygiene.js b/build/gulpfile.hygiene.js index 2e74c0a1c9..c65935654a 100644 --- a/build/gulpfile.hygiene.js +++ b/build/gulpfile.hygiene.js @@ -49,6 +49,7 @@ const indentationFilter = [ '!src/vs/base/common/marked/marked.js', '!src/vs/base/common/winjs.base.js', '!src/vs/base/node/terminateProcess.sh', + '!src/vs/base/node/cpuUsage.sh', '!test/assert.js', // except specific folders @@ -81,8 +82,9 @@ const indentationFilter = [ '!build/{lib,tslintRules}/**/*.js', '!build/**/*.sh', '!build/tfs/**/*.js', + '!build/tfs/**/*.config', '!**/Dockerfile', - '!extensions/markdown/media/*.js' + '!extensions/markdown-language-features/media/*.js' ]; const copyrightFilter = [ @@ -103,8 +105,9 @@ const copyrightFilter = [ '!**/*.code-workspace', '!build/**/*.init', '!resources/linux/snap/snapcraft.yaml', + '!resources/linux/snap/electron-launch', '!resources/win32/bin/code.js', - '!extensions/markdown-language-features/media/tomorrow.css', + '!extensions/markdown-language-features/media/highlight.css', '!extensions/html-language-features/server/src/modes/typescript/*', '!extensions/*/server/bin/*' ]; @@ -136,6 +139,7 @@ const tslintFilter = [ '!extensions/html-language-features/server/lib/jquery.d.ts' ]; +// {{SQL CARBON EDIT}} const copyrightHeaderLines = [ '/*---------------------------------------------------------------------------------------------', ' * Copyright (c) Microsoft Corporation. All rights reserved.', diff --git a/build/gulpfile.mixin.js b/build/gulpfile.mixin.js index 1cb8f4ef71..99dc33c98a 100644 --- a/build/gulpfile.mixin.js +++ b/build/gulpfile.mixin.js @@ -18,7 +18,6 @@ const assign = require('object-assign'); // {{SQL CARBON EDIT}} const jeditor = require('gulp-json-editor'); -// @ts-ignore Microsoft/TypeScript#21262 complains about a require of a JSON file const pkg = require('../package.json'); gulp.task('mixin', function () { @@ -52,4 +51,4 @@ gulp.task('mixin', function () { return gulp.src('./product.json') .pipe(jeditor(newValues)) .pipe(gulp.dest('.')); -}); \ No newline at end of file +}); diff --git a/build/gulpfile.vscode.js b/build/gulpfile.vscode.js index 9288b50b70..ef754bdc2c 100644 --- a/build/gulpfile.vscode.js +++ b/build/gulpfile.vscode.js @@ -17,19 +17,15 @@ const vfs = require('vinyl-fs'); const rename = require('gulp-rename'); const replace = require('gulp-replace'); const filter = require('gulp-filter'); -const buffer = require('gulp-buffer'); const json = require('gulp-json-editor'); const _ = require('underscore'); const util = require('./lib/util'); const ext = require('./lib/extensions'); const buildfile = require('../src/buildfile'); const common = require('./lib/optimize'); -const nlsDev = require('vscode-nls-dev'); const root = path.dirname(__dirname); const commit = util.getVersion(root); -// @ts-ignore Microsoft/TypeScript#21262 complains about a require of a JSON file const packageJson = require('../package.json'); -// @ts-ignore Microsoft/TypeScript#21262 complains about a require of a JSON file const product = require('../product.json'); const crypto = require('crypto'); const i18n = require('./lib/i18n'); @@ -62,7 +58,6 @@ const nodeModules = [ // Build -// @ts-ignore Microsoft/TypeScript#21262 complains about a require of a JSON file const builtInExtensions = require('./builtInExtensions.json'); const excludedExtensions = [ @@ -98,7 +93,7 @@ const vscodeResources = [ 'out-build/paths.js', 'out-build/vs/**/*.{svg,png,cur,html}', 'out-build/vs/base/common/performance.js', - 'out-build/vs/base/node/{stdForkStart.js,terminateProcess.sh}', + 'out-build/vs/base/node/{stdForkStart.js,terminateProcess.sh,cpuUsage.sh}', 'out-build/vs/base/browser/ui/octiconLabel/octicons/**', 'out-build/vs/workbench/browser/media/*-theme.css', 'out-build/vs/workbench/electron-browser/bootstrap/**', @@ -107,7 +102,6 @@ const vscodeResources = [ 'out-build/vs/workbench/parts/webview/electron-browser/webview-pre.js', 'out-build/vs/**/markdown.css', 'out-build/vs/workbench/parts/tasks/**/*.json', - 'out-build/vs/workbench/parts/terminal/electron-browser/terminalProcess.js', 'out-build/vs/workbench/parts/welcome/walkThrough/**/*.md', 'out-build/vs/workbench/services/files/**/*.exe', 'out-build/vs/workbench/services/files/**/*.md', @@ -143,17 +137,15 @@ const BUNDLED_FILE_HEADER = [ ' *--------------------------------------------------------*/' ].join('\n'); -const languages = i18n.defaultLanguages.concat([]); // i18n.defaultLanguages.concat(process.env.VSCODE_QUALITY !== 'stable' ? i18n.extraLanguages : []); - gulp.task('clean-optimized-vscode', util.rimraf('out-vscode')); gulp.task('optimize-vscode', ['clean-optimized-vscode', 'compile-build', 'compile-extensions-build'], common.optimizeTask({ + src: 'out-build', entryPoints: vscodeEntryPoints, otherSources: [], resources: vscodeResources, loaderConfig: common.loaderConfig(nodeModules), header: BUNDLED_FILE_HEADER, out: 'out-vscode', - languages: languages, bundleInfo: undefined })); @@ -170,6 +162,8 @@ gulp.task('clean-minified-vscode', util.rimraf('out-vscode-min')); gulp.task('minify-vscode', ['clean-minified-vscode', 'optimize-index-js'], common.minifyTask('out-vscode', baseUrl)); // Package + +// @ts-ignore JSON checking: darwinCredits is optional const darwinCreditsTemplate = product.darwinCredits && _.template(fs.readFileSync(path.join(root, product.darwinCredits), 'utf8')); const config = { @@ -199,6 +193,8 @@ const config = { linuxExecutableName: product.applicationName, winIcon: 'resources/win32/code.ico', token: process.env['VSCODE_MIXIN_PASSWORD'] || process.env['GITHUB_TOKEN'] || void 0, + + // @ts-ignore JSON checking: electronRepository is optional repo: product.electronRepository || void 0 }; @@ -315,15 +311,8 @@ function packageTask(platform, arch, opts) { packageBuiltInExtensions(); const localExtensions = es.merge(...localExtensionDescriptions.map(extension => { - const nlsFilter = filter('**/*.nls.json', { restore: true }); - return ext.fromLocal(extension.path) - .pipe(rename(p => p.dirname = `extensions/${extension.name}/${p.dirname}`)) - // // TODO@Dirk: this filter / buffer is here to make sure the nls.json files are buffered - .pipe(nlsFilter) - .pipe(buffer()) - .pipe(nlsDev.createAdditionalLanguageFiles(languages, path.join(__dirname, '..', 'i18n'))) - .pipe(nlsFilter.restore); + .pipe(rename(p => p.dirname = `extensions/${extension.name}/${p.dirname}`)); })); // {{SQL CARBON EDIT}} @@ -342,6 +331,7 @@ function packageTask(platform, arch, opts) { .pipe(filter(['**', '!**/*.js.map'])); let version = packageJson.version; + // @ts-ignore JSON checking: quality is optional const quality = product.quality; if (quality && quality !== 'stable') { @@ -352,10 +342,15 @@ function packageTask(platform, arch, opts) { const packageJsonStream = gulp.src(['package.json'], { base: '.' }) .pipe(json({ name, version })); - const settingsSearchBuildId = getSettingsSearchBuildId(packageJson); const date = new Date().toISOString(); + const productJsonUpdate = { commit, date, checksums }; + + if (shouldSetupSettingsSearch()) { + productJsonUpdate.settingsSearchBuildId = getSettingsSearchBuildId(packageJson); + } + const productJsonStream = gulp.src(['product.json'], { base: '.' }) - .pipe(json({ commit, date, checksums, settingsSearchBuildId })); + .pipe(json(productJsonUpdate)); const license = gulp.src(['LICENSES.chromium.html', 'LICENSE.txt', 'ThirdPartyNotices.txt', 'licenses/**'], { base: '.' }); @@ -368,6 +363,7 @@ function packageTask(platform, arch, opts) { const depsSrc = [ ..._.flatten(productionDependencies.map(d => path.relative(root, d.path)).map(d => [`${d}/**`, `!${d}/**/{test,tests}/**`])), + // @ts-ignore JSON checking: dependencies is optional ..._.flatten(Object.keys(product.dependencies || {}).map(d => [`node_modules/${d}/**`, `!node_modules/${d}/**/{test,tests}/**`])) ]; @@ -578,9 +574,8 @@ gulp.task('upload-vscode-sourcemaps', ['minify-vscode'], () => { const allConfigDetailsPath = path.join(os.tmpdir(), 'configuration.json'); gulp.task('upload-vscode-configuration', ['generate-vscode-configuration'], () => { - const branch = process.env.BUILD_SOURCEBRANCH; - - if (!/\/master$/.test(branch) && branch.indexOf('/release/') < 0) { + if (!shouldSetupSettingsSearch()) { + const branch = process.env.BUILD_SOURCEBRANCH; console.log(`Only runs on master and release branches, not ${branch}`); return; } @@ -603,13 +598,24 @@ gulp.task('upload-vscode-configuration', ['generate-vscode-configuration'], () = })); }); -function getSettingsSearchBuildId(packageJson) { - const previous = util.getPreviousVersion(packageJson.version); +function shouldSetupSettingsSearch() { + const branch = process.env.BUILD_SOURCEBRANCH; + return branch && (/\/master$/.test(branch) || branch.indexOf('/release/') >= 0); +} +function getSettingsSearchBuildId(packageJson) { try { - const out = cp.execSync(`git rev-list ${previous}..HEAD --count`); + const branch = process.env.BUILD_SOURCEBRANCH; + const branchId = branch.indexOf('/release/') >= 0 ? 0 : + /\/master$/.test(branch) ? 1 : + 2; // Some unexpected branch + + const out = cp.execSync(`git rev-list HEAD --count`); const count = parseInt(out.toString()); - return util.versionStringToNumber(packageJson.version) * 1e4 + count; + + // + // 1.25.1, 1,234,567 commits, master = 1250112345671 + return util.versionStringToNumber(packageJson.version) * 1e8 + count * 10 + branchId; } catch (e) { throw new Error('Could not determine build number: ' + e.toString()); } @@ -623,6 +629,10 @@ gulp.task('generate-vscode-configuration', () => { return reject(new Error('$AGENT_BUILDDIRECTORY not set')); } + if (process.env.VSCODE_QUALITY !== 'insider' && process.env.VSCODE_QUALITY !== 'stable') { + return resolve(); + } + const userDataDir = path.join(os.tmpdir(), 'tmpuserdata'); const extensionsDir = path.join(os.tmpdir(), 'tmpextdir'); const appName = process.env.VSCODE_QUALITY === 'insider' ? 'Visual\\ Studio\\ Code\\ -\\ Insiders.app' : 'Visual\\ Studio\\ Code.app'; diff --git a/build/gulpfile.vscode.linux.js b/build/gulpfile.vscode.linux.js index c96f9deed0..2f5961207b 100644 --- a/build/gulpfile.vscode.linux.js +++ b/build/gulpfile.vscode.linux.js @@ -12,11 +12,8 @@ const shell = require('gulp-shell'); const es = require('event-stream'); const vfs = require('vinyl-fs'); const util = require('./lib/util'); -// @ts-ignore Microsoft/TypeScript#21262 complains about a require of a JSON file const packageJson = require('../package.json'); -// @ts-ignore Microsoft/TypeScript#21262 complains about a require of a JSON file const product = require('../product.json'); -// @ts-ignore Microsoft/TypeScript#21262 complains about a require of a JSON file const rpmDependencies = require('../resources/linux/rpm/dependencies.json'); const linuxPackageRevision = Math.floor(new Date().getTime() / 1000); @@ -76,7 +73,9 @@ function prepareDebPackage(arch) { const postinst = gulp.src('resources/linux/debian/postinst.template', { base: '.' }) .pipe(replace('@@NAME@@', product.applicationName)) .pipe(replace('@@ARCHITECTURE@@', debArch)) + // @ts-ignore JSON checking: quality is optional .pipe(replace('@@QUALITY@@', product.quality || '@@QUALITY@@')) + // @ts-ignore JSON checking: updateUrl is optional .pipe(replace('@@UPDATEURL@@', product.updateUrl || '@@UPDATEURL@@')) .pipe(rename('DEBIAN/postinst')); @@ -135,7 +134,9 @@ function prepareRpmPackage(arch) { .pipe(replace('@@RELEASE@@', linuxPackageRevision)) .pipe(replace('@@ARCHITECTURE@@', rpmArch)) .pipe(replace('@@LICENSE@@', product.licenseName)) + // @ts-ignore JSON checking: quality is optional .pipe(replace('@@QUALITY@@', product.quality || '@@QUALITY@@')) + // @ts-ignore JSON checking: updateUrl is optional .pipe(replace('@@UPDATEURL@@', product.updateUrl || '@@UPDATEURL@@')) .pipe(replace('@@DEPENDENCIES@@', rpmDependencies[rpmArch].join(', '))) .pipe(rename('SPECS/' + product.applicationName + '.spec')); diff --git a/build/gulpfile.vscode.win32.js b/build/gulpfile.vscode.win32.js index 69b83c5069..d2442abf91 100644 --- a/build/gulpfile.vscode.win32.js +++ b/build/gulpfile.vscode.win32.js @@ -7,45 +7,71 @@ const gulp = require('gulp'); const path = require('path'); +const fs = require('fs'); const assert = require('assert'); const cp = require('child_process'); const _7z = require('7zip')['7z']; const util = require('./lib/util'); -// @ts-ignore Microsoft/TypeScript#21262 complains about a require of a JSON file const pkg = require('../package.json'); -// @ts-ignore Microsoft/TypeScript#21262 complains about a require of a JSON file const product = require('../product.json'); const vfs = require('vinyl-fs'); +const mkdirp = require('mkdirp'); const repoPath = path.dirname(__dirname); // {{SQL CARBON EDIT}} const buildPath = arch => path.join(path.dirname(repoPath), `sqlops-win32-${arch}`); const zipDir = arch => path.join(repoPath, '.build', `win32-${arch}`, 'archive'); const zipPath = arch => path.join(zipDir(arch), `VSCode-win32-${arch}.zip`); -const setupDir = arch => path.join(repoPath, '.build', `win32-${arch}`, 'setup'); +const setupDir = (arch, target) => path.join(repoPath, '.build', `win32-${arch}`, `${target}-setup`); const issPath = path.join(__dirname, 'win32', 'code.iss'); const innoSetupPath = path.join(path.dirname(path.dirname(require.resolve('innosetup-compiler'))), 'bin', 'ISCC.exe'); +const signPS1 = path.join(repoPath, 'build', 'tfs', 'win32', 'sign.ps1'); function packageInnoSetup(iss, options, cb) { options = options || {}; const definitions = options.definitions || {}; + const debug = process.argv.some(arg => arg === '--debug-inno'); + + if (debug) { + definitions['Debug'] = 'true'; + } + const keys = Object.keys(definitions); keys.forEach(key => assert(typeof definitions[key] === 'string', `Missing value for '${key}' in Inno Setup package step`)); const defs = keys.map(key => `/d${key}=${definitions[key]}`); - const args = [iss].concat(defs); + const args = [ + iss, + ...defs + //, + //`/sesrp=powershell.exe -ExecutionPolicy bypass ${signPS1} $f` + ]; - cp.spawn(innoSetupPath, args, { stdio: 'inherit' }) + cp.spawn(innoSetupPath, args, { stdio: ['ignore', 'inherit', 'inherit'] }) .on('error', cb) .on('exit', () => cb(null)); } -function buildWin32Setup(arch) { +function buildWin32Setup(arch, target) { + if (target !== 'system' && target !== 'user') { + throw new Error('Invalid setup target'); + } + return cb => { - const ia32AppId = product.win32AppId; - const x64AppId = product.win32x64AppId; + const ia32AppId = target === 'system' ? product.win32AppId : product.win32UserAppId; + const x64AppId = target === 'system' ? product.win32x64AppId : product.win32x64UserAppId; + + const sourcePath = buildPath(arch); + const outputPath = setupDir(arch, target); + mkdirp.sync(outputPath); + + const originalProductJsonPath = path.join(sourcePath, 'resources/app/product.json'); + const productJsonPath = path.join(outputPath, 'product.json'); + const productJson = JSON.parse(fs.readFileSync(originalProductJsonPath, 'utf8')); + productJson['target'] = target; + fs.writeFileSync(productJsonPath, JSON.stringify(productJson, undefined, '\t')); const definitions = { NameLong: product.nameLong, @@ -53,35 +79,42 @@ function buildWin32Setup(arch) { DirName: product.win32DirName, Version: pkg.version, RawVersion: pkg.version.replace(/-\w+$/, ''), - NameVersion: product.win32NameVersion, + NameVersion: product.win32NameVersion + (target === 'user' ? ' (User)' : ''), ExeBasename: product.nameShort, RegValueName: product.win32RegValueName, ShellNameShort: product.win32ShellNameShort, AppMutex: product.win32MutexName, Arch: arch, AppId: arch === 'ia32' ? ia32AppId : x64AppId, - IncompatibleAppId: arch === 'ia32' ? x64AppId : ia32AppId, + IncompatibleTargetAppId: arch === 'ia32' ? product.win32AppId : product.win32x64AppId, + IncompatibleArchAppId: arch === 'ia32' ? x64AppId : ia32AppId, AppUserId: product.win32AppUserModelId, ArchitecturesAllowed: arch === 'ia32' ? '' : 'x64', ArchitecturesInstallIn64BitMode: arch === 'ia32' ? '' : 'x64', - SourceDir: buildPath(arch), + SourceDir: sourcePath, RepoDir: repoPath, - OutputDir: setupDir(arch) + OutputDir: outputPath, + InstallTarget: target, + ProductJsonPath: productJsonPath }; packageInnoSetup(issPath, { definitions }, cb); }; } -gulp.task('clean-vscode-win32-ia32-setup', util.rimraf(setupDir('ia32'))); -gulp.task('vscode-win32-ia32-setup', ['clean-vscode-win32-ia32-setup'], buildWin32Setup('ia32')); +function defineWin32SetupTasks(arch, target) { + gulp.task(`clean-vscode-win32-${arch}-${target}-setup`, util.rimraf(setupDir(arch, target))); + gulp.task(`vscode-win32-${arch}-${target}-setup`, [`clean-vscode-win32-${arch}-${target}-setup`], buildWin32Setup(arch, target)); +} -gulp.task('clean-vscode-win32-x64-setup', util.rimraf(setupDir('x64'))); -gulp.task('vscode-win32-x64-setup', ['clean-vscode-win32-x64-setup'], buildWin32Setup('x64')); +defineWin32SetupTasks('ia32', 'system'); +defineWin32SetupTasks('x64', 'system'); +defineWin32SetupTasks('ia32', 'user'); +defineWin32SetupTasks('x64', 'user'); function archiveWin32Setup(arch) { return cb => { - const args = ['a', '-tzip', zipPath(arch), '.', '-r']; + const args = ['a', '-tzip', zipPath(arch), '-x!CodeSignSummary*.md', '.', '-r']; cp.spawn(_7z, args, { stdio: 'inherit', cwd: buildPath(arch) }) .on('error', cb) diff --git a/build/lib/builtInExtensions.js b/build/lib/builtInExtensions.js index 1cdf72b468..173fa8e233 100644 --- a/build/lib/builtInExtensions.js +++ b/build/lib/builtInExtensions.js @@ -17,7 +17,6 @@ const ext = require('./extensions'); const util = require('gulp-util'); const root = path.dirname(path.dirname(__dirname)); -// @ts-ignore Microsoft/TypeScript#21262 complains about a require of a JSON file const builtInExtensions = require('../builtInExtensions.json'); const controlFilePath = path.join(os.homedir(), '.vscode-oss-dev', 'extensions', 'control.json'); diff --git a/build/lib/compilation.js b/build/lib/compilation.js index 6788e40961..efef2e646a 100644 --- a/build/lib/compilation.js +++ b/build/lib/compilation.js @@ -18,18 +18,21 @@ var _ = require("underscore"); var monacodts = require("../monaco/api"); var fs = require("fs"); var reporter = reporter_1.createReporter(); -var rootDir = path.join(__dirname, '../../src'); -var options = require('../../src/tsconfig.json').compilerOptions; -options.verbose = false; -options.sourceMap = true; -if (process.env['VSCODE_NO_SOURCEMAP']) { // To be used by developers in a hurry - options.sourceMap = false; +function getTypeScriptCompilerOptions(src) { + var rootDir = path.join(__dirname, "../../" + src); + var options = require("../../" + src + "/tsconfig.json").compilerOptions; + options.verbose = false; + options.sourceMap = true; + if (process.env['VSCODE_NO_SOURCEMAP']) { // To be used by developers in a hurry + options.sourceMap = false; + } + options.rootDir = rootDir; + options.sourceRoot = util.toFileUri(rootDir); + options.newLine = /\r\n/.test(fs.readFileSync(__filename, 'utf8')) ? 'CRLF' : 'LF'; + return options; } -options.rootDir = rootDir; -options.sourceRoot = util.toFileUri(rootDir); -options.newLine = /\r\n/.test(fs.readFileSync(__filename, 'utf8')) ? 'CRLF' : 'LF'; -function createCompile(build, emitError) { - var opts = _.clone(options); +function createCompile(src, build, emitError) { + var opts = _.clone(getTypeScriptCompilerOptions(src)); opts.inlineSources = !!build; opts.noFilesystemLookup = true; var ts = tsb.create(opts, null, null, function (err) { return reporter(err.toString()); }); @@ -51,31 +54,31 @@ function createCompile(build, emitError) { .pipe(sourcemaps.write('.', { addComment: false, includeContent: !!build, - sourceRoot: options.sourceRoot + sourceRoot: opts.sourceRoot })) .pipe(tsFilter.restore) .pipe(reporter.end(emitError)); return es.duplex(input, output); }; } -function compileTask(out, build) { +function compileTask(src, out, build) { return function () { - var compile = createCompile(build, true); - var src = es.merge(gulp.src('src/**', { base: 'src' }), gulp.src('node_modules/typescript/lib/lib.d.ts')); + var compile = createCompile(src, build, true); + var srcPipe = es.merge(gulp.src(src + "/**", { base: "" + src }), gulp.src('node_modules/typescript/lib/lib.d.ts')); // Do not write .d.ts files to disk, as they are not needed there. var dtsFilter = util.filter(function (data) { return !/\.d\.ts$/.test(data.path); }); - return src + return srcPipe .pipe(compile()) .pipe(dtsFilter) .pipe(gulp.dest(out)) .pipe(dtsFilter.restore) - .pipe(monacodtsTask(out, false)); + .pipe(src !== 'src' ? es.through() : monacodtsTask(out, false)); }; } exports.compileTask = compileTask; function watchTask(out, build) { return function () { - var compile = createCompile(build); + var compile = createCompile('src', build); var src = es.merge(gulp.src('src/**', { base: 'src' }), gulp.src('node_modules/typescript/lib/lib.d.ts')); var watchSrc = watch('src/**', { base: 'src' }); // Do not write .d.ts files to disk, as they are not needed there. @@ -122,6 +125,7 @@ function monacodtsTask(out, isWatch) { fs.writeFileSync(result.filePath, result.content); } else { + fs.writeFileSync(result.filePath, result.content); resultStream.emit('error', 'monaco.d.ts is no longer up to date. Please run gulp watch and commit the new file.'); } } diff --git a/build/lib/compilation.ts b/build/lib/compilation.ts index dec7cf28ab..255f8cb970 100644 --- a/build/lib/compilation.ts +++ b/build/lib/compilation.ts @@ -21,19 +21,22 @@ import * as fs from 'fs'; const reporter = createReporter(); -const rootDir = path.join(__dirname, '../../src'); -const options = require('../../src/tsconfig.json').compilerOptions; -options.verbose = false; -options.sourceMap = true; -if (process.env['VSCODE_NO_SOURCEMAP']) { // To be used by developers in a hurry - options.sourceMap = false; +function getTypeScriptCompilerOptions(src: string) { + const rootDir = path.join(__dirname, `../../${src}`); + const options = require(`../../${src}/tsconfig.json`).compilerOptions; + options.verbose = false; + options.sourceMap = true; + if (process.env['VSCODE_NO_SOURCEMAP']) { // To be used by developers in a hurry + options.sourceMap = false; + } + options.rootDir = rootDir; + options.sourceRoot = util.toFileUri(rootDir); + options.newLine = /\r\n/.test(fs.readFileSync(__filename, 'utf8')) ? 'CRLF' : 'LF'; + return options; } -options.rootDir = rootDir; -options.sourceRoot = util.toFileUri(rootDir); -options.newLine = /\r\n/.test(fs.readFileSync(__filename, 'utf8')) ? 'CRLF' : 'LF'; -function createCompile(build: boolean, emitError?: boolean): (token?: util.ICancellationToken) => NodeJS.ReadWriteStream { - const opts = _.clone(options); +function createCompile(src: string, build: boolean, emitError?: boolean): (token?: util.ICancellationToken) => NodeJS.ReadWriteStream { + const opts = _.clone(getTypeScriptCompilerOptions(src)); opts.inlineSources = !!build; opts.noFilesystemLookup = true; @@ -59,7 +62,7 @@ function createCompile(build: boolean, emitError?: boolean): (token?: util.ICanc .pipe(sourcemaps.write('.', { addComment: false, includeContent: !!build, - sourceRoot: options.sourceRoot + sourceRoot: opts.sourceRoot })) .pipe(tsFilter.restore) .pipe(reporter.end(emitError)); @@ -68,32 +71,32 @@ function createCompile(build: boolean, emitError?: boolean): (token?: util.ICanc }; } -export function compileTask(out: string, build: boolean): () => NodeJS.ReadWriteStream { +export function compileTask(src: string, out: string, build: boolean): () => NodeJS.ReadWriteStream { return function () { - const compile = createCompile(build, true); + const compile = createCompile(src, build, true); - const src = es.merge( - gulp.src('src/**', { base: 'src' }), + const srcPipe = es.merge( + gulp.src(`${src}/**`, { base: `${src}` }), gulp.src('node_modules/typescript/lib/lib.d.ts'), ); // Do not write .d.ts files to disk, as they are not needed there. const dtsFilter = util.filter(data => !/\.d\.ts$/.test(data.path)); - return src + return srcPipe .pipe(compile()) .pipe(dtsFilter) .pipe(gulp.dest(out)) .pipe(dtsFilter.restore) - .pipe(monacodtsTask(out, false)); + .pipe(src !== 'src' ? es.through() : monacodtsTask(out, false)); }; } export function watchTask(out: string, build: boolean): () => NodeJS.ReadWriteStream { return function () { - const compile = createCompile(build); + const compile = createCompile('src', build); const src = es.merge( gulp.src('src/**', { base: 'src' }), @@ -150,6 +153,7 @@ function monacodtsTask(out: string, isWatch: boolean): NodeJS.ReadWriteStream { if (isWatch) { fs.writeFileSync(result.filePath, result.content); } else { + fs.writeFileSync(result.filePath, result.content); resultStream.emit('error', 'monaco.d.ts is no longer up to date. Please run gulp watch and commit the new file.'); } } diff --git a/build/lib/extensions.js b/build/lib/extensions.js index 8ea68b63c5..4b95b95d42 100644 --- a/build/lib/extensions.js +++ b/build/lib/extensions.js @@ -44,6 +44,7 @@ function error(err) { var baseHeaders = { 'X-Market-Client-Id': 'VSCode Build', 'User-Agent': 'VSCode Build', + 'X-Market-User-Id': '291C1CD0-051A-4123-9B4B-30D60EF52EE2', }; function fromMarketplace(extensionName, version) { var filterType = 7; diff --git a/build/lib/extensions.ts b/build/lib/extensions.ts index 399d146864..800fd4235e 100644 --- a/build/lib/extensions.ts +++ b/build/lib/extensions.ts @@ -49,6 +49,7 @@ function error(err: any): Stream { const baseHeaders = { 'X-Market-Client-Id': 'VSCode Build', 'User-Agent': 'VSCode Build', + 'X-Market-User-Id': '291C1CD0-051A-4123-9B4B-30D60EF52EE2', }; export function fromMarketplace(extensionName: string, version: string): Stream { diff --git a/build/lib/i18n.resources.json b/build/lib/i18n.resources.json index 4cf0bc4cf6..81fda4c4e9 100644 --- a/build/lib/i18n.resources.json +++ b/build/lib/i18n.resources.json @@ -34,6 +34,10 @@ "name": "vs/workbench/parts/codeEditor", "project": "vscode-workbench" }, + { + "name": "vs/workbench/parts/comments", + "project": "vscode-workbench" + }, { "name": "vs/workbench/parts/debug", "project": "vscode-workbench" @@ -74,6 +78,10 @@ "name": "vs/workbench/parts/logs", "project": "vscode-workbench" }, + { + "name": "vs/workbench/parts/navigation", + "project": "vscode-workbench" + }, { "name": "vs/workbench/parts/output", "project": "vscode-workbench" @@ -146,10 +154,18 @@ "name": "vs/workbench/parts/welcome", "project": "vscode-workbench" }, + { + "name": "vs/workbench/parts/outline", + "project": "vscode-workbench" + }, { "name": "vs/workbench/services/actions", "project": "vscode-workbench" }, + { + "name": "vs/workbench/services/bulkEdit", + "project": "vscode-workbench" + }, { "name": "vs/workbench/services/configuration", "project": "vscode-workbench" @@ -219,4 +235,4 @@ "project": "vscode-preferences" } ] -} \ No newline at end of file +} diff --git a/build/lib/optimize.js b/build/lib/optimize.js index a75e31708d..c9716039d4 100644 --- a/build/lib/optimize.js +++ b/build/lib/optimize.js @@ -17,7 +17,6 @@ var concat = require("gulp-concat"); var VinylFile = require("vinyl"); var bundle = require("./bundle"); var util = require("./util"); -var i18n = require("./i18n"); var gulpUtil = require("gulp-util"); var flatmap = require("gulp-flatmap"); var pump = require("pump"); @@ -40,19 +39,19 @@ function loaderConfig(emptyPaths) { } exports.loaderConfig = loaderConfig; var IS_OUR_COPYRIGHT_REGEXP = /Copyright \(C\) Microsoft Corporation/i; -function loader(bundledFileHeader, bundleLoader) { +function loader(src, bundledFileHeader, bundleLoader) { var sources = [ - 'out-build/vs/loader.js' + src + "/vs/loader.js" ]; if (bundleLoader) { sources = sources.concat([ - 'out-build/vs/css.js', - 'out-build/vs/nls.js' + src + "/vs/css.js", + src + "/vs/nls.js" ]); } var isFirst = true; return (gulp - .src(sources, { base: 'out-build' }) + .src(sources, { base: "" + src }) .pipe(es.through(function (data) { if (isFirst) { isFirst = false; @@ -74,7 +73,7 @@ function loader(bundledFileHeader, bundleLoader) { return f; }))); } -function toConcatStream(bundledFileHeader, sources, dest) { +function toConcatStream(src, bundledFileHeader, sources, dest) { var useSourcemaps = /\.js$/.test(dest) && !/\.nls\.js$/.test(dest); // If a bundle ends up including in any of the sources our copyright, then // insert a fake source at the beginning of each bundle with our copyright @@ -94,7 +93,7 @@ function toConcatStream(bundledFileHeader, sources, dest) { } var treatedSources = sources.map(function (source) { var root = source.path ? REPO_ROOT_PATH.replace(/\\/g, '/') : ''; - var base = source.path ? root + '/out-build' : ''; + var base = source.path ? root + ("/" + src) : ''; return new VinylFile({ path: source.path ? root + '/' + source.path.replace(/\\/g, '/') : 'fake', base: base, @@ -105,12 +104,13 @@ function toConcatStream(bundledFileHeader, sources, dest) { .pipe(useSourcemaps ? util.loadSourcemaps() : es.through()) .pipe(concat(dest)); } -function toBundleStream(bundledFileHeader, bundles) { +function toBundleStream(src, bundledFileHeader, bundles) { return es.merge(bundles.map(function (bundle) { - return toConcatStream(bundledFileHeader, bundle.sources, bundle.dest); + return toConcatStream(src, bundledFileHeader, bundle.sources, bundle.dest); })); } function optimizeTask(opts) { + var src = opts.src; var entryPoints = opts.entryPoints; var otherSources = opts.otherSources; var resources = opts.resources; @@ -126,7 +126,7 @@ function optimizeTask(opts) { if (err) { return bundlesStream.emit('error', JSON.stringify(err)); } - toBundleStream(bundledFileHeader, result.files).pipe(bundlesStream); + toBundleStream(src, bundledFileHeader, result.files).pipe(bundlesStream); // Remove css inlined resources var filteredResources = resources.slice(); result.cssInlinedResources.forEach(function (resource) { @@ -135,7 +135,7 @@ function optimizeTask(opts) { } filteredResources.push('!' + resource); }); - gulp.src(filteredResources, { base: 'out-build' }).pipe(resourcesStream); + gulp.src(filteredResources, { base: "" + src }).pipe(resourcesStream); var bundleInfoArray = []; if (opts.bundleInfo) { bundleInfoArray.push(new VinylFile({ @@ -148,9 +148,9 @@ function optimizeTask(opts) { }); var otherSourcesStream = es.through(); var otherSourcesStreamArr = []; - gulp.src(otherSources, { base: 'out-build' }) + gulp.src(otherSources, { base: "" + src }) .pipe(es.through(function (data) { - otherSourcesStreamArr.push(toConcatStream(bundledFileHeader, [data], data.relative)); + otherSourcesStreamArr.push(toConcatStream(src, bundledFileHeader, [data], data.relative)); }, function () { if (!otherSourcesStreamArr.length) { setTimeout(function () { otherSourcesStream.emit('end'); }, 0); @@ -159,16 +159,12 @@ function optimizeTask(opts) { es.merge(otherSourcesStreamArr).pipe(otherSourcesStream); } })); - var result = es.merge(loader(bundledFileHeader, bundleLoader), bundlesStream, otherSourcesStream, resourcesStream, bundleInfoStream); + var result = es.merge(loader(src, bundledFileHeader, bundleLoader), bundlesStream, otherSourcesStream, resourcesStream, bundleInfoStream); return result .pipe(sourcemaps.write('./', { sourceRoot: null, addComment: true, includeContent: true - })) - .pipe(i18n.processNlsFiles({ - fileHeader: bundledFileHeader, - languages: opts.languages })) .pipe(gulp.dest(out)); }; diff --git a/build/lib/optimize.ts b/build/lib/optimize.ts index 924a7409a1..a1790c7b02 100644 --- a/build/lib/optimize.ts +++ b/build/lib/optimize.ts @@ -18,11 +18,11 @@ import * as concat from 'gulp-concat'; import * as VinylFile from 'vinyl'; import * as bundle from './bundle'; import * as util from './util'; -import * as i18n from './i18n'; import * as gulpUtil from 'gulp-util'; import * as flatmap from 'gulp-flatmap'; import * as pump from 'pump'; import * as sm from 'source-map'; +import { Language } from './i18n'; const REPO_ROOT_PATH = path.join(__dirname, '../..'); @@ -52,21 +52,21 @@ declare class FileSourceMap extends VinylFile { public sourceMap: sm.RawSourceMap; } -function loader(bundledFileHeader: string, bundleLoader: boolean): NodeJS.ReadWriteStream { +function loader(src: string, bundledFileHeader: string, bundleLoader: boolean): NodeJS.ReadWriteStream { let sources = [ - 'out-build/vs/loader.js' + `${src}/vs/loader.js` ]; if (bundleLoader) { sources = sources.concat([ - 'out-build/vs/css.js', - 'out-build/vs/nls.js' + `${src}/vs/css.js`, + `${src}/vs/nls.js` ]); } let isFirst = true; return ( gulp - .src(sources, { base: 'out-build' }) + .src(sources, { base: `${src}` }) .pipe(es.through(function (data) { if (isFirst) { isFirst = false; @@ -89,7 +89,7 @@ function loader(bundledFileHeader: string, bundleLoader: boolean): NodeJS.ReadWr ); } -function toConcatStream(bundledFileHeader: string, sources: bundle.IFile[], dest: string): NodeJS.ReadWriteStream { +function toConcatStream(src: string, bundledFileHeader: string, sources: bundle.IFile[], dest: string): NodeJS.ReadWriteStream { const useSourcemaps = /\.js$/.test(dest) && !/\.nls\.js$/.test(dest); // If a bundle ends up including in any of the sources our copyright, then @@ -112,7 +112,7 @@ function toConcatStream(bundledFileHeader: string, sources: bundle.IFile[], dest const treatedSources = sources.map(function (source) { const root = source.path ? REPO_ROOT_PATH.replace(/\\/g, '/') : ''; - const base = source.path ? root + '/out-build' : ''; + const base = source.path ? root + `/${src}` : ''; return new VinylFile({ path: source.path ? root + '/' + source.path.replace(/\\/g, '/') : 'fake', @@ -126,13 +126,17 @@ function toConcatStream(bundledFileHeader: string, sources: bundle.IFile[], dest .pipe(concat(dest)); } -function toBundleStream(bundledFileHeader: string, bundles: bundle.IConcatFile[]): NodeJS.ReadWriteStream { +function toBundleStream(src:string, bundledFileHeader: string, bundles: bundle.IConcatFile[]): NodeJS.ReadWriteStream { return es.merge(bundles.map(function (bundle) { - return toConcatStream(bundledFileHeader, bundle.sources, bundle.dest); + return toConcatStream(src, bundledFileHeader, bundle.sources, bundle.dest); })); } export interface IOptimizeTaskOpts { + /** + * The folder to read files from. + */ + src: string; /** * (for AMD files, will get bundled and get Copyright treatment) */ @@ -163,11 +167,13 @@ export interface IOptimizeTaskOpts { */ out: string; /** - * (languages to process) + * (out folder name) */ - languages: i18n.Language[]; + languages?: Language[]; } + export function optimizeTask(opts: IOptimizeTaskOpts): () => NodeJS.ReadWriteStream { + const src = opts.src; const entryPoints = opts.entryPoints; const otherSources = opts.otherSources; const resources = opts.resources; @@ -184,7 +190,7 @@ export function optimizeTask(opts: IOptimizeTaskOpts): () => NodeJS.ReadWriteStr bundle.bundle(entryPoints, loaderConfig, function (err, result) { if (err) { return bundlesStream.emit('error', JSON.stringify(err)); } - toBundleStream(bundledFileHeader, result.files).pipe(bundlesStream); + toBundleStream(src, bundledFileHeader, result.files).pipe(bundlesStream); // Remove css inlined resources const filteredResources = resources.slice(); @@ -194,7 +200,7 @@ export function optimizeTask(opts: IOptimizeTaskOpts): () => NodeJS.ReadWriteStr } filteredResources.push('!' + resource); }); - gulp.src(filteredResources, { base: 'out-build' }).pipe(resourcesStream); + gulp.src(filteredResources, { base: `${src}` }).pipe(resourcesStream); const bundleInfoArray: VinylFile[] = []; if (opts.bundleInfo) { @@ -210,9 +216,9 @@ export function optimizeTask(opts: IOptimizeTaskOpts): () => NodeJS.ReadWriteStr const otherSourcesStream = es.through(); const otherSourcesStreamArr: NodeJS.ReadWriteStream[] = []; - gulp.src(otherSources, { base: 'out-build' }) + gulp.src(otherSources, { base: `${src}` }) .pipe(es.through(function (data) { - otherSourcesStreamArr.push(toConcatStream(bundledFileHeader, [data], data.relative)); + otherSourcesStreamArr.push(toConcatStream(src, bundledFileHeader, [data], data.relative)); }, function () { if (!otherSourcesStreamArr.length) { setTimeout(function () { otherSourcesStream.emit('end'); }, 0); @@ -222,7 +228,7 @@ export function optimizeTask(opts: IOptimizeTaskOpts): () => NodeJS.ReadWriteStr })); const result = es.merge( - loader(bundledFileHeader, bundleLoader), + loader(src, bundledFileHeader, bundleLoader), bundlesStream, otherSourcesStream, resourcesStream, @@ -235,10 +241,6 @@ export function optimizeTask(opts: IOptimizeTaskOpts): () => NodeJS.ReadWriteStr addComment: true, includeContent: true })) - .pipe(i18n.processNlsFiles({ - fileHeader: bundledFileHeader, - languages: opts.languages - })) .pipe(gulp.dest(out)); }; } diff --git a/build/lib/standalone.js b/build/lib/standalone.js index 4ae887e007..b5d1acb5d3 100644 --- a/build/lib/standalone.js +++ b/build/lib/standalone.js @@ -7,9 +7,93 @@ Object.defineProperty(exports, "__esModule", { value: true }); var ts = require("typescript"); var fs = require("fs"); var path = require("path"); +var tss = require("./treeshaking"); var REPO_ROOT = path.join(__dirname, '../../'); var SRC_DIR = path.join(REPO_ROOT, 'src'); var OUT_EDITOR = path.join(REPO_ROOT, 'out-editor'); +var dirCache = {}; +function writeFile(filePath, contents) { + function ensureDirs(dirPath) { + if (dirCache[dirPath]) { + return; + } + dirCache[dirPath] = true; + ensureDirs(path.dirname(dirPath)); + if (fs.existsSync(dirPath)) { + return; + } + fs.mkdirSync(dirPath); + } + ensureDirs(path.dirname(filePath)); + fs.writeFileSync(filePath, contents); +} +function extractEditor(options) { + var result = tss.shake(options); + for (var fileName in result) { + if (result.hasOwnProperty(fileName)) { + writeFile(path.join(options.destRoot, fileName), result[fileName]); + } + } + var copied = {}; + var copyFile = function (fileName) { + if (copied[fileName]) { + return; + } + copied[fileName] = true; + var srcPath = path.join(options.sourcesRoot, fileName); + var dstPath = path.join(options.destRoot, fileName); + writeFile(dstPath, fs.readFileSync(srcPath)); + }; + var writeOutputFile = function (fileName, contents) { + writeFile(path.join(options.destRoot, fileName), contents); + }; + for (var fileName in result) { + if (result.hasOwnProperty(fileName)) { + var fileContents = result[fileName]; + var info = ts.preProcessFile(fileContents); + for (var i = info.importedFiles.length - 1; i >= 0; i--) { + var importedFileName = info.importedFiles[i].fileName; + var importedFilePath = void 0; + if (/^vs\/css!/.test(importedFileName)) { + importedFilePath = importedFileName.substr('vs/css!'.length) + '.css'; + } + else { + importedFilePath = importedFileName; + } + if (/(^\.\/)|(^\.\.\/)/.test(importedFilePath)) { + importedFilePath = path.join(path.dirname(fileName), importedFilePath); + } + if (/\.css$/.test(importedFilePath)) { + transportCSS(importedFilePath, copyFile, writeOutputFile); + } + else { + if (fs.existsSync(path.join(options.sourcesRoot, importedFilePath + '.js'))) { + copyFile(importedFilePath + '.js'); + } + } + } + } + } + var tsConfig = JSON.parse(fs.readFileSync(path.join(options.sourcesRoot, 'tsconfig.json')).toString()); + tsConfig.compilerOptions.noUnusedLocals = false; + writeOutputFile('tsconfig.json', JSON.stringify(tsConfig, null, '\t')); + [ + 'vs/css.build.js', + 'vs/css.d.ts', + 'vs/css.js', + 'vs/loader.js', + 'vs/monaco.d.ts', + 'vs/nls.build.js', + 'vs/nls.d.ts', + 'vs/nls.js', + 'vs/nls.mock.ts', + 'typings/lib.ie11_safe_es6.d.ts', + 'typings/thenable.d.ts', + 'typings/es6-promise.d.ts', + 'typings/require.d.ts', + ].forEach(copyFile); +} +exports.extractEditor = extractEditor; function createESMSourcesAndResources(options) { var OUT_FOLDER = path.join(REPO_ROOT, options.outFolder); var OUT_RESOURCES_FOLDER = path.join(REPO_ROOT, options.outResourcesFolder); @@ -94,7 +178,7 @@ function createESMSourcesAndResources(options) { options.entryPoints.forEach(function (entryPoint) { return enqueue(entryPoint); }); while (queue.length > 0) { var module_1 = queue.shift(); - if (transportCSS(options, module_1, enqueue, write)) { + if (transportCSS(module_1, enqueue, write)) { continue; } if (transportResource(options, module_1, enqueue, write)) { @@ -171,7 +255,7 @@ function createESMSourcesAndResources(options) { fs.writeFileSync(path.join(OUT_FOLDER, 'vs/monaco.d.ts'), monacodts); } exports.createESMSourcesAndResources = createESMSourcesAndResources; -function transportCSS(options, module, enqueue, write) { +function transportCSS(module, enqueue, write) { if (!/\.css/.test(module)) { return false; } @@ -179,10 +263,10 @@ function transportCSS(options, module, enqueue, write) { var fileContents = fs.readFileSync(filename).toString(); var inlineResources = 'base64'; // see https://github.com/Microsoft/monaco-editor/issues/148 var inlineResourcesLimit = 300000; //3000; // see https://github.com/Microsoft/monaco-editor/issues/336 - var newContents = _rewriteOrInlineUrls(filename, fileContents, inlineResources === 'base64', inlineResourcesLimit); + var newContents = _rewriteOrInlineUrls(fileContents, inlineResources === 'base64', inlineResourcesLimit); write(module, newContents); return true; - function _rewriteOrInlineUrls(originalFileFSPath, contents, forceBase64, inlineByteLimit) { + function _rewriteOrInlineUrls(contents, forceBase64, inlineByteLimit) { return _replaceURL(contents, function (url) { var imagePath = path.join(path.dirname(module), url); var fileContents = fs.readFileSync(path.join(SRC_DIR, imagePath)); diff --git a/build/lib/standalone.ts b/build/lib/standalone.ts index ee76c1e2b9..4b82db39bd 100644 --- a/build/lib/standalone.ts +++ b/build/lib/standalone.ts @@ -6,11 +6,101 @@ import * as ts from 'typescript'; import * as fs from 'fs'; import * as path from 'path'; +import * as tss from './treeshaking'; const REPO_ROOT = path.join(__dirname, '../../'); const SRC_DIR = path.join(REPO_ROOT, 'src'); const OUT_EDITOR = path.join(REPO_ROOT, 'out-editor'); +let dirCache: { [dir: string]: boolean; } = {}; + +function writeFile(filePath: string, contents: Buffer | string): void { + function ensureDirs(dirPath: string): void { + if (dirCache[dirPath]) { + return; + } + dirCache[dirPath] = true; + + ensureDirs(path.dirname(dirPath)); + if (fs.existsSync(dirPath)) { + return; + } + fs.mkdirSync(dirPath); + } + ensureDirs(path.dirname(filePath)); + fs.writeFileSync(filePath, contents); +} + +export function extractEditor(options: tss.ITreeShakingOptions & { destRoot: string }): void { + let result = tss.shake(options); + for (let fileName in result) { + if (result.hasOwnProperty(fileName)) { + writeFile(path.join(options.destRoot, fileName), result[fileName]); + } + } + let copied: { [fileName:string]: boolean; } = {}; + const copyFile = (fileName: string) => { + if (copied[fileName]) { + return; + } + copied[fileName] = true; + const srcPath = path.join(options.sourcesRoot, fileName); + const dstPath = path.join(options.destRoot, fileName); + writeFile(dstPath, fs.readFileSync(srcPath)); + }; + const writeOutputFile = (fileName: string, contents: string) => { + writeFile(path.join(options.destRoot, fileName), contents); + }; + for (let fileName in result) { + if (result.hasOwnProperty(fileName)) { + const fileContents = result[fileName]; + const info = ts.preProcessFile(fileContents); + + for (let i = info.importedFiles.length - 1; i >= 0; i--) { + const importedFileName = info.importedFiles[i].fileName; + + let importedFilePath: string; + if (/^vs\/css!/.test(importedFileName)) { + importedFilePath = importedFileName.substr('vs/css!'.length) + '.css'; + } else { + importedFilePath = importedFileName; + } + if (/(^\.\/)|(^\.\.\/)/.test(importedFilePath)) { + importedFilePath = path.join(path.dirname(fileName), importedFilePath); + } + + if (/\.css$/.test(importedFilePath)) { + transportCSS(importedFilePath, copyFile, writeOutputFile); + } else { + if (fs.existsSync(path.join(options.sourcesRoot, importedFilePath + '.js'))) { + copyFile(importedFilePath + '.js'); + } + } + } + } + } + + const tsConfig = JSON.parse(fs.readFileSync(path.join(options.sourcesRoot, 'tsconfig.json')).toString()); + tsConfig.compilerOptions.noUnusedLocals = false; + writeOutputFile('tsconfig.json', JSON.stringify(tsConfig, null, '\t')); + + [ + 'vs/css.build.js', + 'vs/css.d.ts', + 'vs/css.js', + 'vs/loader.js', + 'vs/monaco.d.ts', + 'vs/nls.build.js', + 'vs/nls.d.ts', + 'vs/nls.js', + 'vs/nls.mock.ts', + 'typings/lib.ie11_safe_es6.d.ts', + 'typings/thenable.d.ts', + 'typings/es6-promise.d.ts', + 'typings/require.d.ts', + ].forEach(copyFile); +} + export interface IOptions { entryPoints: string[]; outFolder: string; @@ -111,7 +201,7 @@ export function createESMSourcesAndResources(options: IOptions): void { while (queue.length > 0) { const module = queue.shift(); - if (transportCSS(options, module, enqueue, write)) { + if (transportCSS(module, enqueue, write)) { continue; } if (transportResource(options, module, enqueue, write)) { @@ -198,7 +288,7 @@ export function createESMSourcesAndResources(options: IOptions): void { } -function transportCSS(options: IOptions, module: string, enqueue: (module: string) => void, write: (path: string, contents: string | Buffer) => void): boolean { +function transportCSS(module: string, enqueue: (module: string) => void, write: (path: string, contents: string | Buffer) => void): boolean { if (!/\.css/.test(module)) { return false; @@ -209,11 +299,11 @@ function transportCSS(options: IOptions, module: string, enqueue: (module: strin const inlineResources = 'base64'; // see https://github.com/Microsoft/monaco-editor/issues/148 const inlineResourcesLimit = 300000;//3000; // see https://github.com/Microsoft/monaco-editor/issues/336 - const newContents = _rewriteOrInlineUrls(filename, fileContents, inlineResources === 'base64', inlineResourcesLimit); + const newContents = _rewriteOrInlineUrls(fileContents, inlineResources === 'base64', inlineResourcesLimit); write(module, newContents); return true; - function _rewriteOrInlineUrls(originalFileFSPath: string, contents: string, forceBase64: boolean, inlineByteLimit: number): string { + function _rewriteOrInlineUrls(contents: string, forceBase64: boolean, inlineByteLimit: number): string { return _replaceURL(contents, (url) => { let imagePath = path.join(path.dirname(module), url); let fileContents = fs.readFileSync(path.join(SRC_DIR, imagePath)); diff --git a/build/lib/test/util.test.js b/build/lib/test/util.test.js deleted file mode 100644 index 78ee9ceb9d..0000000000 --- a/build/lib/test/util.test.js +++ /dev/null @@ -1,56 +0,0 @@ -"use strict"; -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the Source EULA. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ -Object.defineProperty(exports, "__esModule", { value: true }); -var assert = require("assert"); -var util = require("../util"); -function getMockTagExists(tags) { - return function (tag) { return tags.indexOf(tag) >= 0; }; -} -suite('util tests', function () { - test('getPreviousVersion - patch', function () { - assert.equal(util.getPreviousVersion('1.2.3', getMockTagExists(['1.2.2', '1.2.1', '1.2.0', '1.1.0'])), '1.2.2'); - }); - test('getPreviousVersion - patch invalid', function () { - try { - util.getPreviousVersion('1.2.2', getMockTagExists(['1.2.0', '1.1.0'])); - } - catch (e) { - // expected - return; - } - throw new Error('Expected an exception'); - }); - test('getPreviousVersion - minor', function () { - assert.equal(util.getPreviousVersion('1.2.0', getMockTagExists(['1.1.0', '1.1.1', '1.1.2', '1.1.3'])), '1.1.3'); - assert.equal(util.getPreviousVersion('1.2.0', getMockTagExists(['1.1.0', '1.0.0'])), '1.1.0'); - }); - test('getPreviousVersion - minor gap', function () { - assert.equal(util.getPreviousVersion('1.2.0', getMockTagExists(['1.1.0', '1.1.1', '1.1.3'])), '1.1.1'); - }); - test('getPreviousVersion - minor invalid', function () { - try { - util.getPreviousVersion('1.2.0', getMockTagExists(['1.0.0'])); - } - catch (e) { - // expected - return; - } - throw new Error('Expected an exception'); - }); - test('getPreviousVersion - major', function () { - assert.equal(util.getPreviousVersion('2.0.0', getMockTagExists(['1.0.0', '1.1.0', '1.2.0', '1.2.1', '1.2.2'])), '1.2.2'); - }); - test('getPreviousVersion - major invalid', function () { - try { - util.getPreviousVersion('3.0.0', getMockTagExists(['1.0.0'])); - } - catch (e) { - // expected - return; - } - throw new Error('Expected an exception'); - }); -}); diff --git a/build/lib/test/util.test.ts b/build/lib/test/util.test.ts deleted file mode 100644 index ff11188555..0000000000 --- a/build/lib/test/util.test.ts +++ /dev/null @@ -1,79 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the Source EULA. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -import assert = require('assert'); -import util = require('../util'); - -function getMockTagExists(tags: string[]) { - return (tag: string) => tags.indexOf(tag) >= 0; -} - -suite('util tests', () => { - test('getPreviousVersion - patch', () => { - assert.equal( - util.getPreviousVersion('1.2.3', getMockTagExists(['1.2.2', '1.2.1', '1.2.0', '1.1.0'])), - '1.2.2' - ); - }); - - test('getPreviousVersion - patch invalid', () => { - try { - util.getPreviousVersion('1.2.2', getMockTagExists(['1.2.0', '1.1.0'])); - } catch (e) { - // expected - return; - } - - throw new Error('Expected an exception'); - }); - - test('getPreviousVersion - minor', () => { - assert.equal( - util.getPreviousVersion('1.2.0', getMockTagExists(['1.1.0', '1.1.1', '1.1.2', '1.1.3'])), - '1.1.3' - ); - - assert.equal( - util.getPreviousVersion('1.2.0', getMockTagExists(['1.1.0', '1.0.0'])), - '1.1.0' - ); - }); - - test('getPreviousVersion - minor gap', () => { - assert.equal( - util.getPreviousVersion('1.2.0', getMockTagExists(['1.1.0', '1.1.1', '1.1.3'])), - '1.1.1' - ); - }); - - test('getPreviousVersion - minor invalid', () => { - try { - util.getPreviousVersion('1.2.0', getMockTagExists(['1.0.0'])); - } catch (e) { - // expected - return; - } - - throw new Error('Expected an exception'); - }); - - test('getPreviousVersion - major', () => { - assert.equal( - util.getPreviousVersion('2.0.0', getMockTagExists(['1.0.0', '1.1.0', '1.2.0', '1.2.1', '1.2.2'])), - '1.2.2' - ); - }); - - test('getPreviousVersion - major invalid', () => { - try { - util.getPreviousVersion('3.0.0', getMockTagExists(['1.0.0'])); - } catch (e) { - // expected - return; - } - - throw new Error('Expected an exception'); - }); -}); diff --git a/build/lib/treeshaking.js b/build/lib/treeshaking.js new file mode 100644 index 0000000000..a217c022a9 --- /dev/null +++ b/build/lib/treeshaking.js @@ -0,0 +1,682 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the Source EULA. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +'use strict'; +Object.defineProperty(exports, "__esModule", { value: true }); +var fs = require("fs"); +var path = require("path"); +var ts = require("typescript"); +var TYPESCRIPT_LIB_FOLDER = path.dirname(require.resolve('typescript/lib/lib.d.ts')); +var ShakeLevel; +(function (ShakeLevel) { + ShakeLevel[ShakeLevel["Files"] = 0] = "Files"; + ShakeLevel[ShakeLevel["InnerFile"] = 1] = "InnerFile"; + ShakeLevel[ShakeLevel["ClassMembers"] = 2] = "ClassMembers"; +})(ShakeLevel = exports.ShakeLevel || (exports.ShakeLevel = {})); +function shake(options) { + var languageService = createTypeScriptLanguageService(options); + markNodes(languageService, options); + return generateResult(languageService, options.shakeLevel); +} +exports.shake = shake; +//#region Discovery, LanguageService & Setup +function createTypeScriptLanguageService(options) { + // Discover referenced files + var FILES = discoverAndReadFiles(options); + // Add fake usage files + options.inlineEntryPoints.forEach(function (inlineEntryPoint, index) { + FILES["inlineEntryPoint:" + index + ".ts"] = inlineEntryPoint; + }); + // Resolve libs + var RESOLVED_LIBS = {}; + options.libs.forEach(function (filename) { + var filepath = path.join(TYPESCRIPT_LIB_FOLDER, filename); + RESOLVED_LIBS["defaultLib:" + filename] = fs.readFileSync(filepath).toString(); + }); + var host = new TypeScriptLanguageServiceHost(RESOLVED_LIBS, FILES, options.compilerOptions); + return ts.createLanguageService(host); +} +/** + * Read imports and follow them until all files have been handled + */ +function discoverAndReadFiles(options) { + var FILES = {}; + var in_queue = Object.create(null); + var queue = []; + var enqueue = function (moduleId) { + if (in_queue[moduleId]) { + return; + } + in_queue[moduleId] = true; + queue.push(moduleId); + }; + options.entryPoints.forEach(function (entryPoint) { return enqueue(entryPoint); }); + while (queue.length > 0) { + var moduleId = queue.shift(); + var dts_filename = path.join(options.sourcesRoot, moduleId + '.d.ts'); + if (fs.existsSync(dts_filename)) { + var dts_filecontents = fs.readFileSync(dts_filename).toString(); + FILES[moduleId + '.d.ts'] = dts_filecontents; + continue; + } + var ts_filename = void 0; + if (options.redirects[moduleId]) { + ts_filename = path.join(options.sourcesRoot, options.redirects[moduleId] + '.ts'); + } + else { + ts_filename = path.join(options.sourcesRoot, moduleId + '.ts'); + } + var ts_filecontents = fs.readFileSync(ts_filename).toString(); + var info = ts.preProcessFile(ts_filecontents); + for (var i = info.importedFiles.length - 1; i >= 0; i--) { + var importedFileName = info.importedFiles[i].fileName; + if (options.importIgnorePattern.test(importedFileName)) { + // Ignore vs/css! imports + continue; + } + var importedModuleId = importedFileName; + if (/(^\.\/)|(^\.\.\/)/.test(importedModuleId)) { + importedModuleId = path.join(path.dirname(moduleId), importedModuleId); + } + enqueue(importedModuleId); + } + FILES[moduleId + '.ts'] = ts_filecontents; + } + return FILES; +} +/** + * A TypeScript language service host + */ +var TypeScriptLanguageServiceHost = /** @class */ (function () { + function TypeScriptLanguageServiceHost(libs, files, compilerOptions) { + this._libs = libs; + this._files = files; + this._compilerOptions = compilerOptions; + } + // --- language service host --------------- + TypeScriptLanguageServiceHost.prototype.getCompilationSettings = function () { + return this._compilerOptions; + }; + TypeScriptLanguageServiceHost.prototype.getScriptFileNames = function () { + return ([] + .concat(Object.keys(this._libs)) + .concat(Object.keys(this._files))); + }; + TypeScriptLanguageServiceHost.prototype.getScriptVersion = function (fileName) { + return '1'; + }; + TypeScriptLanguageServiceHost.prototype.getProjectVersion = function () { + return '1'; + }; + TypeScriptLanguageServiceHost.prototype.getScriptSnapshot = function (fileName) { + if (this._files.hasOwnProperty(fileName)) { + return ts.ScriptSnapshot.fromString(this._files[fileName]); + } + else if (this._libs.hasOwnProperty(fileName)) { + return ts.ScriptSnapshot.fromString(this._libs[fileName]); + } + else { + return ts.ScriptSnapshot.fromString(''); + } + }; + TypeScriptLanguageServiceHost.prototype.getScriptKind = function (fileName) { + return ts.ScriptKind.TS; + }; + TypeScriptLanguageServiceHost.prototype.getCurrentDirectory = function () { + return ''; + }; + TypeScriptLanguageServiceHost.prototype.getDefaultLibFileName = function (options) { + return 'defaultLib:lib.d.ts'; + }; + TypeScriptLanguageServiceHost.prototype.isDefaultLibFileName = function (fileName) { + return fileName === this.getDefaultLibFileName(this._compilerOptions); + }; + return TypeScriptLanguageServiceHost; +}()); +//#endregion +//#region Tree Shaking +var NodeColor; +(function (NodeColor) { + NodeColor[NodeColor["White"] = 0] = "White"; + NodeColor[NodeColor["Gray"] = 1] = "Gray"; + NodeColor[NodeColor["Black"] = 2] = "Black"; +})(NodeColor || (NodeColor = {})); +function getColor(node) { + return node.$$$color || 0 /* White */; +} +function setColor(node, color) { + node.$$$color = color; +} +function nodeOrParentIsBlack(node) { + while (node) { + var color = getColor(node); + if (color === 2 /* Black */) { + return true; + } + node = node.parent; + } + return false; +} +function nodeOrChildIsBlack(node) { + if (getColor(node) === 2 /* Black */) { + return true; + } + for (var _i = 0, _a = node.getChildren(); _i < _a.length; _i++) { + var child = _a[_i]; + if (nodeOrChildIsBlack(child)) { + return true; + } + } + return false; +} +function markNodes(languageService, options) { + var program = languageService.getProgram(); + if (options.shakeLevel === 0 /* Files */) { + // Mark all source files Black + program.getSourceFiles().forEach(function (sourceFile) { + setColor(sourceFile, 2 /* Black */); + }); + return; + } + var black_queue = []; + var gray_queue = []; + var sourceFilesLoaded = {}; + function enqueueTopLevelModuleStatements(sourceFile) { + sourceFile.forEachChild(function (node) { + if (ts.isImportDeclaration(node)) { + if (!node.importClause && ts.isStringLiteral(node.moduleSpecifier)) { + setColor(node, 2 /* Black */); + enqueueImport(node, node.moduleSpecifier.text); + } + return; + } + if (ts.isExportDeclaration(node)) { + if (ts.isStringLiteral(node.moduleSpecifier)) { + setColor(node, 2 /* Black */); + enqueueImport(node, node.moduleSpecifier.text); + } + return; + } + if (ts.isExpressionStatement(node) + || ts.isIfStatement(node) + || ts.isIterationStatement(node, true) + || ts.isExportAssignment(node)) { + enqueue_black(node); + } + if (ts.isImportEqualsDeclaration(node)) { + if (/export/.test(node.getFullText(sourceFile))) { + // e.g. "export import Severity = BaseSeverity;" + enqueue_black(node); + } + } + }); + } + function enqueue_gray(node) { + if (nodeOrParentIsBlack(node) || getColor(node) === 1 /* Gray */) { + return; + } + setColor(node, 1 /* Gray */); + gray_queue.push(node); + } + function enqueue_black(node) { + var previousColor = getColor(node); + if (previousColor === 2 /* Black */) { + return; + } + if (previousColor === 1 /* Gray */) { + // remove from gray queue + gray_queue.splice(gray_queue.indexOf(node), 1); + setColor(node, 0 /* White */); + // add to black queue + enqueue_black(node); + // // move from one queue to the other + // black_queue.push(node); + // setColor(node, NodeColor.Black); + return; + } + if (nodeOrParentIsBlack(node)) { + return; + } + var fileName = node.getSourceFile().fileName; + if (/^defaultLib:/.test(fileName) || /\.d\.ts$/.test(fileName)) { + setColor(node, 2 /* Black */); + return; + } + var sourceFile = node.getSourceFile(); + if (!sourceFilesLoaded[sourceFile.fileName]) { + sourceFilesLoaded[sourceFile.fileName] = true; + enqueueTopLevelModuleStatements(sourceFile); + } + if (ts.isSourceFile(node)) { + return; + } + setColor(node, 2 /* Black */); + black_queue.push(node); + if (options.shakeLevel === 2 /* ClassMembers */ && (ts.isMethodDeclaration(node) || ts.isMethodSignature(node) || ts.isPropertySignature(node) || ts.isGetAccessor(node) || ts.isSetAccessor(node))) { + var references = languageService.getReferencesAtPosition(node.getSourceFile().fileName, node.name.pos + node.name.getLeadingTriviaWidth()); + if (references) { + for (var i = 0, len = references.length; i < len; i++) { + var reference = references[i]; + var referenceSourceFile = program.getSourceFile(reference.fileName); + var referenceNode = getTokenAtPosition(referenceSourceFile, reference.textSpan.start, false, false); + if (ts.isMethodDeclaration(referenceNode.parent) + || ts.isPropertyDeclaration(referenceNode.parent) + || ts.isGetAccessor(referenceNode.parent) + || ts.isSetAccessor(referenceNode.parent)) { + enqueue_gray(referenceNode.parent); + } + } + } + } + } + function enqueueFile(filename) { + var sourceFile = program.getSourceFile(filename); + if (!sourceFile) { + console.warn("Cannot find source file " + filename); + return; + } + enqueue_black(sourceFile); + } + function enqueueImport(node, importText) { + if (options.importIgnorePattern.test(importText)) { + // this import should be ignored + return; + } + var nodeSourceFile = node.getSourceFile(); + var fullPath; + if (/(^\.\/)|(^\.\.\/)/.test(importText)) { + fullPath = path.join(path.dirname(nodeSourceFile.fileName), importText) + '.ts'; + } + else { + fullPath = importText + '.ts'; + } + enqueueFile(fullPath); + } + options.entryPoints.forEach(function (moduleId) { return enqueueFile(moduleId + '.ts'); }); + // Add fake usage files + options.inlineEntryPoints.forEach(function (_, index) { return enqueueFile("inlineEntryPoint:" + index + ".ts"); }); + var step = 0; + var checker = program.getTypeChecker(); + var _loop_1 = function () { + ++step; + var node = void 0; + if (step % 100 === 0) { + console.log(step + "/" + (step + black_queue.length + gray_queue.length) + " (" + black_queue.length + ", " + gray_queue.length + ")"); + } + if (black_queue.length === 0) { + for (var i = 0; i < gray_queue.length; i++) { + var node_1 = gray_queue[i]; + var nodeParent = node_1.parent; + if ((ts.isClassDeclaration(nodeParent) || ts.isInterfaceDeclaration(nodeParent)) && nodeOrChildIsBlack(nodeParent)) { + gray_queue.splice(i, 1); + black_queue.push(node_1); + setColor(node_1, 2 /* Black */); + i--; + } + } + } + if (black_queue.length > 0) { + node = black_queue.shift(); + } + else { + return "break"; + } + var nodeSourceFile = node.getSourceFile(); + var loop = function (node) { + var _a = getRealNodeSymbol(checker, node), symbol = _a[0], symbolImportNode = _a[1]; + if (symbolImportNode) { + setColor(symbolImportNode, 2 /* Black */); + } + if (symbol && !nodeIsInItsOwnDeclaration(nodeSourceFile, node, symbol)) { + for (var i = 0, len = symbol.declarations.length; i < len; i++) { + var declaration = symbol.declarations[i]; + if (ts.isSourceFile(declaration)) { + // Do not enqueue full source files + // (they can be the declaration of a module import) + continue; + } + if (options.shakeLevel === 2 /* ClassMembers */ && (ts.isClassDeclaration(declaration) || ts.isInterfaceDeclaration(declaration))) { + enqueue_black(declaration.name); + for (var j = 0; j < declaration.members.length; j++) { + var member = declaration.members[j]; + var memberName = member.name ? member.name.getText() : null; + if (ts.isConstructorDeclaration(member) + || ts.isConstructSignatureDeclaration(member) + || ts.isIndexSignatureDeclaration(member) + || ts.isCallSignatureDeclaration(member) + || memberName === 'toJSON' + || memberName === 'toString' + || memberName === 'dispose' // TODO: keeping all `dispose` methods + ) { + enqueue_black(member); + } + } + // queue the heritage clauses + if (declaration.heritageClauses) { + for (var _i = 0, _b = declaration.heritageClauses; _i < _b.length; _i++) { + var heritageClause = _b[_i]; + enqueue_black(heritageClause); + } + } + } + else { + enqueue_black(declaration); + } + } + } + node.forEachChild(loop); + }; + node.forEachChild(loop); + }; + while (black_queue.length > 0 || gray_queue.length > 0) { + var state_1 = _loop_1(); + if (state_1 === "break") + break; + } +} +function nodeIsInItsOwnDeclaration(nodeSourceFile, node, symbol) { + for (var i = 0, len = symbol.declarations.length; i < len; i++) { + var declaration = symbol.declarations[i]; + var declarationSourceFile = declaration.getSourceFile(); + if (nodeSourceFile === declarationSourceFile) { + if (declaration.pos <= node.pos && node.end <= declaration.end) { + return true; + } + } + } + return false; +} +function generateResult(languageService, shakeLevel) { + var program = languageService.getProgram(); + var result = {}; + var writeFile = function (filePath, contents) { + result[filePath] = contents; + }; + program.getSourceFiles().forEach(function (sourceFile) { + var fileName = sourceFile.fileName; + if (/^defaultLib:/.test(fileName)) { + return; + } + var destination = fileName; + if (/\.d\.ts$/.test(fileName)) { + if (nodeOrChildIsBlack(sourceFile)) { + writeFile(destination, sourceFile.text); + } + return; + } + var text = sourceFile.text; + var result = ''; + function keep(node) { + result += text.substring(node.pos, node.end); + } + function write(data) { + result += data; + } + function writeMarkedNodes(node) { + if (getColor(node) === 2 /* Black */) { + return keep(node); + } + // Always keep certain top-level statements + if (ts.isSourceFile(node.parent)) { + if (ts.isExpressionStatement(node) && ts.isStringLiteral(node.expression) && node.expression.text === 'use strict') { + return keep(node); + } + if (ts.isVariableStatement(node) && nodeOrChildIsBlack(node)) { + return keep(node); + } + } + // Keep the entire import in import * as X cases + if (ts.isImportDeclaration(node)) { + if (node.importClause && node.importClause.namedBindings) { + if (ts.isNamespaceImport(node.importClause.namedBindings)) { + if (getColor(node.importClause.namedBindings) === 2 /* Black */) { + return keep(node); + } + } + else { + var survivingImports = []; + for (var i = 0; i < node.importClause.namedBindings.elements.length; i++) { + var importNode = node.importClause.namedBindings.elements[i]; + if (getColor(importNode) === 2 /* Black */) { + survivingImports.push(importNode.getFullText(sourceFile)); + } + } + var leadingTriviaWidth = node.getLeadingTriviaWidth(); + var leadingTrivia = sourceFile.text.substr(node.pos, leadingTriviaWidth); + if (survivingImports.length > 0) { + if (node.importClause && getColor(node.importClause) === 2 /* Black */) { + return write(leadingTrivia + "import " + node.importClause.name.text + ", {" + survivingImports.join(',') + " } from" + node.moduleSpecifier.getFullText(sourceFile) + ";"); + } + return write(leadingTrivia + "import {" + survivingImports.join(',') + " } from" + node.moduleSpecifier.getFullText(sourceFile) + ";"); + } + else { + if (node.importClause && getColor(node.importClause) === 2 /* Black */) { + return write(leadingTrivia + "import " + node.importClause.name.text + " from" + node.moduleSpecifier.getFullText(sourceFile) + ";"); + } + } + } + } + else { + if (node.importClause && getColor(node.importClause) === 2 /* Black */) { + return keep(node); + } + } + } + if (shakeLevel === 2 /* ClassMembers */ && (ts.isClassDeclaration(node) || ts.isInterfaceDeclaration(node)) && nodeOrChildIsBlack(node)) { + var toWrite = node.getFullText(); + for (var i = node.members.length - 1; i >= 0; i--) { + var member = node.members[i]; + if (getColor(member) === 2 /* Black */) { + // keep method + continue; + } + if (/^_(.*)Brand$/.test(member.name.getText())) { + // TODO: keep all members ending with `Brand`... + continue; + } + var pos = member.pos - node.pos; + var end = member.end - node.pos; + toWrite = toWrite.substring(0, pos) + toWrite.substring(end); + } + return write(toWrite); + } + if (ts.isFunctionDeclaration(node)) { + // Do not go inside functions if they haven't been marked + return; + } + node.forEachChild(writeMarkedNodes); + } + if (getColor(sourceFile) !== 2 /* Black */) { + if (!nodeOrChildIsBlack(sourceFile)) { + // none of the elements are reachable => don't write this file at all! + return; + } + sourceFile.forEachChild(writeMarkedNodes); + result += sourceFile.endOfFileToken.getFullText(sourceFile); + } + else { + result = text; + } + writeFile(destination, result); + }); + return result; +} +//#endregion +//#region Utils +/** + * Returns the node's symbol and the `import` node (if the symbol resolved from a different module) + */ +function getRealNodeSymbol(checker, node) { + /** + * Returns the containing object literal property declaration given a possible name node, e.g. "a" in x = { "a": 1 } + */ + /* @internal */ + function getContainingObjectLiteralElement(node) { + switch (node.kind) { + case ts.SyntaxKind.StringLiteral: + case ts.SyntaxKind.NumericLiteral: + if (node.parent.kind === ts.SyntaxKind.ComputedPropertyName) { + return ts.isObjectLiteralElement(node.parent.parent) ? node.parent.parent : undefined; + } + // falls through + case ts.SyntaxKind.Identifier: + return ts.isObjectLiteralElement(node.parent) && + (node.parent.parent.kind === ts.SyntaxKind.ObjectLiteralExpression || node.parent.parent.kind === ts.SyntaxKind.JsxAttributes) && + node.parent.name === node ? node.parent : undefined; + } + return undefined; + } + function getPropertySymbolsFromType(type, propName) { + function getTextOfPropertyName(name) { + function isStringOrNumericLiteral(node) { + var kind = node.kind; + return kind === ts.SyntaxKind.StringLiteral + || kind === ts.SyntaxKind.NumericLiteral; + } + switch (name.kind) { + case ts.SyntaxKind.Identifier: + return name.text; + case ts.SyntaxKind.StringLiteral: + case ts.SyntaxKind.NumericLiteral: + return name.text; + case ts.SyntaxKind.ComputedPropertyName: + return isStringOrNumericLiteral(name.expression) ? name.expression.text : undefined; + } + } + var name = getTextOfPropertyName(propName); + if (name && type) { + var result = []; + var symbol_1 = type.getProperty(name); + if (type.flags & ts.TypeFlags.Union) { + for (var _i = 0, _a = type.types; _i < _a.length; _i++) { + var t = _a[_i]; + var symbol_2 = t.getProperty(name); + if (symbol_2) { + result.push(symbol_2); + } + } + return result; + } + if (symbol_1) { + result.push(symbol_1); + return result; + } + } + return undefined; + } + function getPropertySymbolsFromContextualType(typeChecker, node) { + var objectLiteral = node.parent; + var contextualType = typeChecker.getContextualType(objectLiteral); + return getPropertySymbolsFromType(contextualType, node.name); + } + // Go to the original declaration for cases: + // + // (1) when the aliased symbol was declared in the location(parent). + // (2) when the aliased symbol is originating from an import. + // + function shouldSkipAlias(node, declaration) { + if (node.kind !== ts.SyntaxKind.Identifier) { + return false; + } + if (node.parent === declaration) { + return true; + } + switch (declaration.kind) { + case ts.SyntaxKind.ImportClause: + case ts.SyntaxKind.ImportEqualsDeclaration: + return true; + case ts.SyntaxKind.ImportSpecifier: + return declaration.parent.kind === ts.SyntaxKind.NamedImports; + default: + return false; + } + } + if (!ts.isShorthandPropertyAssignment(node)) { + if (node.getChildCount() !== 0) { + return [null, null]; + } + } + var symbol = checker.getSymbolAtLocation(node); + var importNode = null; + if (symbol && symbol.flags & ts.SymbolFlags.Alias && shouldSkipAlias(node, symbol.declarations[0])) { + var aliased = checker.getAliasedSymbol(symbol); + if (aliased.declarations) { + // We should mark the import as visited + importNode = symbol.declarations[0]; + symbol = aliased; + } + } + if (symbol) { + // Because name in short-hand property assignment has two different meanings: property name and property value, + // using go-to-definition at such position should go to the variable declaration of the property value rather than + // go to the declaration of the property name (in this case stay at the same position). However, if go-to-definition + // is performed at the location of property access, we would like to go to definition of the property in the short-hand + // assignment. This case and others are handled by the following code. + if (node.parent.kind === ts.SyntaxKind.ShorthandPropertyAssignment) { + symbol = checker.getShorthandAssignmentValueSymbol(symbol.valueDeclaration); + } + // If the node is the name of a BindingElement within an ObjectBindingPattern instead of just returning the + // declaration the symbol (which is itself), we should try to get to the original type of the ObjectBindingPattern + // and return the property declaration for the referenced property. + // For example: + // import('./foo').then(({ b/*goto*/ar }) => undefined); => should get use to the declaration in file "./foo" + // + // function bar(onfulfilled: (value: T) => void) { //....} + // interface Test { + // pr/*destination*/op1: number + // } + // bar(({pr/*goto*/op1})=>{}); + if (ts.isPropertyName(node) && ts.isBindingElement(node.parent) && ts.isObjectBindingPattern(node.parent.parent) && + (node === (node.parent.propertyName || node.parent.name))) { + var type = checker.getTypeAtLocation(node.parent.parent); + if (type) { + var propSymbols = getPropertySymbolsFromType(type, node); + if (propSymbols) { + symbol = propSymbols[0]; + } + } + } + // If the current location we want to find its definition is in an object literal, try to get the contextual type for the + // object literal, lookup the property symbol in the contextual type, and use this for goto-definition. + // For example + // interface Props{ + // /*first*/prop1: number + // prop2: boolean + // } + // function Foo(arg: Props) {} + // Foo( { pr/*1*/op1: 10, prop2: false }) + var element = getContainingObjectLiteralElement(node); + if (element && checker.getContextualType(element.parent)) { + var propertySymbols = getPropertySymbolsFromContextualType(checker, element); + if (propertySymbols) { + symbol = propertySymbols[0]; + } + } + } + if (symbol && symbol.declarations) { + return [symbol, importNode]; + } + return [null, null]; +} +/** Get the token whose text contains the position */ +function getTokenAtPosition(sourceFile, position, allowPositionInLeadingTrivia, includeEndPosition) { + var current = sourceFile; + outer: while (true) { + // find the child that contains 'position' + for (var _i = 0, _a = current.getChildren(); _i < _a.length; _i++) { + var child = _a[_i]; + var start = allowPositionInLeadingTrivia ? child.getFullStart() : child.getStart(sourceFile, /*includeJsDoc*/ true); + if (start > position) { + // If this child begins after position, then all subsequent children will as well. + break; + } + var end = child.getEnd(); + if (position < end || (position === end && (child.kind === ts.SyntaxKind.EndOfFileToken || includeEndPosition))) { + current = child; + continue outer; + } + } + return current; + } +} diff --git a/build/lib/treeshaking.ts b/build/lib/treeshaking.ts new file mode 100644 index 0000000000..30cd74eae1 --- /dev/null +++ b/build/lib/treeshaking.ts @@ -0,0 +1,817 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the Source EULA. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +'use strict'; + +import * as fs from 'fs'; +import * as path from 'path'; +import * as ts from 'typescript'; + +const TYPESCRIPT_LIB_FOLDER = path.dirname(require.resolve('typescript/lib/lib.d.ts')); + +export const enum ShakeLevel { + Files = 0, + InnerFile = 1, + ClassMembers = 2 +} + +export interface ITreeShakingOptions { + /** + * The full path to the root where sources are. + */ + sourcesRoot: string; + /** + * Module ids. + * e.g. `vs/editor/editor.main` or `index` + */ + entryPoints: string[]; + /** + * Inline usages. + */ + inlineEntryPoints: string[]; + /** + * TypeScript libs. + * e.g. `lib.d.ts`, `lib.es2015.collection.d.ts` + */ + libs: string[]; + /** + * TypeScript compiler options. + */ + compilerOptions: ts.CompilerOptions; + /** + * The shake level to perform. + */ + shakeLevel: ShakeLevel; + /** + * regex pattern to ignore certain imports e.g. `vs/css!` imports + */ + importIgnorePattern: RegExp; + + redirects: { [module: string]: string; }; +} + +export interface ITreeShakingResult { + [file: string]: string; +} + +export function shake(options: ITreeShakingOptions): ITreeShakingResult { + const languageService = createTypeScriptLanguageService(options); + + markNodes(languageService, options); + + return generateResult(languageService, options.shakeLevel); +} + +//#region Discovery, LanguageService & Setup +function createTypeScriptLanguageService(options: ITreeShakingOptions): ts.LanguageService { + // Discover referenced files + const FILES = discoverAndReadFiles(options); + + // Add fake usage files + options.inlineEntryPoints.forEach((inlineEntryPoint, index) => { + FILES[`inlineEntryPoint:${index}.ts`] = inlineEntryPoint; + }); + + // Resolve libs + const RESOLVED_LIBS: ILibMap = {}; + options.libs.forEach((filename) => { + const filepath = path.join(TYPESCRIPT_LIB_FOLDER, filename); + RESOLVED_LIBS[`defaultLib:${filename}`] = fs.readFileSync(filepath).toString(); + }); + + const host = new TypeScriptLanguageServiceHost(RESOLVED_LIBS, FILES, options.compilerOptions); + return ts.createLanguageService(host); +} + +/** + * Read imports and follow them until all files have been handled + */ +function discoverAndReadFiles(options: ITreeShakingOptions): IFileMap { + const FILES: IFileMap = {}; + + const in_queue: { [module: string]: boolean; } = Object.create(null); + const queue: string[] = []; + + const enqueue = (moduleId: string) => { + if (in_queue[moduleId]) { + return; + } + in_queue[moduleId] = true; + queue.push(moduleId); + }; + + options.entryPoints.forEach((entryPoint) => enqueue(entryPoint)); + + while (queue.length > 0) { + const moduleId = queue.shift(); + const dts_filename = path.join(options.sourcesRoot, moduleId + '.d.ts'); + if (fs.existsSync(dts_filename)) { + const dts_filecontents = fs.readFileSync(dts_filename).toString(); + FILES[moduleId + '.d.ts'] = dts_filecontents; + continue; + } + + let ts_filename: string; + if (options.redirects[moduleId]) { + ts_filename = path.join(options.sourcesRoot, options.redirects[moduleId] + '.ts'); + } else { + ts_filename = path.join(options.sourcesRoot, moduleId + '.ts'); + } + const ts_filecontents = fs.readFileSync(ts_filename).toString(); + const info = ts.preProcessFile(ts_filecontents); + for (let i = info.importedFiles.length - 1; i >= 0; i--) { + const importedFileName = info.importedFiles[i].fileName; + + if (options.importIgnorePattern.test(importedFileName)) { + // Ignore vs/css! imports + continue; + } + + let importedModuleId = importedFileName; + if (/(^\.\/)|(^\.\.\/)/.test(importedModuleId)) { + importedModuleId = path.join(path.dirname(moduleId), importedModuleId); + } + enqueue(importedModuleId); + } + + FILES[moduleId + '.ts'] = ts_filecontents; + } + + return FILES; +} + +interface ILibMap { [libName: string]: string; } +interface IFileMap { [fileName: string]: string; } + +/** + * A TypeScript language service host + */ +class TypeScriptLanguageServiceHost implements ts.LanguageServiceHost { + + private readonly _libs: ILibMap; + private readonly _files: IFileMap; + private readonly _compilerOptions: ts.CompilerOptions; + + constructor(libs: ILibMap, files: IFileMap, compilerOptions: ts.CompilerOptions) { + this._libs = libs; + this._files = files; + this._compilerOptions = compilerOptions; + } + + // --- language service host --------------- + + getCompilationSettings(): ts.CompilerOptions { + return this._compilerOptions; + } + getScriptFileNames(): string[] { + return ( + [] + .concat(Object.keys(this._libs)) + .concat(Object.keys(this._files)) + ); + } + getScriptVersion(fileName: string): string { + return '1'; + } + getProjectVersion(): string { + return '1'; + } + getScriptSnapshot(fileName: string): ts.IScriptSnapshot { + if (this._files.hasOwnProperty(fileName)) { + return ts.ScriptSnapshot.fromString(this._files[fileName]); + } else if (this._libs.hasOwnProperty(fileName)) { + return ts.ScriptSnapshot.fromString(this._libs[fileName]); + } else { + return ts.ScriptSnapshot.fromString(''); + } + } + getScriptKind(fileName: string): ts.ScriptKind { + return ts.ScriptKind.TS; + } + getCurrentDirectory(): string { + return ''; + } + getDefaultLibFileName(options: ts.CompilerOptions): string { + return 'defaultLib:lib.d.ts'; + } + isDefaultLibFileName(fileName: string): boolean { + return fileName === this.getDefaultLibFileName(this._compilerOptions); + } +} +//#endregion + +//#region Tree Shaking + +const enum NodeColor { + White = 0, + Gray = 1, + Black = 2 +} + +function getColor(node: ts.Node): NodeColor { + return (node).$$$color || NodeColor.White; +} +function setColor(node: ts.Node, color: NodeColor): void { + (node).$$$color = color; +} +function nodeOrParentIsBlack(node: ts.Node): boolean { + while (node) { + const color = getColor(node); + if (color === NodeColor.Black) { + return true; + } + node = node.parent; + } + return false; +} +function nodeOrChildIsBlack(node: ts.Node): boolean { + if (getColor(node) === NodeColor.Black) { + return true; + } + for (const child of node.getChildren()) { + if (nodeOrChildIsBlack(child)) { + return true; + } + } + return false; +} + +function markNodes(languageService: ts.LanguageService, options: ITreeShakingOptions) { + const program = languageService.getProgram(); + + if (options.shakeLevel === ShakeLevel.Files) { + // Mark all source files Black + program.getSourceFiles().forEach((sourceFile) => { + setColor(sourceFile, NodeColor.Black); + }); + return; + } + + const black_queue: ts.Node[] = []; + const gray_queue: ts.Node[] = []; + const sourceFilesLoaded: { [fileName: string]: boolean } = {}; + + function enqueueTopLevelModuleStatements(sourceFile: ts.SourceFile): void { + + sourceFile.forEachChild((node: ts.Node) => { + + if (ts.isImportDeclaration(node)) { + if (!node.importClause && ts.isStringLiteral(node.moduleSpecifier)) { + setColor(node, NodeColor.Black); + enqueueImport(node, node.moduleSpecifier.text); + } + return; + } + + if (ts.isExportDeclaration(node)) { + if (ts.isStringLiteral(node.moduleSpecifier)) { + setColor(node, NodeColor.Black); + enqueueImport(node, node.moduleSpecifier.text); + } + return; + } + + if ( + ts.isExpressionStatement(node) + || ts.isIfStatement(node) + || ts.isIterationStatement(node, true) + || ts.isExportAssignment(node) + ) { + enqueue_black(node); + } + + if (ts.isImportEqualsDeclaration(node)) { + if (/export/.test(node.getFullText(sourceFile))) { + // e.g. "export import Severity = BaseSeverity;" + enqueue_black(node); + } + } + + }); + } + + function enqueue_gray(node: ts.Node): void { + if (nodeOrParentIsBlack(node) || getColor(node) === NodeColor.Gray) { + return; + } + setColor(node, NodeColor.Gray); + gray_queue.push(node); + } + + function enqueue_black(node: ts.Node): void { + const previousColor = getColor(node); + + if (previousColor === NodeColor.Black) { + return; + } + + if (previousColor === NodeColor.Gray) { + // remove from gray queue + gray_queue.splice(gray_queue.indexOf(node), 1); + setColor(node, NodeColor.White); + + // add to black queue + enqueue_black(node); + + // // move from one queue to the other + // black_queue.push(node); + // setColor(node, NodeColor.Black); + return; + } + + if (nodeOrParentIsBlack(node)) { + return; + } + + const fileName = node.getSourceFile().fileName; + if (/^defaultLib:/.test(fileName) || /\.d\.ts$/.test(fileName)) { + setColor(node, NodeColor.Black); + return; + } + + const sourceFile = node.getSourceFile(); + if (!sourceFilesLoaded[sourceFile.fileName]) { + sourceFilesLoaded[sourceFile.fileName] = true; + enqueueTopLevelModuleStatements(sourceFile); + } + + if (ts.isSourceFile(node)) { + return; + } + + setColor(node, NodeColor.Black); + black_queue.push(node); + + if (options.shakeLevel === ShakeLevel.ClassMembers && (ts.isMethodDeclaration(node) || ts.isMethodSignature(node) || ts.isPropertySignature(node) || ts.isGetAccessor(node) || ts.isSetAccessor(node))) { + const references = languageService.getReferencesAtPosition(node.getSourceFile().fileName, node.name.pos + node.name.getLeadingTriviaWidth()); + if (references) { + for (let i = 0, len = references.length; i < len; i++) { + const reference = references[i]; + const referenceSourceFile = program.getSourceFile(reference.fileName); + const referenceNode = getTokenAtPosition(referenceSourceFile, reference.textSpan.start, false, false); + if ( + ts.isMethodDeclaration(referenceNode.parent) + || ts.isPropertyDeclaration(referenceNode.parent) + || ts.isGetAccessor(referenceNode.parent) + || ts.isSetAccessor(referenceNode.parent) + ) { + enqueue_gray(referenceNode.parent); + } + } + } + } + } + + function enqueueFile(filename: string): void { + const sourceFile = program.getSourceFile(filename); + if (!sourceFile) { + console.warn(`Cannot find source file ${filename}`); + return; + } + enqueue_black(sourceFile); + } + + function enqueueImport(node: ts.Node, importText: string): void { + if (options.importIgnorePattern.test(importText)) { + // this import should be ignored + return; + } + + const nodeSourceFile = node.getSourceFile(); + let fullPath: string; + if (/(^\.\/)|(^\.\.\/)/.test(importText)) { + fullPath = path.join(path.dirname(nodeSourceFile.fileName), importText) + '.ts'; + } else { + fullPath = importText + '.ts'; + } + enqueueFile(fullPath); + } + + options.entryPoints.forEach(moduleId => enqueueFile(moduleId + '.ts')); + // Add fake usage files + options.inlineEntryPoints.forEach((_, index) => enqueueFile(`inlineEntryPoint:${index}.ts`)); + + let step = 0; + + const checker = program.getTypeChecker(); + while (black_queue.length > 0 || gray_queue.length > 0) { + ++step; + let node: ts.Node; + + if (step % 100 === 0) { + console.log(`${step}/${step+black_queue.length+gray_queue.length} (${black_queue.length}, ${gray_queue.length})`); + } + + if (black_queue.length === 0) { + for (let i = 0; i < gray_queue.length; i++) { + const node = gray_queue[i]; + const nodeParent = node.parent; + if ((ts.isClassDeclaration(nodeParent) || ts.isInterfaceDeclaration(nodeParent)) && nodeOrChildIsBlack(nodeParent)) { + gray_queue.splice(i, 1); + black_queue.push(node); + setColor(node, NodeColor.Black); + i--; + } + } + } + + if (black_queue.length > 0) { + node = black_queue.shift(); + } else { + // only gray nodes remaining... + break; + } + const nodeSourceFile = node.getSourceFile(); + + const loop = (node: ts.Node) => { + const [symbol, symbolImportNode] = getRealNodeSymbol(checker, node); + if (symbolImportNode) { + setColor(symbolImportNode, NodeColor.Black); + } + + if (symbol && !nodeIsInItsOwnDeclaration(nodeSourceFile, node, symbol)) { + for (let i = 0, len = symbol.declarations.length; i < len; i++) { + const declaration = symbol.declarations[i]; + if (ts.isSourceFile(declaration)) { + // Do not enqueue full source files + // (they can be the declaration of a module import) + continue; + } + + if (options.shakeLevel === ShakeLevel.ClassMembers && (ts.isClassDeclaration(declaration) || ts.isInterfaceDeclaration(declaration))) { + enqueue_black(declaration.name); + + for (let j = 0; j < declaration.members.length; j++) { + const member = declaration.members[j]; + const memberName = member.name ? member.name.getText() : null; + if ( + ts.isConstructorDeclaration(member) + || ts.isConstructSignatureDeclaration(member) + || ts.isIndexSignatureDeclaration(member) + || ts.isCallSignatureDeclaration(member) + || memberName === 'toJSON' + || memberName === 'toString' + || memberName === 'dispose'// TODO: keeping all `dispose` methods + ) { + enqueue_black(member); + } + } + + // queue the heritage clauses + if (declaration.heritageClauses) { + for (let heritageClause of declaration.heritageClauses) { + enqueue_black(heritageClause); + } + } + } else { + enqueue_black(declaration); + } + } + } + node.forEachChild(loop); + }; + node.forEachChild(loop); + } +} + +function nodeIsInItsOwnDeclaration(nodeSourceFile: ts.SourceFile, node: ts.Node, symbol: ts.Symbol): boolean { + for (let i = 0, len = symbol.declarations.length; i < len; i++) { + const declaration = symbol.declarations[i]; + const declarationSourceFile = declaration.getSourceFile(); + + if (nodeSourceFile === declarationSourceFile) { + if (declaration.pos <= node.pos && node.end <= declaration.end) { + return true; + } + } + } + + return false; +} + +function generateResult(languageService: ts.LanguageService, shakeLevel: ShakeLevel): ITreeShakingResult { + const program = languageService.getProgram(); + + let result: ITreeShakingResult = {}; + const writeFile = (filePath: string, contents: string): void => { + result[filePath] = contents; + }; + + program.getSourceFiles().forEach((sourceFile) => { + const fileName = sourceFile.fileName; + if (/^defaultLib:/.test(fileName)) { + return; + } + const destination = fileName; + if (/\.d\.ts$/.test(fileName)) { + if (nodeOrChildIsBlack(sourceFile)) { + writeFile(destination, sourceFile.text); + } + return; + } + + let text = sourceFile.text; + let result = ''; + + function keep(node: ts.Node): void { + result += text.substring(node.pos, node.end); + } + function write(data: string): void { + result += data; + } + + function writeMarkedNodes(node: ts.Node): void { + if (getColor(node) === NodeColor.Black) { + return keep(node); + } + + // Always keep certain top-level statements + if (ts.isSourceFile(node.parent)) { + if (ts.isExpressionStatement(node) && ts.isStringLiteral(node.expression) && node.expression.text === 'use strict') { + return keep(node); + } + + if (ts.isVariableStatement(node) && nodeOrChildIsBlack(node)) { + return keep(node); + } + } + + // Keep the entire import in import * as X cases + if (ts.isImportDeclaration(node)) { + if (node.importClause && node.importClause.namedBindings) { + if (ts.isNamespaceImport(node.importClause.namedBindings)) { + if (getColor(node.importClause.namedBindings) === NodeColor.Black) { + return keep(node); + } + } else { + let survivingImports: string[] = []; + for (let i = 0; i < node.importClause.namedBindings.elements.length; i++) { + const importNode = node.importClause.namedBindings.elements[i]; + if (getColor(importNode) === NodeColor.Black) { + survivingImports.push(importNode.getFullText(sourceFile)); + } + } + const leadingTriviaWidth = node.getLeadingTriviaWidth(); + const leadingTrivia = sourceFile.text.substr(node.pos, leadingTriviaWidth); + if (survivingImports.length > 0) { + if (node.importClause && getColor(node.importClause) === NodeColor.Black) { + return write(`${leadingTrivia}import ${node.importClause.name.text}, {${survivingImports.join(',')} } from${node.moduleSpecifier.getFullText(sourceFile)};`); + } + return write(`${leadingTrivia}import {${survivingImports.join(',')} } from${node.moduleSpecifier.getFullText(sourceFile)};`); + } else { + if (node.importClause && getColor(node.importClause) === NodeColor.Black) { + return write(`${leadingTrivia}import ${node.importClause.name.text} from${node.moduleSpecifier.getFullText(sourceFile)};`); + } + } + } + } else { + if (node.importClause && getColor(node.importClause) === NodeColor.Black) { + return keep(node); + } + } + } + + if (shakeLevel === ShakeLevel.ClassMembers && (ts.isClassDeclaration(node) || ts.isInterfaceDeclaration(node)) && nodeOrChildIsBlack(node)) { + let toWrite = node.getFullText(); + for (let i = node.members.length - 1; i >= 0; i--) { + const member = node.members[i]; + if (getColor(member) === NodeColor.Black) { + // keep method + continue; + } + if (/^_(.*)Brand$/.test(member.name.getText())) { + // TODO: keep all members ending with `Brand`... + continue; + } + + let pos = member.pos - node.pos; + let end = member.end - node.pos; + toWrite = toWrite.substring(0, pos) + toWrite.substring(end); + } + return write(toWrite); + } + + if (ts.isFunctionDeclaration(node)) { + // Do not go inside functions if they haven't been marked + return; + } + + node.forEachChild(writeMarkedNodes); + } + + if (getColor(sourceFile) !== NodeColor.Black) { + if (!nodeOrChildIsBlack(sourceFile)) { + // none of the elements are reachable => don't write this file at all! + return; + } + sourceFile.forEachChild(writeMarkedNodes); + result += sourceFile.endOfFileToken.getFullText(sourceFile); + } else { + result = text; + } + + writeFile(destination, result); + }); + + return result; +} + +//#endregion + +//#region Utils + +/** + * Returns the node's symbol and the `import` node (if the symbol resolved from a different module) + */ +function getRealNodeSymbol(checker: ts.TypeChecker, node: ts.Node): [ts.Symbol, ts.Declaration] { + /** + * Returns the containing object literal property declaration given a possible name node, e.g. "a" in x = { "a": 1 } + */ + /* @internal */ + function getContainingObjectLiteralElement(node: ts.Node): ts.ObjectLiteralElement | undefined { + switch (node.kind) { + case ts.SyntaxKind.StringLiteral: + case ts.SyntaxKind.NumericLiteral: + if (node.parent.kind === ts.SyntaxKind.ComputedPropertyName) { + return ts.isObjectLiteralElement(node.parent.parent) ? node.parent.parent : undefined; + } + // falls through + case ts.SyntaxKind.Identifier: + return ts.isObjectLiteralElement(node.parent) && + (node.parent.parent.kind === ts.SyntaxKind.ObjectLiteralExpression || node.parent.parent.kind === ts.SyntaxKind.JsxAttributes) && + node.parent.name === node ? node.parent : undefined; + } + return undefined; + } + + function getPropertySymbolsFromType(type: ts.Type, propName: ts.PropertyName) { + function getTextOfPropertyName(name: ts.PropertyName): string { + + function isStringOrNumericLiteral(node: ts.Node): node is ts.StringLiteral | ts.NumericLiteral { + const kind = node.kind; + return kind === ts.SyntaxKind.StringLiteral + || kind === ts.SyntaxKind.NumericLiteral; + } + + switch (name.kind) { + case ts.SyntaxKind.Identifier: + return name.text; + case ts.SyntaxKind.StringLiteral: + case ts.SyntaxKind.NumericLiteral: + return name.text; + case ts.SyntaxKind.ComputedPropertyName: + return isStringOrNumericLiteral(name.expression) ? name.expression.text : undefined!; + } + } + + const name = getTextOfPropertyName(propName); + if (name && type) { + const result: ts.Symbol[] = []; + const symbol = type.getProperty(name); + if (type.flags & ts.TypeFlags.Union) { + for (const t of (type).types) { + const symbol = t.getProperty(name); + if (symbol) { + result.push(symbol); + } + } + return result; + } + + if (symbol) { + result.push(symbol); + return result; + } + } + return undefined; + } + + function getPropertySymbolsFromContextualType(typeChecker: ts.TypeChecker, node: ts.ObjectLiteralElement): ts.Symbol[] { + const objectLiteral = node.parent; + const contextualType = typeChecker.getContextualType(objectLiteral)!; + return getPropertySymbolsFromType(contextualType, node.name!)!; + } + + // Go to the original declaration for cases: + // + // (1) when the aliased symbol was declared in the location(parent). + // (2) when the aliased symbol is originating from an import. + // + function shouldSkipAlias(node: ts.Node, declaration: ts.Node): boolean { + if (node.kind !== ts.SyntaxKind.Identifier) { + return false; + } + if (node.parent === declaration) { + return true; + } + switch (declaration.kind) { + case ts.SyntaxKind.ImportClause: + case ts.SyntaxKind.ImportEqualsDeclaration: + return true; + case ts.SyntaxKind.ImportSpecifier: + return declaration.parent.kind === ts.SyntaxKind.NamedImports; + default: + return false; + } + } + + if (!ts.isShorthandPropertyAssignment(node)) { + if (node.getChildCount() !== 0) { + return [null, null]; + } + } + + let symbol = checker.getSymbolAtLocation(node); + let importNode: ts.Declaration = null; + if (symbol && symbol.flags & ts.SymbolFlags.Alias && shouldSkipAlias(node, symbol.declarations[0])) { + const aliased = checker.getAliasedSymbol(symbol); + if (aliased.declarations) { + // We should mark the import as visited + importNode = symbol.declarations[0]; + symbol = aliased; + } + } + + if (symbol) { + // Because name in short-hand property assignment has two different meanings: property name and property value, + // using go-to-definition at such position should go to the variable declaration of the property value rather than + // go to the declaration of the property name (in this case stay at the same position). However, if go-to-definition + // is performed at the location of property access, we would like to go to definition of the property in the short-hand + // assignment. This case and others are handled by the following code. + if (node.parent.kind === ts.SyntaxKind.ShorthandPropertyAssignment) { + symbol = checker.getShorthandAssignmentValueSymbol(symbol.valueDeclaration); + } + + // If the node is the name of a BindingElement within an ObjectBindingPattern instead of just returning the + // declaration the symbol (which is itself), we should try to get to the original type of the ObjectBindingPattern + // and return the property declaration for the referenced property. + // For example: + // import('./foo').then(({ b/*goto*/ar }) => undefined); => should get use to the declaration in file "./foo" + // + // function bar(onfulfilled: (value: T) => void) { //....} + // interface Test { + // pr/*destination*/op1: number + // } + // bar(({pr/*goto*/op1})=>{}); + if (ts.isPropertyName(node) && ts.isBindingElement(node.parent) && ts.isObjectBindingPattern(node.parent.parent) && + (node === (node.parent.propertyName || node.parent.name))) { + const type = checker.getTypeAtLocation(node.parent.parent); + if (type) { + const propSymbols = getPropertySymbolsFromType(type, node); + if (propSymbols) { + symbol = propSymbols[0]; + } + } + } + + // If the current location we want to find its definition is in an object literal, try to get the contextual type for the + // object literal, lookup the property symbol in the contextual type, and use this for goto-definition. + // For example + // interface Props{ + // /*first*/prop1: number + // prop2: boolean + // } + // function Foo(arg: Props) {} + // Foo( { pr/*1*/op1: 10, prop2: false }) + const element = getContainingObjectLiteralElement(node); + if (element && checker.getContextualType(element.parent as ts.Expression)) { + const propertySymbols = getPropertySymbolsFromContextualType(checker, element); + if (propertySymbols) { + symbol = propertySymbols[0]; + } + } + } + + if (symbol && symbol.declarations) { + return [symbol, importNode]; + } + + return [null, null]; +} + +/** Get the token whose text contains the position */ +function getTokenAtPosition(sourceFile: ts.SourceFile, position: number, allowPositionInLeadingTrivia: boolean, includeEndPosition: boolean): ts.Node { + let current: ts.Node = sourceFile; + outer: while (true) { + // find the child that contains 'position' + for (const child of current.getChildren()) { + const start = allowPositionInLeadingTrivia ? child.getFullStart() : child.getStart(sourceFile, /*includeJsDoc*/ true); + if (start > position) { + // If this child begins after position, then all subsequent children will as well. + break; + } + + const end = child.getEnd(); + if (position < end || (position === end && (child.kind === ts.SyntaxKind.EndOfFileToken || includeEndPosition))) { + current = child; + continue outer; + } + } + + return current; + } +} + +//#endregion diff --git a/build/lib/tslint/noStandaloneEditorRule.js b/build/lib/tslint/noStandaloneEditorRule.js new file mode 100644 index 0000000000..2beeaa6d9c --- /dev/null +++ b/build/lib/tslint/noStandaloneEditorRule.js @@ -0,0 +1,73 @@ +"use strict"; +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the Source EULA. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +var __extends = (this && this.__extends) || (function () { + var extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +var ts = require("typescript"); +var Lint = require("tslint"); +var path_1 = require("path"); +var Rule = /** @class */ (function (_super) { + __extends(Rule, _super); + function Rule() { + return _super !== null && _super.apply(this, arguments) || this; + } + Rule.prototype.apply = function (sourceFile) { + if (/vs(\/|\\)editor/.test(sourceFile.fileName)) { + // the vs/editor folder is allowed to use the standalone editor + return []; + } + return this.applyWithWalker(new NoStandaloneEditorRuleWalker(sourceFile, this.getOptions())); + }; + return Rule; +}(Lint.Rules.AbstractRule)); +exports.Rule = Rule; +var NoStandaloneEditorRuleWalker = /** @class */ (function (_super) { + __extends(NoStandaloneEditorRuleWalker, _super); + function NoStandaloneEditorRuleWalker(file, opts) { + return _super.call(this, file, opts) || this; + } + NoStandaloneEditorRuleWalker.prototype.visitImportEqualsDeclaration = function (node) { + if (node.moduleReference.kind === ts.SyntaxKind.ExternalModuleReference) { + this._validateImport(node.moduleReference.expression.getText(), node); + } + }; + NoStandaloneEditorRuleWalker.prototype.visitImportDeclaration = function (node) { + this._validateImport(node.moduleSpecifier.getText(), node); + }; + NoStandaloneEditorRuleWalker.prototype.visitCallExpression = function (node) { + _super.prototype.visitCallExpression.call(this, node); + // import('foo') statements inside the code + if (node.expression.kind === ts.SyntaxKind.ImportKeyword) { + var path = node.arguments[0]; + this._validateImport(path.getText(), node); + } + }; + NoStandaloneEditorRuleWalker.prototype._validateImport = function (path, node) { + // remove quotes + path = path.slice(1, -1); + // resolve relative paths + if (path[0] === '.') { + path = path_1.join(this.getSourceFile().fileName, path); + } + if (/vs(\/|\\)editor(\/|\\)standalone/.test(path) + || /vs(\/|\\)editor(\/|\\)common(\/|\\)standalone/.test(path) + || /vs(\/|\\)editor(\/|\\)editor.api/.test(path) + || /vs(\/|\\)editor(\/|\\)editor.main/.test(path) + || /vs(\/|\\)editor(\/|\\)editor.worker/.test(path)) { + // {{SQL CARBON EDIT}} + //this.addFailure(this.createFailure(node.getStart(), node.getWidth(), `Not allowed to import standalone editor modules. See https://github.com/Microsoft/vscode/wiki/Code-Organization`)); + } + }; + return NoStandaloneEditorRuleWalker; +}(Lint.RuleWalker)); diff --git a/build/lib/tslint/noStandaloneEditorRule.ts b/build/lib/tslint/noStandaloneEditorRule.ts new file mode 100644 index 0000000000..151be630c1 --- /dev/null +++ b/build/lib/tslint/noStandaloneEditorRule.ts @@ -0,0 +1,66 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the Source EULA. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import * as ts from 'typescript'; +import * as Lint from 'tslint'; +import { join } from 'path'; + +export class Rule extends Lint.Rules.AbstractRule { + public apply(sourceFile: ts.SourceFile): Lint.RuleFailure[] { + if (/vs(\/|\\)editor/.test(sourceFile.fileName)) { + // the vs/editor folder is allowed to use the standalone editor + return []; + } + return this.applyWithWalker(new NoStandaloneEditorRuleWalker(sourceFile, this.getOptions())); + } +} + +class NoStandaloneEditorRuleWalker extends Lint.RuleWalker { + + constructor(file: ts.SourceFile, opts: Lint.IOptions) { + super(file, opts); + } + + protected visitImportEqualsDeclaration(node: ts.ImportEqualsDeclaration): void { + if (node.moduleReference.kind === ts.SyntaxKind.ExternalModuleReference) { + this._validateImport(node.moduleReference.expression.getText(), node); + } + } + + protected visitImportDeclaration(node: ts.ImportDeclaration): void { + this._validateImport(node.moduleSpecifier.getText(), node); + } + + protected visitCallExpression(node: ts.CallExpression): void { + super.visitCallExpression(node); + + // import('foo') statements inside the code + if (node.expression.kind === ts.SyntaxKind.ImportKeyword) { + const [path] = node.arguments; + this._validateImport(path.getText(), node); + } + } + + private _validateImport(path: string, node: ts.Node): void { + // remove quotes + path = path.slice(1, -1); + + // resolve relative paths + if (path[0] === '.') { + path = join(this.getSourceFile().fileName, path); + } + + if ( + /vs(\/|\\)editor(\/|\\)standalone/.test(path) + || /vs(\/|\\)editor(\/|\\)common(\/|\\)standalone/.test(path) + || /vs(\/|\\)editor(\/|\\)editor.api/.test(path) + || /vs(\/|\\)editor(\/|\\)editor.main/.test(path) + || /vs(\/|\\)editor(\/|\\)editor.worker/.test(path) + ) { + // {{SQL CARBON EDIT}} + //this.addFailure(this.createFailure(node.getStart(), node.getWidth(), `Not allowed to import standalone editor modules. See https://github.com/Microsoft/vscode/wiki/Code-Organization`)); + } + } +} diff --git a/build/lib/util.js b/build/lib/util.js index 35341b5703..e028ba66e9 100644 --- a/build/lib/util.js +++ b/build/lib/util.js @@ -14,7 +14,6 @@ var fs = require("fs"); var _rimraf = require("rimraf"); var git = require("./git"); var VinylFile = require("vinyl"); -var cp = require("child_process"); var NoCancellationToken = { isCancellationRequested: function () { return false; } }; function incremental(streamProvider, initial, supportsCancellation) { var input = es.through(); @@ -211,62 +210,6 @@ function filter(fn) { return result; } exports.filter = filter; -function tagExists(tagName) { - try { - cp.execSync("git rev-parse " + tagName, { stdio: 'ignore' }); - return true; - } - catch (e) { - return false; - } -} -/** - * Returns the version previous to the given version. Throws if a git tag for that version doesn't exist. - * Given 1.17.2, return 1.17.1 - * 1.18.0 => 1.17.2. (or the highest 1.17.x) - * 2.0.0 => 1.18.0 (or the highest 1.x) - */ -function getPreviousVersion(versionStr, _tagExists) { - if (_tagExists === void 0) { _tagExists = tagExists; } - function getLatestTagFromBase(semverArr, componentToTest) { - var baseVersion = semverArr.join('.'); - if (!_tagExists(baseVersion)) { - throw new Error('Failed to find git tag for base version, ' + baseVersion); - } - var goodTag; - do { - goodTag = semverArr.join('.'); - semverArr[componentToTest]++; - } while (_tagExists(semverArr.join('.'))); - return goodTag; - } - var semverArr = versionStringToNumberArray(versionStr); - if (semverArr[2] > 0) { - semverArr[2]--; - var previous = semverArr.join('.'); - if (!_tagExists(previous)) { - throw new Error('Failed to find git tag for previous version, ' + previous); - } - return previous; - } - else if (semverArr[1] > 0) { - semverArr[1]--; - return getLatestTagFromBase(semverArr, 2); - } - else { - semverArr[0]--; - // Find 1.x.0 for latest x - var latestMinorVersion = getLatestTagFromBase(semverArr, 1); - // Find 1.x.y for latest y - return getLatestTagFromBase(versionStringToNumberArray(latestMinorVersion), 2); - } -} -exports.getPreviousVersion = getPreviousVersion; -function versionStringToNumberArray(versionStr) { - return versionStr - .split('.') - .map(function (s) { return parseInt(s); }); -} function versionStringToNumber(versionStr) { var semverRegex = /(\d+)\.(\d+)\.(\d+)/; var match = versionStr.match(semverRegex); diff --git a/build/lib/util.ts b/build/lib/util.ts index 75c84685b7..257d08959e 100644 --- a/build/lib/util.ts +++ b/build/lib/util.ts @@ -17,7 +17,6 @@ import * as git from './git'; import * as VinylFile from 'vinyl'; import { ThroughStream } from 'through'; import * as sm from 'source-map'; -import * as cp from 'child_process'; export interface ICancellationToken { isCancellationRequested(): boolean; @@ -271,66 +270,6 @@ export function filter(fn: (data: any) => boolean): FilterStream { return result; } -function tagExists(tagName: string): boolean { - try { - cp.execSync(`git rev-parse ${tagName}`, { stdio: 'ignore' }); - return true; - } catch (e) { - return false; - } -} - -/** - * Returns the version previous to the given version. Throws if a git tag for that version doesn't exist. - * Given 1.17.2, return 1.17.1 - * 1.18.0 => 1.17.2. (or the highest 1.17.x) - * 2.0.0 => 1.18.0 (or the highest 1.x) - */ -export function getPreviousVersion(versionStr: string, _tagExists = tagExists) { - function getLatestTagFromBase(semverArr: number[], componentToTest: number): string { - const baseVersion = semverArr.join('.'); - if (!_tagExists(baseVersion)) { - throw new Error('Failed to find git tag for base version, ' + baseVersion); - } - - let goodTag; - do { - goodTag = semverArr.join('.'); - semverArr[componentToTest]++; - } while (_tagExists(semverArr.join('.'))); - - return goodTag; - } - - const semverArr = versionStringToNumberArray(versionStr); - if (semverArr[2] > 0) { - semverArr[2]--; - const previous = semverArr.join('.'); - if (!_tagExists(previous)) { - throw new Error('Failed to find git tag for previous version, ' + previous); - } - - return previous; - } else if (semverArr[1] > 0) { - semverArr[1]--; - return getLatestTagFromBase(semverArr, 2); - } else { - semverArr[0]--; - - // Find 1.x.0 for latest x - const latestMinorVersion = getLatestTagFromBase(semverArr, 1); - - // Find 1.x.y for latest y - return getLatestTagFromBase(versionStringToNumberArray(latestMinorVersion), 2); - } -} - -function versionStringToNumberArray(versionStr: string): number[] { - return versionStr - .split('.') - .map(s => parseInt(s)); -} - export function versionStringToNumber(versionStr: string) { const semverRegex = /(\d+)\.(\d+)\.(\d+)/; const match = versionStr.match(semverRegex); diff --git a/build/monaco/api.js b/build/monaco/api.js index 6ea2b5be09..c63ff0a90e 100644 --- a/build/monaco/api.js +++ b/build/monaco/api.js @@ -134,7 +134,25 @@ function getTopLevelDeclaration(sourceFile, typeName) { function getNodeText(sourceFile, node) { return sourceFile.getFullText().substring(node.pos, node.end); } -function getMassagedTopLevelDeclarationText(sourceFile, declaration) { +function hasModifier(modifiers, kind) { + if (modifiers) { + for (var i = 0; i < modifiers.length; i++) { + var mod = modifiers[i]; + if (mod.kind === kind) { + return true; + } + } + } + return false; +} +function isStatic(member) { + return hasModifier(member.modifiers, ts.SyntaxKind.StaticKeyword); +} +function isDefaultExport(declaration) { + return (hasModifier(declaration.modifiers, ts.SyntaxKind.DefaultKeyword) + && hasModifier(declaration.modifiers, ts.SyntaxKind.ExportKeyword)); +} +function getMassagedTopLevelDeclarationText(sourceFile, declaration, importName, usage) { var result = getNodeText(sourceFile, declaration); // if (result.indexOf('MonacoWorker') >= 0) { // console.log('here!'); @@ -142,6 +160,18 @@ function getMassagedTopLevelDeclarationText(sourceFile, declaration) { // } if (declaration.kind === ts.SyntaxKind.InterfaceDeclaration || declaration.kind === ts.SyntaxKind.ClassDeclaration) { var interfaceDeclaration = declaration; + var staticTypeName_1 = (isDefaultExport(interfaceDeclaration) + ? importName + ".default" + : importName + "." + declaration.name.text); + var instanceTypeName_1 = staticTypeName_1; + var typeParametersCnt = (interfaceDeclaration.typeParameters ? interfaceDeclaration.typeParameters.length : 0); + if (typeParametersCnt > 0) { + var arr = []; + for (var i = 0; i < typeParametersCnt; i++) { + arr.push('any'); + } + instanceTypeName_1 = instanceTypeName_1 + "<" + arr.join(',') + ">"; + } var members = interfaceDeclaration.members; members.forEach(function (member) { try { @@ -151,6 +181,15 @@ function getMassagedTopLevelDeclarationText(sourceFile, declaration) { result = result.replace(memberText, ''); // console.log('AFTER: ', result); } + else { + var memberName = member.name.text; + if (isStatic(member)) { + usage.push("a = " + staticTypeName_1 + "." + memberName + ";"); + } + else { + usage.push("a = (<" + instanceTypeName_1 + ">b)." + memberName + ";"); + } + } } catch (err) { // life.. @@ -211,6 +250,16 @@ function generateDeclarationFile(out, inputFiles, recipe) { var endl = /\r\n/.test(recipe) ? '\r\n' : '\n'; var lines = recipe.split(endl); var result = []; + var usageCounter = 0; + var usageImports = []; + var usage = []; + usage.push("var a;"); + usage.push("var b;"); + var generateUsageImport = function (moduleId) { + var importName = 'm' + (++usageCounter); + usageImports.push("import * as " + importName + " from '" + moduleId.replace(/\.d\.ts$/, '') + "';"); + return importName; + }; lines.forEach(function (line) { var m1 = line.match(/^\s*#include\(([^;)]*)(;[^)]*)?\)\:(.*)$/); if (m1) { @@ -220,6 +269,7 @@ function generateDeclarationFile(out, inputFiles, recipe) { if (!sourceFile_1) { return; } + var importName_1 = generateUsageImport(moduleId); var replacer_1 = createReplacer(m1[2]); var typeNames = m1[3].split(/,/); typeNames.forEach(function (typeName) { @@ -232,7 +282,7 @@ function generateDeclarationFile(out, inputFiles, recipe) { logErr('Cannot find type ' + typeName); return; } - result.push(replacer_1(getMassagedTopLevelDeclarationText(sourceFile_1, declaration))); + result.push(replacer_1(getMassagedTopLevelDeclarationText(sourceFile_1, declaration, importName_1, usage))); }); return; } @@ -244,6 +294,7 @@ function generateDeclarationFile(out, inputFiles, recipe) { if (!sourceFile_2) { return; } + var importName_2 = generateUsageImport(moduleId); var replacer_2 = createReplacer(m2[2]); var typeNames = m2[3].split(/,/); var typesToExcludeMap_1 = {}; @@ -271,7 +322,7 @@ function generateDeclarationFile(out, inputFiles, recipe) { } } } - result.push(replacer_2(getMassagedTopLevelDeclarationText(sourceFile_2, declaration))); + result.push(replacer_2(getMassagedTopLevelDeclarationText(sourceFile_2, declaration, importName_2, usage))); }); return; } @@ -282,9 +333,12 @@ function generateDeclarationFile(out, inputFiles, recipe) { resultTxt = resultTxt.replace(/\bEvent, kind: ts.SyntaxKind): boolean { + if (modifiers) { + for (let i = 0; i < modifiers.length; i++) { + let mod = modifiers[i]; + if (mod.kind === kind) { + return true; + } + } + } + return false; +} -function getMassagedTopLevelDeclarationText(sourceFile: ts.SourceFile, declaration: TSTopLevelDeclare): string { +function isStatic(member: ts.ClassElement | ts.TypeElement): boolean { + return hasModifier(member.modifiers, ts.SyntaxKind.StaticKeyword); +} + +function isDefaultExport(declaration: ts.InterfaceDeclaration | ts.ClassDeclaration): boolean { + return ( + hasModifier(declaration.modifiers, ts.SyntaxKind.DefaultKeyword) + && hasModifier(declaration.modifiers, ts.SyntaxKind.ExportKeyword) + ); +} + +function getMassagedTopLevelDeclarationText(sourceFile: ts.SourceFile, declaration: TSTopLevelDeclare, importName: string, usage: string[]): string { let result = getNodeText(sourceFile, declaration); // if (result.indexOf('MonacoWorker') >= 0) { // console.log('here!'); @@ -163,7 +185,23 @@ function getMassagedTopLevelDeclarationText(sourceFile: ts.SourceFile, declarati if (declaration.kind === ts.SyntaxKind.InterfaceDeclaration || declaration.kind === ts.SyntaxKind.ClassDeclaration) { let interfaceDeclaration = declaration; - let members: ts.NodeArray = interfaceDeclaration.members; + const staticTypeName = ( + isDefaultExport(interfaceDeclaration) + ? `${importName}.default` + : `${importName}.${declaration.name.text}` + ); + + let instanceTypeName = staticTypeName; + const typeParametersCnt = (interfaceDeclaration.typeParameters ? interfaceDeclaration.typeParameters.length : 0); + if (typeParametersCnt > 0) { + let arr: string[] = []; + for (let i = 0; i < typeParametersCnt; i++) { + arr.push('any'); + } + instanceTypeName = `${instanceTypeName}<${arr.join(',')}>`; + } + + const members: ts.NodeArray = interfaceDeclaration.members; members.forEach((member) => { try { let memberText = getNodeText(sourceFile, member); @@ -171,6 +209,13 @@ function getMassagedTopLevelDeclarationText(sourceFile: ts.SourceFile, declarati // console.log('BEFORE: ', result); result = result.replace(memberText, ''); // console.log('AFTER: ', result); + } else { + const memberName = (member.name).text; + if (isStatic(member)) { + usage.push(`a = ${staticTypeName}.${memberName};`); + } else { + usage.push(`a = (<${instanceTypeName}>b).${memberName};`); + } } } catch (err) { // life.. @@ -237,11 +282,24 @@ function createReplacer(data: string): (str: string) => string { }; } -function generateDeclarationFile(out: string, inputFiles: { [file: string]: string; }, recipe: string): string { +function generateDeclarationFile(out: string, inputFiles: { [file: string]: string; }, recipe: string): [string, string] { const endl = /\r\n/.test(recipe) ? '\r\n' : '\n'; let lines = recipe.split(endl); - let result = []; + let result: string[] = []; + + let usageCounter = 0; + let usageImports: string[] = []; + let usage: string[] = []; + + usage.push(`var a;`); + usage.push(`var b;`); + + const generateUsageImport = (moduleId: string) => { + let importName = 'm' + (++usageCounter); + usageImports.push(`import * as ${importName} from '${moduleId.replace(/\.d\.ts$/, '')}';`); + return importName; + }; lines.forEach(line => { @@ -254,6 +312,8 @@ function generateDeclarationFile(out: string, inputFiles: { [file: string]: stri return; } + const importName = generateUsageImport(moduleId); + let replacer = createReplacer(m1[2]); let typeNames = m1[3].split(/,/); @@ -267,7 +327,7 @@ function generateDeclarationFile(out: string, inputFiles: { [file: string]: stri logErr('Cannot find type ' + typeName); return; } - result.push(replacer(getMassagedTopLevelDeclarationText(sourceFile, declaration))); + result.push(replacer(getMassagedTopLevelDeclarationText(sourceFile, declaration, importName, usage))); }); return; } @@ -281,6 +341,8 @@ function generateDeclarationFile(out: string, inputFiles: { [file: string]: stri return; } + const importName = generateUsageImport(moduleId); + let replacer = createReplacer(m2[2]); let typeNames = m2[3].split(/,/); @@ -309,7 +371,7 @@ function generateDeclarationFile(out: string, inputFiles: { [file: string]: stri } } } - result.push(replacer(getMassagedTopLevelDeclarationText(sourceFile, declaration))); + result.push(replacer(getMassagedTopLevelDeclarationText(sourceFile, declaration, importName, usage))); }); return; } @@ -324,10 +386,13 @@ function generateDeclarationFile(out: string, inputFiles: { [file: string]: stri resultTxt = format(resultTxt); - return resultTxt; + return [ + resultTxt, + `${usageImports.join('\n')}\n\n${usage.join('\n')}` + ]; } -export function getFilesToWatch(out: string): string[] { +function getIncludesInRecipe(): string[] { let recipe = fs.readFileSync(RECIPE_PATH).toString(); let lines = recipe.split(/\r\n|\n|\r/); let result = []; @@ -337,14 +402,14 @@ export function getFilesToWatch(out: string): string[] { let m1 = line.match(/^\s*#include\(([^;)]*)(;[^)]*)?\)\:(.*)$/); if (m1) { let moduleId = m1[1]; - result.push(moduleIdToPath(out, moduleId)); + result.push(moduleId); return; } let m2 = line.match(/^\s*#includeAll\(([^;)]*)(;[^)]*)?\)\:(.*)$/); if (m2) { let moduleId = m2[1]; - result.push(moduleIdToPath(out, moduleId)); + result.push(moduleId); return; } }); @@ -352,8 +417,13 @@ export function getFilesToWatch(out: string): string[] { return result; } +export function getFilesToWatch(out: string): string[] { + return getIncludesInRecipe().map((moduleId) => moduleIdToPath(out, moduleId)); +} + export interface IMonacoDeclarationResult { content: string; + usageContent: string; filePath: string; isTheSame: boolean; } @@ -363,7 +433,7 @@ export function run(out: string, inputFiles: { [file: string]: string; }): IMona SOURCE_FILE_MAP = {}; let recipe = fs.readFileSync(RECIPE_PATH).toString(); - let result = generateDeclarationFile(out, inputFiles, recipe); + let [result, usageContent] = generateDeclarationFile(out, inputFiles, recipe); let currentContent = fs.readFileSync(DECLARATION_PATH).toString(); log('Finished monaco.d.ts generation'); @@ -374,6 +444,7 @@ export function run(out: string, inputFiles: { [file: string]: string; }): IMona return { content: result, + usageContent: usageContent, filePath: DECLARATION_PATH, isTheSame }; @@ -382,3 +453,96 @@ export function run(out: string, inputFiles: { [file: string]: string; }): IMona export function complainErrors() { logErr('Not running monaco.d.ts generation due to compile errors'); } + + + +interface ILibMap { [libName: string]: string; } +interface IFileMap { [fileName: string]: string; } + +class TypeScriptLanguageServiceHost implements ts.LanguageServiceHost { + + private readonly _libs: ILibMap; + private readonly _files: IFileMap; + private readonly _compilerOptions: ts.CompilerOptions; + + constructor(libs: ILibMap, files: IFileMap, compilerOptions: ts.CompilerOptions) { + this._libs = libs; + this._files = files; + this._compilerOptions = compilerOptions; + } + + // --- language service host --------------- + + getCompilationSettings(): ts.CompilerOptions { + return this._compilerOptions; + } + getScriptFileNames(): string[] { + return ( + [] + .concat(Object.keys(this._libs)) + .concat(Object.keys(this._files)) + ); + } + getScriptVersion(fileName: string): string { + return '1'; + } + getProjectVersion(): string { + return '1'; + } + getScriptSnapshot(fileName: string): ts.IScriptSnapshot { + if (this._files.hasOwnProperty(fileName)) { + return ts.ScriptSnapshot.fromString(this._files[fileName]); + } else if (this._libs.hasOwnProperty(fileName)) { + return ts.ScriptSnapshot.fromString(this._libs[fileName]); + } else { + return ts.ScriptSnapshot.fromString(''); + } + } + getScriptKind(fileName: string): ts.ScriptKind { + return ts.ScriptKind.TS; + } + getCurrentDirectory(): string { + return ''; + } + getDefaultLibFileName(options: ts.CompilerOptions): string { + return 'defaultLib:es5'; + } + isDefaultLibFileName(fileName: string): boolean { + return fileName === this.getDefaultLibFileName(this._compilerOptions); + } +} + +export function execute(): IMonacoDeclarationResult { + + const OUTPUT_FILES: { [file: string]: string; } = {}; + const SRC_FILES: IFileMap = {}; + const SRC_FILE_TO_EXPECTED_NAME: { [filename: string]: string; } = {}; + getIncludesInRecipe().forEach((moduleId) => { + if (/\.d\.ts$/.test(moduleId)) { + let fileName = path.join(SRC, moduleId); + OUTPUT_FILES[moduleIdToPath('src', moduleId)] = fs.readFileSync(fileName).toString(); + return; + } + + let fileName = path.join(SRC, moduleId) + '.ts'; + SRC_FILES[fileName] = fs.readFileSync(fileName).toString(); + SRC_FILE_TO_EXPECTED_NAME[fileName] = moduleIdToPath('src', moduleId); + }); + + const languageService = ts.createLanguageService(new TypeScriptLanguageServiceHost({}, SRC_FILES, {})); + + var t1 = Date.now(); + Object.keys(SRC_FILES).forEach((fileName) => { + var t = Date.now(); + const emitOutput = languageService.getEmitOutput(fileName, true); + OUTPUT_FILES[SRC_FILE_TO_EXPECTED_NAME[fileName]] = emitOutput.outputFiles[0].text; + // console.log(`Generating .d.ts for ${fileName} took ${Date.now() - t} ms`); + }); + console.log(`Generating .d.ts took ${Date.now() - t1} ms`); + + // console.log(result.filePath); + // fs.writeFileSync(result.filePath, result.content.replace(/\r\n/gm, '\n')); + // fs.writeFileSync(path.join(SRC, 'user.ts'), result.usageContent.replace(/\r\n/gm, '\n')); + + return run('src', OUTPUT_FILES); +} diff --git a/build/monaco/monaco.d.ts.recipe b/build/monaco/monaco.d.ts.recipe index 5774aeed0d..54a6633c2e 100644 --- a/build/monaco/monaco.d.ts.recipe +++ b/build/monaco/monaco.d.ts.recipe @@ -32,6 +32,10 @@ declare namespace monaco { Error = 3, } + export enum MarkerTag { + Unnecessary = 1, + } + export enum MarkerSeverity { Hint = 1, Info = 2, diff --git a/build/monaco/monaco.usage.recipe b/build/monaco/monaco.usage.recipe new file mode 100644 index 0000000000..05377a19ba --- /dev/null +++ b/build/monaco/monaco.usage.recipe @@ -0,0 +1,82 @@ + +// This file is adding references to various symbols which should not be removed via tree shaking + +import { ServiceIdentifier } from 'vs/platform/instantiation/common/instantiation'; +import { IContextViewService } from 'vs/platform/contextview/browser/contextView'; +import { IHighlight } from 'vs/base/parts/quickopen/browser/quickOpenModel'; +import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; +import { IEnvironmentService } from 'vs/platform/environment/common/environment'; +import { CountBadge } from 'vs/base/browser/ui/countBadge/countBadge'; +import { SimpleWorkerClient, create as create1 } from 'vs/base/common/worker/simpleWorker'; +import { create as create2 } from 'vs/editor/common/services/editorSimpleWorker'; +import { QuickOpenWidget } from 'vs/base/parts/quickopen/browser/quickOpenWidget'; +import { SyncDescriptor0, SyncDescriptor1, SyncDescriptor2, SyncDescriptor3, SyncDescriptor4, SyncDescriptor5, SyncDescriptor6, SyncDescriptor7, SyncDescriptor8 } from 'vs/platform/instantiation/common/descriptors'; +import { PolyfillPromise } from 'vs/base/common/winjs.polyfill.promise'; +import { DiffNavigator } from 'vs/editor/browser/widget/diffNavigator'; +import * as editorAPI from 'vs/editor/editor.api'; + +(function () { + var a: any; + var b: any; + a = (b).layout; // IContextViewProvider + a = (b).getWorkspaceFolder; // IWorkspaceFolderProvider + a = (b).getWorkspace; // IWorkspaceFolderProvider + a = (b).style; // IThemable + a = (b).style; // IThemable + a = (b).userHome; // IUserHomeProvider + a = (b).previous; // IDiffNavigator + a = (>b).type; + a = (b).start; + a = (b).end; + a = (>b).getProxyObject; // IWorkerClient + a = create1; + a = create2; + + // promise polyfill + a = PolyfillPromise.all; + a = PolyfillPromise.race; + a = PolyfillPromise.resolve; + a = PolyfillPromise.reject; + a = (b).then; + a = (b).catch; + + // injection madness + a = (>b).ctor; + a = (>b).bind; + a = (>b).ctor; + a = (>b).bind; + a = (>b).ctor; + a = (>b).bind; + a = (>b).ctor; + a = (>b).bind; + a = (>b).ctor; + a = (>b).bind; + a = (>b).ctor; + a = (>b).bind; + a = (>b).ctor; + a = (>b).bind; + a = (>b).ctor; + a = (>b).bind; + a = (>b).ctor; + a = (>b).bind; + a = (>b).ctor; + a = (>b).bind; + + // exported API + a = editorAPI.CancellationTokenSource; + a = editorAPI.Emitter; + a = editorAPI.KeyCode; + a = editorAPI.KeyMod; + a = editorAPI.Position; + a = editorAPI.Range; + a = editorAPI.Selection; + a = editorAPI.SelectionDirection; + a = editorAPI.Severity; + a = editorAPI.MarkerSeverity; + a = editorAPI.MarkerTag; + a = editorAPI.Promise; + a = editorAPI.Uri; + a = editorAPI.Token; + a = editorAPI.editor; + a = editorAPI.languages; +})(); diff --git a/build/npm/postinstall.js b/build/npm/postinstall.js index 6b8a3bde0b..874c4bf868 100644 --- a/build/npm/postinstall.js +++ b/build/npm/postinstall.js @@ -20,7 +20,6 @@ function yarnInstall(location, opts) { } } -// {{SQL CARBON EDIT}} yarnInstall('extensions'); // node modules shared by all extensions const allExtensionFolders = fs.readdirSync('extensions'); diff --git a/build/npm/update-grammar.js b/build/npm/update-grammar.js index f6490f626e..79e4b25563 100644 --- a/build/npm/update-grammar.js +++ b/build/npm/update-grammar.js @@ -83,7 +83,7 @@ exports.update = function (repoId, repoPath, dest, modifyGrammar, version = 'mas grammar = plist.parse(content); } else if (ext === '.cson') { grammar = cson.parse(content); - } else if (ext === '.json') { + } else if (ext === '.json' || ext === '.JSON-tmLanguage') { grammar = JSON.parse(content); } else { return Promise.reject(new Error('Unknown file extension: ' + ext)); diff --git a/build/npm/update-localization-extension.js b/build/npm/update-localization-extension.js index 5e656907d0..6fbbd68915 100644 --- a/build/npm/update-localization-extension.js +++ b/build/npm/update-localization-extension.js @@ -43,7 +43,12 @@ function update(idOrPath) { let apiToken = process.env.TRANSIFEX_API_TOKEN; let languageId = localization.transifexId || localization.languageId; let translationDataFolder = path.join(locExtFolder, 'translations'); - + if (languageId === "zh-cn") { + languageId = "zh-hans"; + } + if (languageId === "zh-tw") { + languageId = "zh-hant"; + } if (fs.existsSync(translationDataFolder) && fs.existsSync(path.join(translationDataFolder, 'main.i18n.json'))) { console.log('Clearing \'' + translationDataFolder + '\'...'); rimraf.sync(translationDataFolder); diff --git a/build/package.json b/build/package.json index 56886c4836..350a35a761 100644 --- a/build/package.json +++ b/build/package.json @@ -17,7 +17,7 @@ "fs-extra-promise": "^1.0.1", "mime": "^1.3.4", "minimist": "^1.2.0", - "typescript": "2.8.1", + "typescript": "2.9.2", "vscode": "^1.0.1", "xml2js": "^0.4.17", "github-releases": "^0.4.1", diff --git a/build/tfs/common/common.sh b/build/tfs/common/common.sh deleted file mode 100644 index c64e3c881f..0000000000 --- a/build/tfs/common/common.sh +++ /dev/null @@ -1,43 +0,0 @@ -#!/bin/bash -set -e - -# set agent specific npm cache -if [ -n "$AGENT_WORKFOLDER" ] -then - export npm_config_cache="$AGENT_WORKFOLDER/npm-cache" - echo "Using npm cache: $npm_config_cache" - - export YARN_CACHE_FOLDER="$AGENT_WORKFOLDER/yarn-cache" - echo "Using yarn cache: $YARN_CACHE_FOLDER" -fi - -SUMMARY="Task;Duration"$'\n' -step() { - START=$SECONDS - TASK=$1; shift - echo "" - echo "*****************************************************************************" - echo "Start: $TASK" - echo "*****************************************************************************" - "$@" - - # Calculate total duration - TOTAL=$(echo "$SECONDS - $START" | bc) - M=$(echo "$TOTAL / 60" | bc) - S=$(echo "$TOTAL % 60" | bc) - DURATION="$(printf "%02d" $M):$(printf "%02d" $S)" - - echo "*****************************************************************************" - echo "End: $TASK, Total: $DURATION" - echo "*****************************************************************************" - SUMMARY="$SUMMARY$TASK;$DURATION"$'\n' -} - -done_steps() { - echo "" - echo "Build Summary" - echo "=============" - echo "${SUMMARY}" | column -t -s';' -} - -trap done_steps EXIT \ No newline at end of file diff --git a/build/tfs/common/node.sh b/build/tfs/common/node.sh deleted file mode 100644 index cc1bb74d01..0000000000 --- a/build/tfs/common/node.sh +++ /dev/null @@ -1,18 +0,0 @@ -#!/bin/bash -set -e - -# setup nvm -if [[ "$OSTYPE" == "darwin"* ]]; then - export NVM_DIR=~/.nvm - source $(brew --prefix nvm)/nvm.sh --no-use -else - source $NVM_DIR/nvm.sh --no-use -fi - -# install node -NODE_VERSION=8.9.1 -nvm install $NODE_VERSION -nvm use $NODE_VERSION - -# install yarn -npm i -g yarn \ No newline at end of file diff --git a/build/tfs/continuous-build.yml b/build/tfs/continuous-build.yml index 107c7ff9cd..a2cfee5401 100644 --- a/build/tfs/continuous-build.yml +++ b/build/tfs/continuous-build.yml @@ -2,99 +2,14 @@ phases: - phase: Windows queue: Hosted VS2017 steps: - - task: NodeTool@0 - inputs: - versionSpec: "8.9.1" - - task: geeklearningio.gl-vsts-tasks-yarn.yarn-installer-task.YarnInstaller@2 - inputs: - versionSpec: "1.3.2" - - powershell: | - $ErrorActionPreference = "Stop" - yarn - .\node_modules\.bin\gulp electron - npm run gulp -- hygiene - .\node_modules\.bin\tsc -p .\src\tsconfig.monaco.json --noEmit - npm run compile - node build/lib/builtInExtensions.js - name: build - - powershell: | - $ErrorActionPreference = "Stop" - .\scripts\test.bat --tfs - .\scripts\test-integration.bat - yarn smoketest --screenshots "$(Build.ArtifactStagingDirectory)\artifacts" --log "$(Build.ArtifactStagingDirectory)\artifacts\smoketest.log" - name: test - - task: PublishBuildArtifacts@1 - inputs: - PathtoPublish: '$(Build.ArtifactStagingDirectory)/artifacts' - ArtifactName: build-artifacts-win32 - publishLocation: Container - condition: succeededOrFailed() + - template: win32/continuous-build-win32.yml - phase: Linux queue: Hosted Linux Preview steps: - - script: | - set -e - apt-get update - apt-get install -y libxkbfile-dev pkg-config libsecret-1-dev libxss1 libgconf-2-4 dbus xvfb libgtk-3-0 - cp build/tfs/linux/x64/xvfb.init /etc/init.d/xvfb - chmod +x /etc/init.d/xvfb - update-rc.d xvfb defaults - ln -sf /bin/dbus-daemon /usr/bin/dbus-daemon - service xvfb start - service dbus start - - task: NodeTool@0 - inputs: - versionSpec: "8.9.1" - - task: geeklearningio.gl-vsts-tasks-yarn.yarn-installer-task.YarnInstaller@2 - inputs: - versionSpec: "1.3.2" - - script: | - set -e - yarn - npm run gulp -- electron-x64 - - script: | - set -e - npm run gulp -- hygiene - ./node_modules/.bin/tsc -p ./src/tsconfig.monaco.json --noEmit - npm run compile - node build/lib/builtInExtensions.js - name: build - - script: | - set -e - DISPLAY=:10 ./scripts/test.sh --tfs - # DISPLAY=:10 ./scripts/test-integration.sh - name: test + - template: linux/continuous-build-linux.yml - phase: macOS queue: Hosted macOS Preview steps: - - task: NodeTool@0 - inputs: - versionSpec: "8.9.1" - - task: geeklearningio.gl-vsts-tasks-yarn.yarn-installer-task.YarnInstaller@2 - inputs: - versionSpec: "1.3.2" - - script: | - set -e - yarn - npm run gulp -- electron-x64 - - script: | - set -e - npm run gulp -- hygiene - ./node_modules/.bin/tsc -p ./src/tsconfig.monaco.json --noEmit - npm run compile - node build/lib/builtInExtensions.js - name: build - - script: | - set -e - ./scripts/test.sh --tfs - ./scripts/test-integration.sh - yarn smoketest --screenshots "$(Build.ArtifactStagingDirectory)/artifacts" --log "$(Build.ArtifactStagingDirectory)/artifacts/smoketest.log" - name: test - - task: PublishBuildArtifacts@1 - inputs: - PathtoPublish: '$(Build.ArtifactStagingDirectory)/artifacts' - ArtifactName: build-artifacts-darwin - publishLocation: Container - condition: succeededOrFailed() \ No newline at end of file + - template: darwin/continuous-build-darwin.yml \ No newline at end of file diff --git a/build/tfs/darwin/build.sh b/build/tfs/darwin/build.sh deleted file mode 100644 index 9c0b7a6f52..0000000000 --- a/build/tfs/darwin/build.sh +++ /dev/null @@ -1,58 +0,0 @@ -#!/bin/sh - -. ./build/tfs/common/node.sh -. ./scripts/env.sh -. ./build/tfs/common/common.sh - -export VSCODE_MIXIN_PASSWORD="$1" -export AZURE_STORAGE_ACCESS_KEY="$2" -export AZURE_STORAGE_ACCESS_KEY_2="$3" -export MOONCAKE_STORAGE_ACCESS_KEY="$4" -export AZURE_DOCUMENTDB_MASTERKEY="$5" -VSO_PAT="$6" - -echo "machine monacotools.visualstudio.com password $VSO_PAT" > ~/.netrc - -step "Install dependencies" \ - yarn - -step "Hygiene" \ - npm run gulp -- hygiene - -step "Monaco Editor Check" \ - ./node_modules/.bin/tsc -p ./src/tsconfig.monaco.json --noEmit - -step "Mix in repository from vscode-distro" \ - npm run gulp -- mixin - -step "Install distro dependencies" \ - node build/tfs/common/installDistro.js - -step "Build minified & upload source maps" \ - npm run gulp -- vscode-darwin-min upload-vscode-sourcemaps - -# step "Create loader snapshot" -# node build/lib/snapshotLoader.js - -step "Run unit tests" \ - ./scripts/test.sh --build --reporter dot - -step "Run integration tests" \ - ./scripts/test-integration.sh - -# function smoketest { -# ARTIFACTS="$AGENT_BUILDDIRECTORY/smoketest-artifacts" -# rm -rf $ARTIFACTS - -# [[ "$VSCODE_QUALITY" == "insider" ]] && VSCODE_APPNAME="Visual Studio Code - Insiders" || VSCODE_APPNAME="Visual Studio Code" -# npm run smoketest -- --build "$AGENT_BUILDDIRECTORY/VSCode-darwin/$VSCODE_APPNAME.app" --log $ARTIFACTS -# } - -# step "Run smoke test" \ -# smoketest - -step "Publish release" \ - ./build/tfs/darwin/release.sh - -step "Generate and upload configuration.json" \ - npm run gulp -- upload-vscode-configuration diff --git a/build/tfs/darwin/continuous-build-darwin.yml b/build/tfs/darwin/continuous-build-darwin.yml new file mode 100644 index 0000000000..20070e0874 --- /dev/null +++ b/build/tfs/darwin/continuous-build-darwin.yml @@ -0,0 +1,48 @@ +steps: +- task: NodeTool@0 + inputs: + versionSpec: "8.9.1" +- task: geeklearningio.gl-vsts-tasks-yarn.yarn-installer-task.YarnInstaller@2 + inputs: + versionSpec: "1.3.2" +- script: | + yarn + displayName: Install Dependencies +- script: | + yarn gulp electron-x64 + displayName: Download Electron +- script: | + yarn gulp hygiene + displayName: Run Hygiene Checks +- script: | + yarn check-monaco-editor-compilation + displayName: Run Monaco Editor Checks +- script: | + yarn compile + displayName: Compile Sources +- script: | + yarn download-builtin-extensions + displayName: Download Built-in Extensions +- script: | + ./scripts/test.sh --tfs "Unit Tests" + displayName: Run Unit Tests +- script: | + ./scripts/test-integration.sh --tfs "Integration Tests" + displayName: Run Integration Tests +- script: | + yarn smoketest --screenshots "$(Build.ArtifactStagingDirectory)/artifacts" --log "$(Build.ArtifactStagingDirectory)/artifacts/smoketest.log" + displayName: Run Smoke Tests + continueOnError: true +- task: PublishBuildArtifacts@1 + displayName: Publish Smoketest Artifacts + inputs: + PathtoPublish: '$(Build.ArtifactStagingDirectory)/artifacts' + ArtifactName: build-artifacts-darwin + publishLocation: Container + condition: eq(variables['System.PullRequest.IsFork'], 'False') +- task: PublishTestResults@2 + displayName: Publish Tests Results + inputs: + testResultsFiles: '*-results.xml' + searchFolder: '$(Build.ArtifactStagingDirectory)/test-results' + condition: succeededOrFailed() \ No newline at end of file diff --git a/build/tfs/darwin/enqueue.js b/build/tfs/darwin/enqueue.js new file mode 100644 index 0000000000..b1ebef6fe1 --- /dev/null +++ b/build/tfs/darwin/enqueue.js @@ -0,0 +1,106 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the Source EULA. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +'use strict'; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __generator = (this && this.__generator) || function (thisArg, body) { + var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; + return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; + function verb(n) { return function (v) { return step([n, v]); }; } + function step(op) { + if (f) throw new TypeError("Generator is already executing."); + while (_) try { + if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; + if (y = 0, t) op = [op[0] & 2, t.value]; + switch (op[0]) { + case 0: case 1: t = op; break; + case 4: _.label++; return { value: op[1], done: false }; + case 5: _.label++; y = op[1]; op = [0]; continue; + case 7: op = _.ops.pop(); _.trys.pop(); continue; + default: + if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } + if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } + if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } + if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } + if (t[2]) _.ops.pop(); + _.trys.pop(); continue; + } + op = body.call(thisArg, _); + } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } + if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; + } +}; +Object.defineProperty(exports, "__esModule", { value: true }); +var child_process_1 = require("child_process"); +var documentdb_1 = require("documentdb"); +var azure = require("azure-storage"); +function queueSigningRequest(quality, commit) { + var retryOperations = new azure.ExponentialRetryPolicyFilter(); + var queueSvc = azure + .createQueueService(process.env['AZURE_STORAGE_ACCOUNT_2'], process.env['AZURE_STORAGE_ACCESS_KEY_2']) + .withFilter(retryOperations); + queueSvc.messageEncoder = new azure.QueueMessageEncoder.TextBase64QueueMessageEncoder(); + var message = quality + "/" + commit; + return new Promise(function (c, e) { return queueSvc.createMessage('sign-darwin', message, function (err) { return err ? e(err) : c(); }); }); +} +function isBuildSigned(quality, commit) { + var client = new documentdb_1.DocumentClient(process.env['AZURE_DOCUMENTDB_ENDPOINT'], { masterKey: process.env['AZURE_DOCUMENTDB_MASTERKEY'] }); + var collection = 'dbs/builds/colls/' + quality; + var updateQuery = { + query: 'SELECT TOP 1 * FROM c WHERE c.id = @id', + parameters: [{ name: '@id', value: commit }] + }; + return new Promise(function (c, e) { + client.queryDocuments(collection, updateQuery).toArray(function (err, results) { + if (err) { + return e(err); + } + if (results.length !== 1) { + return c(false); + } + var release = results[0]; + var assets = release.assets; + var isSigned = assets.some(function (a) { return a.platform === 'darwin' && a.type === 'archive'; }); + c(isSigned); + }); + }); +} +// async function waitForSignedBuild(quality: string, commit: string): Promise { +// let retries = 0; +// while (retries < 180) { +// if (await isBuildSigned(quality, commit)) { +// return; +// } +// await new Promise(c => setTimeout(c, 10000)); +// retries++; +// } +// throw new Error('Timed out waiting for signed build'); +// } +function main(quality) { + return __awaiter(this, void 0, void 0, function () { + var commit; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + commit = child_process_1.execSync('git rev-parse HEAD', { encoding: 'utf8' }).trim(); + console.log("Queueing signing request for '" + quality + "/" + commit + "'..."); + return [4 /*yield*/, queueSigningRequest(quality, commit)]; + case 1: + _a.sent(); + return [2 /*return*/]; + } + }); + }); +} +main(process.argv[2]).catch(function (err) { + console.error(err); + process.exit(1); +}); diff --git a/build/tfs/common/enqueue.ts b/build/tfs/darwin/enqueue.ts similarity index 100% rename from build/tfs/common/enqueue.ts rename to build/tfs/darwin/enqueue.ts diff --git a/build/tfs/darwin/build.yml b/build/tfs/darwin/product-build-darwin.yml similarity index 63% rename from build/tfs/darwin/build.yml rename to build/tfs/darwin/product-build-darwin.yml index 008314830a..0dd3150358 100644 --- a/build/tfs/darwin/build.yml +++ b/build/tfs/darwin/product-build-darwin.yml @@ -1,5 +1,4 @@ steps: - - task: NodeTool@0 inputs: versionSpec: "8.9.1" @@ -9,22 +8,31 @@ steps: versionSpec: "1.3.2" - script: | + set -e echo "machine monacotools.visualstudio.com password $(VSO_PAT)" > ~/.netrc yarn npm run gulp -- hygiene npm run monaco-compile-check - VSCODE_MIXIN_PASSWORD="$(VSCODE_MIXIN_PASSWORD)" npm run gulp -- mixin electron + VSCODE_MIXIN_PASSWORD="$(VSCODE_MIXIN_PASSWORD)" npm run gulp -- mixin node build/tfs/common/installDistro.js + node build/lib/builtInExtensions.js - script: | - VSCODE_MIXIN_PASSWORD="$(VSCODE_MIXIN_PASSWORD)" npm run gulp -- vscode-darwin-min + set -e + VSCODE_MIXIN_PASSWORD="$(VSCODE_MIXIN_PASSWORD)" \ + AZURE_STORAGE_ACCESS_KEY="$(AZURE_STORAGE_ACCESS_KEY)" \ + npm run gulp -- vscode-darwin-min upload-vscode-sourcemaps name: build - script: | - ./scripts/test.sh --build --tfs + set -e + ./scripts/test.sh --build --tfs "Unit Tests" + APP_NAME="`ls $(agent.builddirectory)/VSCode-darwin | head -n 1`" + # yarn smoketest -- --build "$(agent.builddirectory)/VSCode-darwin/$APP_NAME" name: test - script: | + set -e # archive the unsigned build pushd ../VSCode-darwin && zip -r -X -y ../VSCode-darwin-unsigned.zip * && popd @@ -43,9 +51,13 @@ steps: false \ ../VSCode-darwin-unsigned.zip + # publish hockeyapp symbols + node build/tfs/common/symbols.js "$(VSCODE_MIXIN_PASSWORD)" "$(VSCODE_HOCKEYAPP_TOKEN)" "$(VSCODE_ARCH)" "$(VSCODE_HOCKEYAPP_ID_MACOS)" + # enqueue the unsigned build AZURE_DOCUMENTDB_MASTERKEY="$(AZURE_DOCUMENTDB_MASTERKEY)" \ AZURE_STORAGE_ACCESS_KEY_2="$(AZURE_STORAGE_ACCESS_KEY_2)" \ - node build/tfs/common/enqueue.js "$(VSCODE_QUALITY)" + node build/tfs/darwin/enqueue.js "$(VSCODE_QUALITY)" + AZURE_STORAGE_ACCESS_KEY="$(AZURE_STORAGE_ACCESS_KEY)" \ npm run gulp -- upload-vscode-configuration \ No newline at end of file diff --git a/build/tfs/darwin/release.sh b/build/tfs/darwin/release.sh deleted file mode 100644 index 857b6f3851..0000000000 --- a/build/tfs/darwin/release.sh +++ /dev/null @@ -1,22 +0,0 @@ -#!/bin/sh - -. ./scripts/env.sh -. ./build/tfs/common/common.sh - -REPO=`pwd` -ZIP=$REPO/../VSCode-darwin-selfsigned.zip -UNSIGNEDZIP=$REPO/../VSCode-darwin-unsigned.zip -BUILD=$REPO/../VSCode-darwin -PACKAGEJSON=`ls $BUILD/*.app/Contents/Resources/app/package.json` -VERSION=`node -p "require(\"$PACKAGEJSON\").version"` - -rm -rf $UNSIGNEDZIP -(cd $BUILD && \ - step "Create unsigned archive" \ - zip -r -X -y $UNSIGNEDZIP *) - -step "Upload unsigned archive" \ - node build/tfs/common/publish.js $VSCODE_QUALITY darwin archive-unsigned VSCode-darwin-$VSCODE_QUALITY-unsigned.zip $VERSION false $UNSIGNEDZIP - -step "Sign build" \ - node build/tfs/common/enqueue.js $VSCODE_QUALITY \ No newline at end of file diff --git a/build/tfs/linux/build-ia32.sh b/build/tfs/linux/build-ia32.sh deleted file mode 100644 index 0b0f1c2a45..0000000000 --- a/build/tfs/linux/build-ia32.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/bash -set -e -./build/tfs/linux/build.sh ia32 "$@" \ No newline at end of file diff --git a/build/tfs/linux/build-x64.sh b/build/tfs/linux/build-x64.sh deleted file mode 100644 index fb5b38e02b..0000000000 --- a/build/tfs/linux/build-x64.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/bash -set -e -./build/tfs/linux/build.sh x64 "$@" \ No newline at end of file diff --git a/build/tfs/linux/build.sh b/build/tfs/linux/build.sh deleted file mode 100644 index e23049b5cf..0000000000 --- a/build/tfs/linux/build.sh +++ /dev/null @@ -1,64 +0,0 @@ -#!/bin/bash - -. ./build/tfs/common/node.sh -. ./scripts/env.sh -. ./build/tfs/common/common.sh - -export ARCH="$1" -export npm_config_arch="$ARCH" -export VSCODE_MIXIN_PASSWORD="$2" -export AZURE_STORAGE_ACCESS_KEY="$3" -export AZURE_STORAGE_ACCESS_KEY_2="$4" -export MOONCAKE_STORAGE_ACCESS_KEY="$5" -export AZURE_DOCUMENTDB_MASTERKEY="$6" -export LINUX_REPO_PASSWORD="$7" -VSO_PAT="$8" - -echo "machine monacotools.visualstudio.com password $VSO_PAT" > ~/.netrc - -step "Install dependencies" \ - yarn - -step "Hygiene" \ - npm run gulp -- hygiene - -step "Monaco Editor Check" \ - ./node_modules/.bin/tsc -p ./src/tsconfig.monaco.json --noEmit - -step "Mix in repository from vscode-distro" \ - npm run gulp -- mixin - -step "Get Electron" \ - npm run gulp -- "electron-$ARCH" - -step "Install distro dependencies" \ - node build/tfs/common/installDistro.js - -step "Build minified" \ - npm run gulp -- "vscode-linux-$ARCH-min" - -# step "Create loader snapshot" -# node build/lib/snapshotLoader.js --arch=$ARCH - -step "Run unit tests" \ - ./scripts/test.sh --build --reporter dot - -# function smoketest { -# id -u testuser &>/dev/null || (useradd -m testuser; chpasswd <<< testuser:testpassword) -# sudo -i -u testuser -- sh -c 'git config --global user.name "VS Code Agent" && git config --global user.email "monacotools@microsoft.com"' - -# ARTIFACTS="$AGENT_BUILDDIRECTORY/smoketest-artifacts" -# rm -rf $ARTIFACTS -# mkdir -p $ARTIFACTS -# chown -R testuser $ARTIFACTS - -# ps -o pid= -u testuser | xargs sudo kill -9 -# DISPLAY=:10 sudo -i -u testuser -- sh -c "cd $BUILD_SOURCESDIRECTORY/test/smoke && ./node_modules/.bin/mocha --build $AGENT_BUILDDIRECTORY/VSCode-linux-$ARCH --log $ARTIFACTS" -# # DISPLAY=:10 sudo -i -u testuser -- sh -c "cd /vso/work/1/s/test/smoke && ./node_modules/.bin/mocha --build /vso/work/1/VSCode-linux-ia32" -# } - -# step "Run smoke test" \ -# smoketest - -step "Publish release" \ - ./build/tfs/linux/release.sh diff --git a/build/tfs/linux/build.yml b/build/tfs/linux/build.yml deleted file mode 100644 index 1234e2d411..0000000000 --- a/build/tfs/linux/build.yml +++ /dev/null @@ -1,103 +0,0 @@ -steps: - -- script: | - # dependencies - dpkg --add-architecture i386 - apt-get update - - DEPS=" \ - gcc-multilib g++-multilib \ - pkg-config \ - dbus \ - xvfb \ - fakeroot \ - bc \ - bsdmainutils \ - rpm \ - " - - if [[ "$(VSCODE_ARCH)" == "x64" ]]; then - DEPS="$DEPS \ - dpkg-dev \ - libgconf-2-4 \ - libnss3 \ - libasound2 \ - libxtst6 \ - libx11-dev \ - libxkbfile-dev \ - libxss1 \ - libx11-xcb-dev \ - libsecret-1-dev \ - " - else - DEPS="$DEPS \ - dpkg-dev:i386 \ - libgconf-2-4:i386 \ - libnss3:i386 \ - libasound2:i386 \ - libxtst6:i386 \ - libnotify4:i386 \ - libx11-dev:i386 \ - libxkbfile-dev:i386 \ - libxss1:i386 \ - libx11-xcb-dev:i386 \ - libgl1-mesa-glx:i386 libgl1-mesa-dri:i386 \ - libgirepository-1.0-1:i386 \ - gir1.2-glib-2.0:i386 \ - gir1.2-secret-1:i386 \ - libsecret-1-dev:i386 \ - libgtk2.0-0:i386 \ - " - fi - - apt-get install -y $DEPS - - # setup xvfb - cp build/tfs/linux/$(VSCODE_ARCH)/xvfb.init /etc/init.d/xvfb - chmod +x /etc/init.d/xvfb - update-rc.d xvfb defaults - service xvfb start - - # setup dbus - ln -sf /bin/dbus-daemon /usr/bin/dbus-daemon - service dbus start - -- task: NodeTool@0 - inputs: - versionSpec: "8.9.1" - -- task: geeklearningio.gl-vsts-tasks-yarn.yarn-installer-task.YarnInstaller@2 - inputs: - versionSpec: "1.3.2" - -- script: | - export npm_config_arch="$(VSCODE_ARCH)" - if [[ "$(VSCODE_ARCH)" == "ia32" ]]; then - export PKG_CONFIG_PATH="/usr/lib/i386-linux-gnu/pkgconfig" - fi - - echo "machine monacotools.visualstudio.com password $(VSO_PAT)" > ~/.netrc - yarn - npm run gulp -- hygiene - npm run monaco-compile-check - VSCODE_MIXIN_PASSWORD="$(VSCODE_MIXIN_PASSWORD)" npm run gulp -- mixin - node build/tfs/common/installDistro.js - -- script: | - VSCODE_MIXIN_PASSWORD="$(VSCODE_MIXIN_PASSWORD)" npm run gulp -- vscode-linux-$(VSCODE_ARCH)-min - name: build - -- script: | - npm run gulp -- "electron-$(VSCODE_ARCH)" - DISPLAY=:10 ./scripts/test.sh --build --tfs - name: test - -- script: | - npm run gulp -- "vscode-linux-$(VSCODE_ARCH)-build-deb" - npm run gulp -- "vscode-linux-$(VSCODE_ARCH)-build-rpm" - #npm run gulp -- "vscode-linux-$(VSCODE_ARCH)-build-snap" - - AZURE_DOCUMENTDB_MASTERKEY="$(AZURE_DOCUMENTDB_MASTERKEY)" \ - AZURE_STORAGE_ACCESS_KEY_2="$(AZURE_STORAGE_ACCESS_KEY_2)" \ - MOONCAKE_STORAGE_ACCESS_KEY="$(MOONCAKE_STORAGE_ACCESS_KEY)" \ - ./build/tfs/linux/release2.sh "$(VSCODE_ARCH)" "$(LINUX_REPO_PASSWORD)" \ No newline at end of file diff --git a/build/tfs/linux/continuous-build-linux.yml b/build/tfs/linux/continuous-build-linux.yml new file mode 100644 index 0000000000..7ec3aec74b --- /dev/null +++ b/build/tfs/linux/continuous-build-linux.yml @@ -0,0 +1,44 @@ +steps: +- script: | + set -e + apt-get update + apt-get install -y libxkbfile-dev pkg-config libsecret-1-dev libxss1 libgconf-2-4 dbus xvfb libgtk-3-0 + cp build/tfs/linux/x64/xvfb.init /etc/init.d/xvfb + chmod +x /etc/init.d/xvfb + update-rc.d xvfb defaults + ln -sf /bin/dbus-daemon /usr/bin/dbus-daemon + service xvfb start + service dbus start +- task: NodeTool@0 + inputs: + versionSpec: "8.9.1" +- task: geeklearningio.gl-vsts-tasks-yarn.yarn-installer-task.YarnInstaller@2 + inputs: + versionSpec: "1.3.2" +- script: | + yarn + displayName: Install Dependencies +- script: | + yarn gulp electron-x64 + displayName: Download Electron +- script: | + yarn gulp hygiene + displayName: Run Hygiene Checks +- script: | + yarn check-monaco-editor-compilation + displayName: Run Monaco Editor Checks +- script: | + yarn compile + displayName: Compile Sources +- script: | + yarn download-builtin-extensions + displayName: Download Built-in Extensions +- script: | + DISPLAY=:10 ./scripts/test.sh --tfs "Unit Tests" + displayName: Run Unit Tests +- task: PublishTestResults@2 + displayName: Publish Tests Results + inputs: + testResultsFiles: '*-results.xml' + searchFolder: '$(Build.ArtifactStagingDirectory)/test-results' + condition: succeededOrFailed() \ No newline at end of file diff --git a/build/tfs/linux/frozen-check.ts b/build/tfs/linux/frozen-check.ts index 2c5986c2d3..92752f3c34 100644 --- a/build/tfs/linux/frozen-check.ts +++ b/build/tfs/linux/frozen-check.ts @@ -39,4 +39,11 @@ function getConfig(quality: string): Promise { } getConfig(process.argv[2]) - .then(c => console.log(c.frozen), e => console.error(e)); \ No newline at end of file + .then(config => { + console.log(config.frozen); + process.exit(0); + }) + .catch(err => { + console.error(err); + process.exit(1); + }); \ No newline at end of file diff --git a/build/tfs/linux/product-build-linux.yml b/build/tfs/linux/product-build-linux.yml new file mode 100644 index 0000000000..9505d71ff3 --- /dev/null +++ b/build/tfs/linux/product-build-linux.yml @@ -0,0 +1,118 @@ +steps: +- task: NodeTool@0 + inputs: + versionSpec: "8.9.1" + +- task: geeklearningio.gl-vsts-tasks-yarn.yarn-installer-task.YarnInstaller@2 + inputs: + versionSpec: "1.3.2" + +- script: | + set -e + export npm_config_arch="$(VSCODE_ARCH)" + if [[ "$(VSCODE_ARCH)" == "ia32" ]]; then + export PKG_CONFIG_PATH="/usr/lib/i386-linux-gnu/pkgconfig" + fi + + echo "machine monacotools.visualstudio.com password $(VSO_PAT)" > ~/.netrc + yarn + npm run gulp -- hygiene + npm run monaco-compile-check + VSCODE_MIXIN_PASSWORD="$(VSCODE_MIXIN_PASSWORD)" npm run gulp -- mixin + node build/tfs/common/installDistro.js + node build/lib/builtInExtensions.js + +- script: | + set -e + VSCODE_MIXIN_PASSWORD="$(VSCODE_MIXIN_PASSWORD)" npm run gulp -- vscode-linux-$(VSCODE_ARCH)-min + name: build + +- script: | + set -e + npm run gulp -- "electron-$(VSCODE_ARCH)" + DISPLAY=:10 ./scripts/test.sh --build --tfs "Unit Tests" + # yarn smoketest -- --build "$(agent.builddirectory)/VSCode-linux-$(VSCODE_ARCH)" + name: test + +- script: | + set -e + REPO="$(pwd)" + ROOT="$REPO/.." + ARCH="$(VSCODE_ARCH)" + + # Publish tarball + PLATFORM_LINUX="linux-$(VSCODE_ARCH)" + [[ "$ARCH" == "ia32" ]] && DEB_ARCH="i386" || DEB_ARCH="amd64" + [[ "$ARCH" == "ia32" ]] && RPM_ARCH="i386" || RPM_ARCH="x86_64" + BUILDNAME="VSCode-$PLATFORM_LINUX" + BUILD="$ROOT/$BUILDNAME" + BUILD_VERSION="$(date +%s)" + [ -z "$VSCODE_QUALITY" ] && TARBALL_FILENAME="code-$BUILD_VERSION.tar.gz" || TARBALL_FILENAME="code-$VSCODE_QUALITY-$BUILD_VERSION.tar.gz" + TARBALL_PATH="$ROOT/$TARBALL_FILENAME" + PACKAGEJSON="$BUILD/resources/app/package.json" + VERSION=$(node -p "require(\"$PACKAGEJSON\").version") + + rm -rf $ROOT/code-*.tar.* + (cd $ROOT && tar -czf $TARBALL_PATH $BUILDNAME) + + AZURE_DOCUMENTDB_MASTERKEY="$(AZURE_DOCUMENTDB_MASTERKEY)" \ + AZURE_STORAGE_ACCESS_KEY_2="$(AZURE_STORAGE_ACCESS_KEY_2)" \ + MOONCAKE_STORAGE_ACCESS_KEY="$(MOONCAKE_STORAGE_ACCESS_KEY)" \ + node build/tfs/common/publish.js "$VSCODE_QUALITY" "$PLATFORM_LINUX" archive-unsigned "$TARBALL_FILENAME" "$VERSION" true "$TARBALL_PATH" + + # Publish hockeyapp symbols + node build/tfs/common/symbols.js "$(VSCODE_MIXIN_PASSWORD)" "$(VSCODE_HOCKEYAPP_TOKEN)" "$(VSCODE_ARCH)" "$(VSCODE_HOCKEYAPP_ID_LINUX64)" + + # Publish DEB + npm run gulp -- "vscode-linux-$(VSCODE_ARCH)-build-deb" + PLATFORM_DEB="linux-deb-$ARCH" + [[ "$ARCH" == "ia32" ]] && DEB_ARCH="i386" || DEB_ARCH="amd64" + DEB_FILENAME="$(ls $REPO/.build/linux/deb/$DEB_ARCH/deb/)" + DEB_PATH="$REPO/.build/linux/deb/$DEB_ARCH/deb/$DEB_FILENAME" + + AZURE_DOCUMENTDB_MASTERKEY="$(AZURE_DOCUMENTDB_MASTERKEY)" \ + AZURE_STORAGE_ACCESS_KEY_2="$(AZURE_STORAGE_ACCESS_KEY_2)" \ + MOONCAKE_STORAGE_ACCESS_KEY="$(MOONCAKE_STORAGE_ACCESS_KEY)" \ + node build/tfs/common/publish.js "$VSCODE_QUALITY" "$PLATFORM_DEB" package "$DEB_FILENAME" "$VERSION" true "$DEB_PATH" + + # Publish RPM + npm run gulp -- "vscode-linux-$(VSCODE_ARCH)-build-rpm" + PLATFORM_RPM="linux-rpm-$ARCH" + [[ "$ARCH" == "ia32" ]] && RPM_ARCH="i386" || RPM_ARCH="x86_64" + RPM_FILENAME="$(ls $REPO/.build/linux/rpm/$RPM_ARCH/ | grep .rpm)" + RPM_PATH="$REPO/.build/linux/rpm/$RPM_ARCH/$RPM_FILENAME" + + AZURE_DOCUMENTDB_MASTERKEY="$(AZURE_DOCUMENTDB_MASTERKEY)" \ + AZURE_STORAGE_ACCESS_KEY_2="$(AZURE_STORAGE_ACCESS_KEY_2)" \ + MOONCAKE_STORAGE_ACCESS_KEY="$(MOONCAKE_STORAGE_ACCESS_KEY)" \ + node build/tfs/common/publish.js "$VSCODE_QUALITY" "$PLATFORM_RPM" package "$RPM_FILENAME" "$VERSION" true "$RPM_PATH" + + # SNAP_FILENAME="$(ls $REPO/.build/linux/snap/$ARCH/ | grep .snap)" + # SNAP_PATH="$REPO/.build/linux/snap/$ARCH/$SNAP_FILENAME" + + # Publish to MS repo + IS_FROZEN="$(AZURE_DOCUMENTDB_MASTERKEY="$(AZURE_DOCUMENTDB_MASTERKEY)" node build/tfs/linux/frozen-check.js $VSCODE_QUALITY)" + + if [ -z "$VSCODE_QUALITY" ]; then + echo "VSCODE_QUALITY is not set, skipping repo package publish" + elif [ "$IS_FROZEN" = "true" ]; then + echo "$VSCODE_QUALITY is frozen, skipping repo package publish" + else + if [ "$BUILD_SOURCEBRANCH" = "master" ] || [ "$BUILD_SOURCEBRANCH" = "refs/heads/master" ] || [ "$VSCODE_PUBLISH_LINUX" = "true" ]; then + if [[ $BUILD_QUEUEDBY = *"Project Collection Service Accounts"* || $BUILD_QUEUEDBY = *"Microsoft.VisualStudio.Services.TFS"* ]]; then + # Write config files needed by API, use eval to force environment variable expansion + pushd build/tfs/linux + # Submit to apt repo + # if [ "$DEB_ARCH" = "amd64" ]; then + # echo "{ \"server\": \"azure-apt-cat.cloudapp.net\", \"protocol\": \"https\", \"port\": \"443\", \"repositoryId\": \"58a4adf642421134a1a48d1a\", \"username\": \"vscode\", \"password\": \"$(LINUX_REPO_PASSWORD)\" }" > apt-config.json + # ./repoapi_client.sh -config apt-config.json -addfile $DEB_PATH + # fi + # Submit to yum repo (disabled as it's manual until signing is automated) + # eval echo '{ \"server\": \"azure-apt-cat.cloudapp.net\", \"protocol\": \"https\", \"port\": \"443\", \"repositoryId\": \"58a4ae3542421134a1a48d1b\", \"username\": \"vscode\", \"password\": \"$(LINUX_REPO_PASSWORD)\" }' > yum-config.json + + # ./repoapi_client.sh -config yum-config.json -addfile $RPM_PATH + popd + echo "To check repo publish status run ./repoapi_client.sh -config config.json -check " + fi + fi + fi \ No newline at end of file diff --git a/build/tfs/linux/release.sh b/build/tfs/linux/release.sh deleted file mode 100644 index 1025ac9df4..0000000000 --- a/build/tfs/linux/release.sh +++ /dev/null @@ -1,81 +0,0 @@ -#!/bin/bash - -. ./scripts/env.sh -. ./build/tfs/common/common.sh - -step "Build Debian package" \ - npm run gulp -- "vscode-linux-$ARCH-build-deb" - -step "Build RPM package" \ - npm run gulp -- "vscode-linux-$ARCH-build-rpm" - -# step "Build snap package" \ -# npm run gulp -- "vscode-linux-$ARCH-build-snap" - -# Variables -PLATFORM_LINUX="linux-$ARCH" -PLATFORM_DEB="linux-deb-$ARCH" -PLATFORM_RPM="linux-rpm-$ARCH" -[[ "$ARCH" == "ia32" ]] && DEB_ARCH="i386" || DEB_ARCH="amd64" -[[ "$ARCH" == "ia32" ]] && RPM_ARCH="i386" || RPM_ARCH="x86_64" -REPO="`pwd`" -ROOT="$REPO/.." -BUILDNAME="VSCode-$PLATFORM_LINUX" -BUILD="$ROOT/$BUILDNAME" -BUILD_VERSION="$(ls $REPO/.build/linux/deb/$DEB_ARCH/deb/ | sed -e 's/code-[a-z]*_//g' -e 's/\.deb$//g')" -[ -z "$VSCODE_QUALITY" ] && TARBALL_FILENAME="code-$BUILD_VERSION.tar.gz" || TARBALL_FILENAME="code-$VSCODE_QUALITY-$BUILD_VERSION.tar.gz" -TARBALL_PATH="$ROOT/$TARBALL_FILENAME" -PACKAGEJSON="$BUILD/resources/app/package.json" -VERSION=$(node -p "require(\"$PACKAGEJSON\").version") - -rm -rf $ROOT/code-*.tar.* -(cd $ROOT && \ - step "Create tar.gz archive" \ - tar -czf $TARBALL_PATH $BUILDNAME) - -step "Publish tar.gz archive" \ - node build/tfs/common/publish.js $VSCODE_QUALITY $PLATFORM_LINUX archive-unsigned $TARBALL_FILENAME $VERSION true $TARBALL_PATH - -DEB_FILENAME="$(ls $REPO/.build/linux/deb/$DEB_ARCH/deb/)" -DEB_PATH="$REPO/.build/linux/deb/$DEB_ARCH/deb/$DEB_FILENAME" - -step "Publish Debian package" \ - node build/tfs/common/publish.js $VSCODE_QUALITY $PLATFORM_DEB package $DEB_FILENAME $VERSION true $DEB_PATH - -RPM_FILENAME="$(ls $REPO/.build/linux/rpm/$RPM_ARCH/ | grep .rpm)" -RPM_PATH="$REPO/.build/linux/rpm/$RPM_ARCH/$RPM_FILENAME" - -step "Publish RPM package" \ - node build/tfs/common/publish.js $VSCODE_QUALITY $PLATFORM_RPM package $RPM_FILENAME $VERSION true $RPM_PATH - -# SNAP_FILENAME="$(ls $REPO/.build/linux/snap/$ARCH/ | grep .snap)" -# SNAP_PATH="$REPO/.build/linux/snap/$ARCH/$SNAP_FILENAME" - -IS_FROZEN="$(node build/tfs/linux/frozen-check.js $VSCODE_QUALITY)" - -if [ -z "$VSCODE_QUALITY" ]; then - echo "VSCODE_QUALITY is not set, skipping repo package publish" -elif [ "$IS_FROZEN" = "true" ]; then - echo "$VSCODE_QUALITY is frozen, skipping repo package publish" -else - if [ "$BUILD_SOURCEBRANCH" = "master" ] || [ "$BUILD_SOURCEBRANCH" = "refs/heads/master" ]; then - if [[ $BUILD_QUEUEDBY = *"Project Collection Service Accounts"* || $BUILD_QUEUEDBY = *"Microsoft.VisualStudio.Services.TFS"* ]]; then - # Write config files needed by API, use eval to force environment variable expansion - DIRNAME=$(dirname $(readlink -f $0)) - pushd $DIRNAME - # Submit to apt repo - if [ "$DEB_ARCH" = "amd64" ]; then - eval echo '{ \"server\": \"azure-apt-cat.cloudapp.net\", \"protocol\": \"https\", \"port\": \"443\", \"repositoryId\": \"58a4adf642421134a1a48d1a\", \"username\": \"$LINUX_REPO_USERNAME\", \"password\": \"$LINUX_REPO_PASSWORD\" }' > apt-config.json - - step "Publish to repositories" \ - ./repoapi_client.sh -config apt-config.json -addfile $DEB_PATH - fi - # Submit to yum repo (disabled as it's manual until signing is automated) - # eval echo '{ \"server\": \"azure-apt-cat.cloudapp.net\", \"protocol\": \"https\", \"port\": \"443\", \"repositoryId\": \"58a4ae3542421134a1a48d1b\", \"username\": \"$LINUX_REPO_USERNAME\", \"password\": \"$LINUX_REPO_PASSWORD\" }' > yum-config.json - - # ./repoapi_client.sh -config yum-config.json -addfile $RPM_PATH - popd - echo "To check repo publish status run ./repoapi_client.sh -config config.json -check " - fi - fi -fi diff --git a/build/tfs/linux/release2.sh b/build/tfs/linux/release2.sh deleted file mode 100755 index ad74ce0a38..0000000000 --- a/build/tfs/linux/release2.sh +++ /dev/null @@ -1,67 +0,0 @@ -#!/bin/bash -set -e - -# Arguments -ARCH="$1" -LINUX_REPO_PASSWORD="$2" - -# Variables -PLATFORM_LINUX="linux-$ARCH" -PLATFORM_DEB="linux-deb-$ARCH" -PLATFORM_RPM="linux-rpm-$ARCH" -[[ "$ARCH" == "ia32" ]] && DEB_ARCH="i386" || DEB_ARCH="amd64" -[[ "$ARCH" == "ia32" ]] && RPM_ARCH="i386" || RPM_ARCH="x86_64" -REPO="`pwd`" -ROOT="$REPO/.." -BUILDNAME="VSCode-$PLATFORM_LINUX" -BUILD="$ROOT/$BUILDNAME" -BUILD_VERSION="$(ls $REPO/.build/linux/deb/$DEB_ARCH/deb/ | sed -e 's/code-[a-z]*_//g' -e 's/\.deb$//g')" -[ -z "$VSCODE_QUALITY" ] && TARBALL_FILENAME="code-$BUILD_VERSION.tar.gz" || TARBALL_FILENAME="code-$VSCODE_QUALITY-$BUILD_VERSION.tar.gz" -TARBALL_PATH="$ROOT/$TARBALL_FILENAME" -PACKAGEJSON="$BUILD/resources/app/package.json" -VERSION=$(node -p "require(\"$PACKAGEJSON\").version") - -rm -rf $ROOT/code-*.tar.* -(cd $ROOT && tar -czf $TARBALL_PATH $BUILDNAME) - -node build/tfs/common/publish.js $VSCODE_QUALITY $PLATFORM_LINUX archive-unsigned $TARBALL_FILENAME $VERSION true $TARBALL_PATH - -DEB_FILENAME="$(ls $REPO/.build/linux/deb/$DEB_ARCH/deb/)" -DEB_PATH="$REPO/.build/linux/deb/$DEB_ARCH/deb/$DEB_FILENAME" - -node build/tfs/common/publish.js $VSCODE_QUALITY $PLATFORM_DEB package $DEB_FILENAME $VERSION true $DEB_PATH - -RPM_FILENAME="$(ls $REPO/.build/linux/rpm/$RPM_ARCH/ | grep .rpm)" -RPM_PATH="$REPO/.build/linux/rpm/$RPM_ARCH/$RPM_FILENAME" - -node build/tfs/common/publish.js $VSCODE_QUALITY $PLATFORM_RPM package $RPM_FILENAME $VERSION true $RPM_PATH - -# SNAP_FILENAME="$(ls $REPO/.build/linux/snap/$ARCH/ | grep .snap)" -# SNAP_PATH="$REPO/.build/linux/snap/$ARCH/$SNAP_FILENAME" - -IS_FROZEN="$(node build/tfs/linux/frozen-check.js $VSCODE_QUALITY)" - -if [ -z "$VSCODE_QUALITY" ]; then - echo "VSCODE_QUALITY is not set, skipping repo package publish" -elif [ "$IS_FROZEN" = "true" ]; then - echo "$VSCODE_QUALITY is frozen, skipping repo package publish" -else - if [ "$BUILD_SOURCEBRANCH" = "master" ] || [ "$BUILD_SOURCEBRANCH" = "refs/heads/master" ]; then - if [[ $BUILD_QUEUEDBY = *"Project Collection Service Accounts"* || $BUILD_QUEUEDBY = *"Microsoft.VisualStudio.Services.TFS"* ]]; then - # Write config files needed by API, use eval to force environment variable expansion - pushd build/tfs/linux - # Submit to apt repo - if [ "$DEB_ARCH" = "amd64" ]; then - eval echo '{ \"server\": \"azure-apt-cat.cloudapp.net\", \"protocol\": \"https\", \"port\": \"443\", \"repositoryId\": \"58a4adf642421134a1a48d1a\", \"username\": \"vscode\", \"password\": \"$LINUX_REPO_PASSWORD\" }' > apt-config.json - - ./repoapi_client.sh -config apt-config.json -addfile $DEB_PATH - fi - # Submit to yum repo (disabled as it's manual until signing is automated) - # eval echo '{ \"server\": \"azure-apt-cat.cloudapp.net\", \"protocol\": \"https\", \"port\": \"443\", \"repositoryId\": \"58a4ae3542421134a1a48d1b\", \"username\": \"vscode\", \"password\": \"$LINUX_REPO_PASSWORD\" }' > yum-config.json - - # ./repoapi_client.sh -config yum-config.json -addfile $RPM_PATH - popd - echo "To check repo publish status run ./repoapi_client.sh -config config.json -check " - fi - fi -fi diff --git a/build/tfs/product-build.yml b/build/tfs/product-build.yml index 29fc43598e..570925d6c9 100644 --- a/build/tfs/product-build.yml +++ b/build/tfs/product-build.yml @@ -1,413 +1,38 @@ phases: - phase: Windows condition: eq(variables['VSCODE_BUILD_WIN32'], 'true') - queue: - name: Hosted VS2017 - parallel: 2 - matrix: - x64: - VSCODE_ARCH: x64 - ia32: - VSCODE_ARCH: ia32 - + queue: Hosted VS2017 + variables: + VSCODE_ARCH: x64 steps: - - task: NodeTool@0 - inputs: - versionSpec: "8.9.1" + - template: win32/product-build-win32.yml - - task: geeklearningio.gl-vsts-tasks-yarn.yarn-installer-task.YarnInstaller@2 - inputs: - versionSpec: "1.3.2" - - - powershell: | - $ErrorActionPreference = "Stop" - "machine monacotools.visualstudio.com password $(VSO_PAT)" | Out-File "$env:USERPROFILE\_netrc" -Encoding ASCII - $env:npm_config_arch="$(VSCODE_ARCH)" - $env:CHILD_CONCURRENCY="1" - yarn - npm run gulp -- hygiene - npm run monaco-compile-check - $env:VSCODE_MIXIN_PASSWORD="$(VSCODE_MIXIN_PASSWORD)" - npm run gulp -- mixin - node build/tfs/common/installDistro.js - node build/lib/builtInExtensions.js - - - powershell: | - $ErrorActionPreference = "Stop" - $env:VSCODE_MIXIN_PASSWORD="$(VSCODE_MIXIN_PASSWORD)" - npm run gulp -- "vscode-win32-$(VSCODE_ARCH)-min" - npm run gulp -- "vscode-win32-$(VSCODE_ARCH)-copy-inno-updater" - name: build - - - powershell: | - $ErrorActionPreference = "Stop" - npm run gulp -- "electron-$(VSCODE_ARCH)" - .\scripts\test.bat --build --tfs - # yarn smoketest -- --build "$(agent.builddirectory)\VSCode-win32-$(VSCODE_ARCH)" - name: test - - - task: SFP.build-tasks.custom-build-task-1.EsrpCodeSigning@1 - inputs: - ConnectedServiceName: 'ESRP CodeSign' - FolderPath: '$(agent.builddirectory)/VSCode-win32-$(VSCODE_ARCH)' - Pattern: '*.dll,*.exe,*.node' - signConfigType: inlineSignParams - inlineOperation: | - [ - { - "keyCode": "CP-229803", - "operationSetCode": "SigntoolSign", - "parameters": [ - { - "parameterName": "OpusName", - "parameterValue": "VS Code" - }, - { - "parameterName": "OpusInfo", - "parameterValue": "https://code.visualstudio.com/" - }, - { - "parameterName": "PageHash", - "parameterValue": "/NPH" - }, - { - "parameterName": "TimeStamp", - "parameterValue": "/t \"http://ts4096.gtm.microsoft.com/TSS/AuthenticodeTS\"" - } - ], - "toolName": "sign", - "toolVersion": "1.0" - }, - { - "keyCode": "CP-230012", - "operationSetCode": "SigntoolSign", - "parameters": [ - { - "parameterName": "OpusName", - "parameterValue": "VS Code" - }, - { - "parameterName": "OpusInfo", - "parameterValue": "https://code.visualstudio.com/" - }, - { - "parameterName": "Append", - "parameterValue": "/as" - }, - { - "parameterName": "FileDigest", - "parameterValue": "/fd \"SHA256\"" - }, - { - "parameterName": "PageHash", - "parameterValue": "/NPH" - }, - { - "parameterName": "TimeStamp", - "parameterValue": "/tr \"http://rfc3161.gtm.corp.microsoft.com/TSS/HttpTspServer\" /td sha256" - } - ], - "toolName": "sign", - "toolVersion": "1.0" - }, - { - "keyCode": "CP-230012", - "operationSetCode": "SigntoolVerify", - "parameters": [ - { - "parameterName": "VerifyAll", - "parameterValue": "/all" - } - ], - "toolName": "sign", - "toolVersion": "1.0" - } - ] - SessionTimeout: 120 - - - powershell: | - $ErrorActionPreference = "Stop" - npm run gulp -- "vscode-win32-$(VSCODE_ARCH)-archive" "vscode-win32-$(VSCODE_ARCH)-setup" - - - task: SFP.build-tasks.custom-build-task-1.EsrpCodeSigning@1 - inputs: - ConnectedServiceName: 'ESRP CodeSign' - FolderPath: '$(agent.builddirectory)' - Pattern: VSCodeSetup.exe - signConfigType: inlineSignParams - inlineOperation: | - [ - { - "keyCode": "CP-229803", - "operationSetCode": "SigntoolSign", - "parameters": [ - { - "parameterName": "OpusName", - "parameterValue": "VS Code" - }, - { - "parameterName": "OpusInfo", - "parameterValue": "https://code.visualstudio.com/" - }, - { - "parameterName": "PageHash", - "parameterValue": "/NPH" - }, - { - "parameterName": "TimeStamp", - "parameterValue": "/t \"http://ts4096.gtm.microsoft.com/TSS/AuthenticodeTS\"" - } - ], - "toolName": "sign", - "toolVersion": "1.0" - }, - { - "keyCode": "CP-230012", - "operationSetCode": "SigntoolSign", - "parameters": [ - { - "parameterName": "OpusName", - "parameterValue": "VS Code" - }, - { - "parameterName": "OpusInfo", - "parameterValue": "https://code.visualstudio.com/" - }, - { - "parameterName": "Append", - "parameterValue": "/as" - }, - { - "parameterName": "FileDigest", - "parameterValue": "/fd \"SHA256\"" - }, - { - "parameterName": "PageHash", - "parameterValue": "/NPH" - }, - { - "parameterName": "TimeStamp", - "parameterValue": "/tr \"http://rfc3161.gtm.corp.microsoft.com/TSS/HttpTspServer\" /td sha256" - } - ], - "toolName": "sign", - "toolVersion": "1.0" - }, - { - "keyCode": "CP-230012", - "operationSetCode": "SigntoolVerify", - "parameters": [ - { - "parameterName": "VerifyAll", - "parameterValue": "/all" - } - ], - "toolName": "sign", - "toolVersion": "1.0" - } - ] - SessionTimeout: 120 - - - powershell: | - $ErrorActionPreference = "Stop" - $Repo = "$(pwd)" - $Root = "$Repo\.." - $Exe = "$Repo\.build\win32-$(VSCODE_ARCH)\setup\VSCodeSetup.exe" - $Zip = "$Repo\.build\win32-$(VSCODE_ARCH)\archive\VSCode-win32-$(VSCODE_ARCH).zip" - $Build = "$Root\VSCode-win32-$(VSCODE_ARCH)" - - # get version - $PackageJson = Get-Content -Raw -Path "$Build\resources\app\package.json" | ConvertFrom-Json - $Version = $PackageJson.version - $Quality = "$env:VSCODE_QUALITY" - $env:AZURE_STORAGE_ACCESS_KEY_2 = "$(AZURE_STORAGE_ACCESS_KEY_2)" - $env:MOONCAKE_STORAGE_ACCESS_KEY = "$(MOONCAKE_STORAGE_ACCESS_KEY)" - $env:AZURE_DOCUMENTDB_MASTERKEY = "$(AZURE_DOCUMENTDB_MASTERKEY)" - - $assetPlatform = if ("$(VSCODE_ARCH)" -eq "ia32") { "win32" } else { "win32-x64" } - - node build/tfs/common/publish.js $Quality "$global:assetPlatform-archive" archive "VSCode-win32-$(VSCODE_ARCH)-$Version.zip" $Version true $Zip - node build/tfs/common/publish.js $Quality "$global:assetPlatform" setup "VSCodeSetup-$(VSCODE_ARCH)-$Version.exe" $Version true $Exe - - # publish hockeyapp symbols - $hockeyAppId = if ("$(VSCODE_ARCH)" -eq "ia32") { "$(VSCODE_HOCKEYAPP_ID_WIN32)" } else { "$(VSCODE_HOCKEYAPP_ID_WIN64)" } - node build/tfs/common/symbols.js "$(VSCODE_MIXIN_PASSWORD)" "$(VSCODE_HOCKEYAPP_TOKEN)" "$(VSCODE_ARCH)" $hockeyAppId +- phase: Windows32 + condition: eq(variables['VSCODE_BUILD_WIN32_32BIT'], 'true') + queue: Hosted VS2017 + variables: + VSCODE_ARCH: ia32 + steps: + - template: win32/product-build-win32.yml - phase: Linux condition: eq(variables['VSCODE_BUILD_LINUX'], 'true') queue: linux-x64 variables: VSCODE_ARCH: x64 - steps: - - task: NodeTool@0 - inputs: - versionSpec: "8.9.1" - - - task: geeklearningio.gl-vsts-tasks-yarn.yarn-installer-task.YarnInstaller@2 - inputs: - versionSpec: "1.3.2" - - - script: | - set -e - export npm_config_arch="$(VSCODE_ARCH)" - if [[ "$(VSCODE_ARCH)" == "ia32" ]]; then - export PKG_CONFIG_PATH="/usr/lib/i386-linux-gnu/pkgconfig" - fi - - echo "machine monacotools.visualstudio.com password $(VSO_PAT)" > ~/.netrc - yarn - npm run gulp -- hygiene - npm run monaco-compile-check - VSCODE_MIXIN_PASSWORD="$(VSCODE_MIXIN_PASSWORD)" npm run gulp -- mixin - node build/tfs/common/installDistro.js - node build/lib/builtInExtensions.js - - - script: | - set -e - VSCODE_MIXIN_PASSWORD="$(VSCODE_MIXIN_PASSWORD)" npm run gulp -- vscode-linux-$(VSCODE_ARCH)-min - name: build - - - script: | - set -e - npm run gulp -- "electron-$(VSCODE_ARCH)" - DISPLAY=:10 ./scripts/test.sh --build --tfs - # yarn smoketest -- --build "$(agent.builddirectory)/VSCode-linux-$(VSCODE_ARCH)" - name: test - - - script: | - set -e - npm run gulp -- "vscode-linux-$(VSCODE_ARCH)-build-deb" - npm run gulp -- "vscode-linux-$(VSCODE_ARCH)-build-rpm" - #npm run gulp -- "vscode-linux-$(VSCODE_ARCH)-build-snap" - - AZURE_DOCUMENTDB_MASTERKEY="$(AZURE_DOCUMENTDB_MASTERKEY)" \ - AZURE_STORAGE_ACCESS_KEY_2="$(AZURE_STORAGE_ACCESS_KEY_2)" \ - MOONCAKE_STORAGE_ACCESS_KEY="$(MOONCAKE_STORAGE_ACCESS_KEY)" \ - ./build/tfs/linux/release2.sh "$(VSCODE_ARCH)" "$(LINUX_REPO_PASSWORD)" - - # publish hockeyapp symbols - node build/tfs/common/symbols.js "$(VSCODE_MIXIN_PASSWORD)" "$(VSCODE_HOCKEYAPP_TOKEN)" "$(VSCODE_ARCH)" "$(VSCODE_HOCKEYAPP_ID_LINUX64)" + - template: linux/product-build-linux.yml - phase: Linux32 - condition: eq(variables['VSCODE_BUILD_LINUX'], 'true') + condition: eq(variables['VSCODE_BUILD_LINUX_32BIT'], 'true') queue: linux-ia32 variables: VSCODE_ARCH: ia32 - steps: - - task: NodeTool@0 - inputs: - versionSpec: "8.9.1" - - - task: geeklearningio.gl-vsts-tasks-yarn.yarn-installer-task.YarnInstaller@2 - inputs: - versionSpec: "1.3.2" - - - script: | - set -e - export npm_config_arch="$(VSCODE_ARCH)" - if [[ "$(VSCODE_ARCH)" == "ia32" ]]; then - export PKG_CONFIG_PATH="/usr/lib/i386-linux-gnu/pkgconfig" - fi - - echo "machine monacotools.visualstudio.com password $(VSO_PAT)" > ~/.netrc - yarn - npm run gulp -- hygiene - npm run monaco-compile-check - VSCODE_MIXIN_PASSWORD="$(VSCODE_MIXIN_PASSWORD)" npm run gulp -- mixin - node build/tfs/common/installDistro.js - node build/lib/builtInExtensions.js - - - script: | - set -e - VSCODE_MIXIN_PASSWORD="$(VSCODE_MIXIN_PASSWORD)" npm run gulp -- vscode-linux-$(VSCODE_ARCH)-min - name: build - - - script: | - set -e - npm run gulp -- "electron-$(VSCODE_ARCH)" - DISPLAY=:10 ./scripts/test.sh --build --tfs - # yarn smoketest -- --build "$(agent.builddirectory)/VSCode-linux-$(VSCODE_ARCH)" - name: test - - - script: | - set -e - npm run gulp -- "vscode-linux-$(VSCODE_ARCH)-build-deb" - npm run gulp -- "vscode-linux-$(VSCODE_ARCH)-build-rpm" - #npm run gulp -- "vscode-linux-$(VSCODE_ARCH)-build-snap" - - AZURE_DOCUMENTDB_MASTERKEY="$(AZURE_DOCUMENTDB_MASTERKEY)" \ - AZURE_STORAGE_ACCESS_KEY_2="$(AZURE_STORAGE_ACCESS_KEY_2)" \ - MOONCAKE_STORAGE_ACCESS_KEY="$(MOONCAKE_STORAGE_ACCESS_KEY)" \ - ./build/tfs/linux/release2.sh "$(VSCODE_ARCH)" "$(LINUX_REPO_PASSWORD)" - - # publish hockeyapp symbols - node build/tfs/common/symbols.js "$(VSCODE_MIXIN_PASSWORD)" "$(VSCODE_HOCKEYAPP_TOKEN)" "$(VSCODE_ARCH)" "$(VSCODE_HOCKEYAPP_ID_LINUX32)" + - template: linux/product-build-linux.yml - phase: macOS condition: eq(variables['VSCODE_BUILD_MACOS'], 'true') queue: Hosted macOS Preview steps: - - task: NodeTool@0 - inputs: - versionSpec: "8.9.1" - - - task: geeklearningio.gl-vsts-tasks-yarn.yarn-installer-task.YarnInstaller@2 - inputs: - versionSpec: "1.3.2" - - - script: | - set -e - echo "machine monacotools.visualstudio.com password $(VSO_PAT)" > ~/.netrc - yarn - npm run gulp -- hygiene - npm run monaco-compile-check - VSCODE_MIXIN_PASSWORD="$(VSCODE_MIXIN_PASSWORD)" npm run gulp -- mixin - node build/tfs/common/installDistro.js - node build/lib/builtInExtensions.js - - - script: | - set -e - VSCODE_MIXIN_PASSWORD="$(VSCODE_MIXIN_PASSWORD)" \ - AZURE_STORAGE_ACCESS_KEY="$(AZURE_STORAGE_ACCESS_KEY)" \ - npm run gulp -- vscode-darwin-min upload-vscode-sourcemaps - name: build - - - script: | - set -e - ./scripts/test.sh --build --tfs - APP_NAME="`ls $(agent.builddirectory)/VSCode-darwin | head -n 1`" - # yarn smoketest -- --build "$(agent.builddirectory)/VSCode-darwin/$APP_NAME" - name: test - - - script: | - set -e - # archive the unsigned build - pushd ../VSCode-darwin && zip -r -X -y ../VSCode-darwin-unsigned.zip * && popd - - # publish the unsigned build - PACKAGEJSON=`ls ../VSCode-darwin/*.app/Contents/Resources/app/package.json` - VERSION=`node -p "require(\"$PACKAGEJSON\").version"` - AZURE_DOCUMENTDB_MASTERKEY="$(AZURE_DOCUMENTDB_MASTERKEY)" \ - AZURE_STORAGE_ACCESS_KEY_2="$(AZURE_STORAGE_ACCESS_KEY_2)" \ - MOONCAKE_STORAGE_ACCESS_KEY="$(MOONCAKE_STORAGE_ACCESS_KEY)" \ - node build/tfs/common/publish.js \ - "$(VSCODE_QUALITY)" \ - darwin \ - archive-unsigned \ - "VSCode-darwin-$(VSCODE_QUALITY)-unsigned.zip" \ - $VERSION \ - false \ - ../VSCode-darwin-unsigned.zip - - # publish hockeyapp symbols - node build/tfs/common/symbols.js "$(VSCODE_MIXIN_PASSWORD)" "$(VSCODE_HOCKEYAPP_TOKEN)" "$(VSCODE_ARCH)" "$(VSCODE_HOCKEYAPP_ID_MACOS)" - - # enqueue the unsigned build - AZURE_DOCUMENTDB_MASTERKEY="$(AZURE_DOCUMENTDB_MASTERKEY)" \ - AZURE_STORAGE_ACCESS_KEY_2="$(AZURE_STORAGE_ACCESS_KEY_2)" \ - node build/tfs/common/enqueue.js "$(VSCODE_QUALITY)" - - AZURE_STORAGE_ACCESS_KEY="$(AZURE_STORAGE_ACCESS_KEY)" \ - npm run gulp -- upload-vscode-configuration \ No newline at end of file + - template: darwin/product-build-darwin.yml \ No newline at end of file diff --git a/build/tfs/win32/1_build.ps1 b/build/tfs/win32/1_build.ps1 deleted file mode 100644 index 0fcb56c1b9..0000000000 --- a/build/tfs/win32/1_build.ps1 +++ /dev/null @@ -1,71 +0,0 @@ -Param( - [string]$arch, - [string]$mixinPassword, - [string]$vsoPAT -) - -. .\build\tfs\win32\node.ps1 -. .\scripts\env.ps1 -. .\build\tfs\win32\lib.ps1 - -# Create a _netrc file to download distro dependencies -# In order to get _netrc to work, we need a HOME variable setup -"machine monacotools.visualstudio.com password ${vsoPAT}" | Out-File "$env:HOME\_netrc" -Encoding ASCII - -# Set the right architecture -$env:npm_config_arch="$arch" -$env:CHILD_CONCURRENCY="1" - -step "Install dependencies" { - exec { & yarn } -} - -step "Hygiene" { - exec { & npm run gulp -- hygiene } -} - -step "Monaco Editor Check" { - exec { & .\node_modules\.bin\tsc -p .\src\tsconfig.monaco.json --noEmit } -} - -$env:VSCODE_MIXIN_PASSWORD = $mixinPassword -step "Mix in repository from vscode-distro" { - exec { & npm run gulp -- mixin } -} - -step "Get Electron" { - exec { & npm run gulp -- "electron-$global:arch" } -} - -step "Install distro dependencies" { - exec { & node build\tfs\common\installDistro.js } -} - -step "Build minified" { - exec { & npm run gulp -- "vscode-win32-$global:arch-min" } -} - -step "Copy Inno updater" { - exec { & npm run gulp -- "vscode-win32-$global:arch-copy-inno-updater" } -} - -# step "Create loader snapshot" { -# exec { & node build\lib\snapshotLoader.js --arch=$global:arch } -# } - -step "Run unit tests" { - exec { & .\scripts\test.bat --build --reporter dot } -} - -# step "Run integration tests" { -# exec { & .\scripts\test-integration.bat } -# } - -# step "Run smoke test" { -# $Artifacts = "$env:AGENT_BUILDDIRECTORY\smoketest-artifacts" -# Remove-Item -Recurse -Force -ErrorAction Ignore $Artifacts - -# exec { & npm run smoketest -- --build "$env:AGENT_BUILDDIRECTORY\VSCode-win32-$global:arch" --log "$Artifacts" } -# } - -done diff --git a/build/tfs/win32/2_package.ps1 b/build/tfs/win32/2_package.ps1 deleted file mode 100644 index dcd9061137..0000000000 --- a/build/tfs/win32/2_package.ps1 +++ /dev/null @@ -1,12 +0,0 @@ -Param( - [string]$arch -) - -. .\build\tfs\win32\node.ps1 -. .\build\tfs\win32\lib.ps1 - -step "Create archive and setup package" { - exec { & npm run gulp -- "vscode-win32-$global:arch-archive" "vscode-win32-$global:arch-setup" } -} - -done \ No newline at end of file diff --git a/build/tfs/win32/3_upload.ps1 b/build/tfs/win32/3_upload.ps1 deleted file mode 100644 index 8d10c90826..0000000000 --- a/build/tfs/win32/3_upload.ps1 +++ /dev/null @@ -1,35 +0,0 @@ -Param( - [string]$arch, - [string]$storageKey, - [string]$mooncakeStorageKey, - [string]$documentDbKey -) - -. .\build\tfs\win32\node.ps1 -. .\build\tfs\win32\lib.ps1 - -$Repo = "$(pwd)" -$Root = "$Repo\.." -$Exe = "$Repo\.build\win32-$arch\setup\VSCodeSetup.exe" -$Zip = "$Repo\.build\win32-$arch\archive\VSCode-win32-$arch.zip" -$Build = "$Root\VSCode-win32-$arch" - -# get version -$PackageJson = Get-Content -Raw -Path "$Build\resources\app\package.json" | ConvertFrom-Json -$Version = $PackageJson.version -$Quality = "$env:VSCODE_QUALITY" -$env:AZURE_STORAGE_ACCESS_KEY_2 = $storageKey -$env:MOONCAKE_STORAGE_ACCESS_KEY = $mooncakeStorageKey -$env:AZURE_DOCUMENTDB_MASTERKEY = $documentDbKey - -$assetPlatform = if ($arch -eq "ia32") { "win32" } else { "win32-x64" } - -step "Publish archive" { - exec { & node build/tfs/common/publish.js $Quality "$global:assetPlatform-archive" archive "VSCode-win32-$global:arch-$Version.zip" $Version true $Zip } -} - -step "Publish setup package" { - exec { & node build/tfs/common/publish.js $Quality "$global:assetPlatform" setup "VSCodeSetup-$global:arch-$Version.exe" $Version true $Exe } -} - -done \ No newline at end of file diff --git a/build/tfs/win32/ESRPClient/NuGet.config b/build/tfs/win32/ESRPClient/NuGet.config new file mode 100644 index 0000000000..6d6da347fd --- /dev/null +++ b/build/tfs/win32/ESRPClient/NuGet.config @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/build/tfs/win32/ESRPClient/packages.config b/build/tfs/win32/ESRPClient/packages.config new file mode 100644 index 0000000000..d7a6f144f4 --- /dev/null +++ b/build/tfs/win32/ESRPClient/packages.config @@ -0,0 +1,4 @@ + + + + diff --git a/build/tfs/win32/build.yml b/build/tfs/win32/build.yml deleted file mode 100644 index d55b6f1bde..0000000000 --- a/build/tfs/win32/build.yml +++ /dev/null @@ -1,212 +0,0 @@ -steps: - -- task: NodeTool@0 - inputs: - versionSpec: "8.9.1" - -- task: geeklearningio.gl-vsts-tasks-yarn.yarn-installer-task.YarnInstaller@2 - inputs: - versionSpec: "1.3.2" - -- powershell: | - "machine monacotools.visualstudio.com password $(VSO_PAT)" | Out-File "$env:USERPROFILE\_netrc" -Encoding ASCII - $env:npm_config_arch="$(VSCODE_ARCH)" - $env:CHILD_CONCURRENCY="1" - yarn - npm run gulp -- hygiene - npm run monaco-compile-check - $env:VSCODE_MIXIN_PASSWORD="$(VSCODE_MIXIN_PASSWORD)" - npm run gulp -- mixin - node build/tfs/common/installDistro.js - -- powershell: | - $env:VSCODE_MIXIN_PASSWORD="$(VSCODE_MIXIN_PASSWORD)" - npm run gulp -- "vscode-win32-$(VSCODE_ARCH)-min" - npm run gulp -- "vscode-win32-$(VSCODE_ARCH)-copy-inno-updater" - name: build - -- powershell: | - npm run gulp -- "electron-$(VSCODE_ARCH)" - .\scripts\test.bat --build --tfs - name: test - -- task: SFP.build-tasks.custom-build-task-1.EsrpCodeSigning@1 - inputs: - ConnectedServiceName: 'ESRP CodeSign' - FolderPath: '$(agent.builddirectory)/VSCode-win32-$(VSCODE_ARCH)' - Pattern: '*.dll,*.exe,*.node' - signConfigType: inlineSignParams - inlineOperation: | - [ - { - "keyCode": "CP-229803", - "operationSetCode": "SigntoolSign", - "parameters": [ - { - "parameterName": "OpusName", - "parameterValue": "Microsoft" - }, - { - "parameterName": "OpusInfo", - "parameterValue": "http://www.microsoft.com" - }, - { - "parameterName": "PageHash", - "parameterValue": "/NPH" - }, - { - "parameterName": "TimeStamp", - "parameterValue": "/t \"http://ts4096.gtm.microsoft.com/TSS/AuthenticodeTS\"" - } - ], - "toolName": "sign", - "toolVersion": "1.0" - }, - { - "keyCode": "CP-230012", - "operationSetCode": "SigntoolSign", - "parameters": [ - { - "parameterName": "OpusName", - "parameterValue": "Microsoft" - }, - { - "parameterName": "OpusInfo", - "parameterValue": "http://www.microsoft.com" - }, - { - "parameterName": "Append", - "parameterValue": "/as" - }, - { - "parameterName": "FileDigest", - "parameterValue": "/fd \"SHA256\"" - }, - { - "parameterName": "PageHash", - "parameterValue": "/NPH" - }, - { - "parameterName": "TimeStamp", - "parameterValue": "/tr \"http://rfc3161.gtm.corp.microsoft.com/TSS/HttpTspServer\" /td sha256" - } - ], - "toolName": "sign", - "toolVersion": "1.0" - }, - { - "keyCode": "CP-230012", - "operationSetCode": "SigntoolVerify", - "parameters": [ - { - "parameterName": "VerifyAll", - "parameterValue": "/all" - } - ], - "toolName": "sign", - "toolVersion": "1.0" - } - ] - SessionTimeout: 120 - -- powershell: | - npm run gulp -- "vscode-win32-$(VSCODE_ARCH)-archive" "vscode-win32-$(VSCODE_ARCH)-setup" - -- task: SFP.build-tasks.custom-build-task-1.EsrpCodeSigning@1 - inputs: - ConnectedServiceName: 'ESRP CodeSign' - FolderPath: '$(agent.builddirectory)' - Pattern: VSCodeSetup.exe - signConfigType: inlineSignParams - inlineOperation: | - [ - { - "keyCode": "CP-229803", - "operationSetCode": "SigntoolSign", - "parameters": [ - { - "parameterName": "OpusName", - "parameterValue": "Microsoft" - }, - { - "parameterName": "OpusInfo", - "parameterValue": "http://www.microsoft.com" - }, - { - "parameterName": "PageHash", - "parameterValue": "/NPH" - }, - { - "parameterName": "TimeStamp", - "parameterValue": "/t \"http://ts4096.gtm.microsoft.com/TSS/AuthenticodeTS\"" - } - ], - "toolName": "sign", - "toolVersion": "1.0" - }, - { - "keyCode": "CP-230012", - "operationSetCode": "SigntoolSign", - "parameters": [ - { - "parameterName": "OpusName", - "parameterValue": "Microsoft" - }, - { - "parameterName": "OpusInfo", - "parameterValue": "http://www.microsoft.com" - }, - { - "parameterName": "Append", - "parameterValue": "/as" - }, - { - "parameterName": "FileDigest", - "parameterValue": "/fd \"SHA256\"" - }, - { - "parameterName": "PageHash", - "parameterValue": "/NPH" - }, - { - "parameterName": "TimeStamp", - "parameterValue": "/tr \"http://rfc3161.gtm.corp.microsoft.com/TSS/HttpTspServer\" /td sha256" - } - ], - "toolName": "sign", - "toolVersion": "1.0" - }, - { - "keyCode": "CP-230012", - "operationSetCode": "SigntoolVerify", - "parameters": [ - { - "parameterName": "VerifyAll", - "parameterValue": "/all" - } - ], - "toolName": "sign", - "toolVersion": "1.0" - } - ] - SessionTimeout: 120 - -- powershell: | - $Repo = "$(pwd)" - $Root = "$Repo\.." - $Exe = "$Repo\.build\win32-$(VSCODE_ARCH)\setup\VSCodeSetup.exe" - $Zip = "$Repo\.build\win32-$(VSCODE_ARCH)\archive\VSCode-win32-$(VSCODE_ARCH).zip" - $Build = "$Root\VSCode-win32-$(VSCODE_ARCH)" - - # get version - $PackageJson = Get-Content -Raw -Path "$Build\resources\app\package.json" | ConvertFrom-Json - $Version = $PackageJson.version - $Quality = "$env:VSCODE_QUALITY" - $env:AZURE_STORAGE_ACCESS_KEY_2 = "$(AZURE_STORAGE_ACCESS_KEY_2)" - $env:MOONCAKE_STORAGE_ACCESS_KEY = "$(MOONCAKE_STORAGE_ACCESS_KEY)" - $env:AZURE_DOCUMENTDB_MASTERKEY = "$(AZURE_DOCUMENTDB_MASTERKEY)" - - $assetPlatform = if ("$(VSCODE_ARCH)" -eq "ia32") { "win32" } else { "win32-x64" } - - node build/tfs/common/publish.js $Quality "$global:assetPlatform-archive" archive "VSCode-win32-$(VSCODE_ARCH)-$Version.zip" $Version true $Zip - node build/tfs/common/publish.js $Quality "$global:assetPlatform" setup "VSCodeSetup-$(VSCODE_ARCH)-$Version.exe" $Version true $Exe \ No newline at end of file diff --git a/build/tfs/win32/build_unsigned.ps1 b/build/tfs/win32/build_unsigned.ps1 deleted file mode 100644 index 74e8203184..0000000000 --- a/build/tfs/win32/build_unsigned.ps1 +++ /dev/null @@ -1,86 +0,0 @@ -Param( - [string]$arch, - [string]$mixinPassword, - [string]$vsoPAT, - [string]$storageKey, - [string]$mooncakeStorageKey, - [string]$documentDbKey -) - -. .\build\tfs\win32\node.ps1 -. .\scripts\env.ps1 -. .\build\tfs\win32\lib.ps1 - -# Create a _netrc file to download distro dependencies -# In order to get _netrc to work, we need a HOME variable setup -"machine monacotools.visualstudio.com password ${vsoPAT}" | Out-File "$env:HOME\_netrc" -Encoding ASCII - -# Set the right architecture -$env:npm_config_arch="$arch" -$env:CHILD_CONCURRENCY="1" - -step "Install dependencies" { - exec { & yarn } -} - -step "Hygiene" { - exec { & npm run gulp -- hygiene } -} - -$env:VSCODE_MIXIN_PASSWORD = $mixinPassword -step "Mix in repository from vscode-distro" { - exec { & npm run gulp -- mixin } -} - -step "Get Electron" { - exec { & npm run gulp -- "electron-$global:arch" } -} - -step "Install distro dependencies" { - exec { & node build\tfs\common\installDistro.js } -} - -step "Build minified" { - exec { & npm run gulp -- "vscode-win32-$global:arch-min" } -} - -step "Run unit tests" { - exec { & .\scripts\test.bat --build --reporter dot } -} - -step "Run smoke test" { - $Artifacts = "$env:AGENT_BUILDDIRECTORY\smoketest-artifacts" - Remove-Item -Recurse -Force -ErrorAction Ignore $Artifacts - - exec { & npm run smoketest -- --build "$env:AGENT_BUILDDIRECTORY\VSCode-win32-$global:arch" --log "$Artifacts" } -} - -step "Create archive and setup package" { - exec { & npm run gulp -- "vscode-win32-$global:arch-archive" "vscode-win32-$global:arch-setup" } -} - -$Repo = "$(pwd)" -$Root = "$Repo\.." -$Exe = "$Repo\.build\win32-$arch\setup\VSCodeSetup.exe" -$Zip = "$Repo\.build\win32-$arch\archive\VSCode-win32-$arch.zip" -$Build = "$Root\VSCode-win32-$arch" - -# get version -$PackageJson = Get-Content -Raw -Path "$Build\resources\app\package.json" | ConvertFrom-Json -$Version = $PackageJson.version -$Quality = "$env:VSCODE_QUALITY" -$env:AZURE_STORAGE_ACCESS_KEY_2 = $storageKey -$env:MOONCAKE_STORAGE_ACCESS_KEY = $mooncakeStorageKey -$env:AZURE_DOCUMENTDB_MASTERKEY = $documentDbKey - -$assetPlatform = if ($arch -eq "ia32") { "win32" } else { "win32-x64" } - -step "Publish UNSIGNED archive" { - exec { & node build/tfs/common/publish.js $Quality "$global:assetPlatform-archive" archive-unsigned "VSCode-win32-$global:arch-$Version-unsigned.zip" $Version false $Zip } -} - -step "Publish UNSIGNED setup package" { - exec { & node build/tfs/common/publish.js $Quality "$global:assetPlatform" setup-unsigned "VSCodeSetup-$global:arch-$Version-unsigned.exe" $Version false $Exe } -} - -done diff --git a/build/tfs/win32/continuous-build-win32.yml b/build/tfs/win32/continuous-build-win32.yml new file mode 100644 index 0000000000..6490c637b7 --- /dev/null +++ b/build/tfs/win32/continuous-build-win32.yml @@ -0,0 +1,66 @@ +steps: +- task: NodeTool@0 + inputs: + versionSpec: "8.9.1" +- task: geeklearningio.gl-vsts-tasks-yarn.yarn-installer-task.YarnInstaller@2 + inputs: + versionSpec: "1.3.2" +- powershell: | + . build/tfs/win32/exec.ps1 + $ErrorActionPreference = "Stop" + exec { yarn } + displayName: Install Dependencies +- powershell: | + . build/tfs/win32/exec.ps1 + $ErrorActionPreference = "Stop" + exec { yarn gulp electron } + displayName: Download Electron +- powershell: | + . build/tfs/win32/exec.ps1 + $ErrorActionPreference = "Stop" + exec { yarn gulp hygiene } + displayName: Run Hygiene Checks +- powershell: | + . build/tfs/win32/exec.ps1 + $ErrorActionPreference = "Stop" + exec { yarn check-monaco-editor-compilation } + displayName: Run Monaco Editor Checks +- powershell: | + . build/tfs/win32/exec.ps1 + $ErrorActionPreference = "Stop" + exec { yarn compile } + displayName: Compile Sources +- powershell: | + . build/tfs/win32/exec.ps1 + $ErrorActionPreference = "Stop" + exec { yarn download-builtin-extensions } + displayName: Download Built-in Extensions +- powershell: | + . build/tfs/win32/exec.ps1 + $ErrorActionPreference = "Stop" + exec { .\scripts\test.bat --tfs "Unit Tests" } + displayName: Run Unit Tests +- powershell: | + . build/tfs/win32/exec.ps1 + $ErrorActionPreference = "Stop" + exec { .\scripts\test-integration.bat --tfs "Integration Tests" } + displayName: Run Integration Tests +- powershell: | + . build/tfs/win32/exec.ps1 + $ErrorActionPreference = "Stop" + exec { yarn smoketest --screenshots "$(Build.ArtifactStagingDirectory)\artifacts" --log "$(Build.ArtifactStagingDirectory)\artifacts\smoketest.log" } + displayName: Run Smoke Tests + continueOnError: true +- task: PublishBuildArtifacts@1 + displayName: Publish Smoketest Artifacts + inputs: + PathtoPublish: '$(Build.ArtifactStagingDirectory)/artifacts' + ArtifactName: build-artifacts-win32 + publishLocation: Container + condition: eq(variables['System.PullRequest.IsFork'], 'False') +- task: PublishTestResults@2 + displayName: Publish Tests Results + inputs: + testResultsFiles: '*-results.xml' + searchFolder: '$(Build.ArtifactStagingDirectory)/test-results' + condition: succeededOrFailed() diff --git a/build/tfs/win32/exec.ps1 b/build/tfs/win32/exec.ps1 new file mode 100644 index 0000000000..826cefdf7d --- /dev/null +++ b/build/tfs/win32/exec.ps1 @@ -0,0 +1,24 @@ +# Taken from psake https://github.com/psake/psake + +<# +.SYNOPSIS + This is a helper function that runs a scriptblock and checks the PS variable $lastexitcode + to see if an error occcured. If an error is detected then an exception is thrown. + This function allows you to run command-line programs without having to + explicitly check the $lastexitcode variable. + +.EXAMPLE + exec { svn info $repository_trunk } "Error executing SVN. Please verify SVN command-line client is installed" +#> +function Exec +{ + [CmdletBinding()] + param( + [Parameter(Position=0,Mandatory=1)][scriptblock]$cmd, + [Parameter(Position=1,Mandatory=0)][string]$errorMessage = ($msgs.error_bad_command -f $cmd) + ) + & $cmd + if ($lastexitcode -ne 0) { + throw ("Exec: " + $errorMessage) + } +} \ No newline at end of file diff --git a/build/tfs/win32/import-esrp-auth-cert.ps1 b/build/tfs/win32/import-esrp-auth-cert.ps1 new file mode 100644 index 0000000000..c345c78023 --- /dev/null +++ b/build/tfs/win32/import-esrp-auth-cert.ps1 @@ -0,0 +1,14 @@ +Param( + [string]$AuthCertificateBase64, + [string]$AuthCertificateKey +) + +# Import auth certificate +$AuthCertificateFileName = [System.IO.Path]::GetTempFileName() +$AuthCertificateBytes = [Convert]::FromBase64String($AuthCertificateBase64) +[IO.File]::WriteAllBytes($AuthCertificateFileName, $AuthCertificateBytes) +$AuthCertificate = Import-PfxCertificate -FilePath $AuthCertificateFileName -CertStoreLocation Cert:\LocalMachine\My -Password (ConvertTo-SecureString $AuthCertificateKey -AsPlainText -Force) +rm $AuthCertificateFileName +$ESRPAuthCertificateSubjectName = $AuthCertificate.Subject + +Write-Output ("##vso[task.setvariable variable=ESRPAuthCertificateSubjectName;]$ESRPAuthCertificateSubjectName") \ No newline at end of file diff --git a/build/tfs/win32/lib.ps1 b/build/tfs/win32/lib.ps1 deleted file mode 100644 index 9b28df620d..0000000000 --- a/build/tfs/win32/lib.ps1 +++ /dev/null @@ -1,48 +0,0 @@ -# stop when there's an error -$ErrorActionPreference = 'Stop' - -$env:HOME=$env:USERPROFILE - -if (Test-Path env:AGENT_WORKFOLDER) { - $env:HOME="${env:AGENT_WORKFOLDER}\home" - $env:npm_config_cache="${env:HOME}\npm-cache" - $env:YARN_CACHE_FOLDER="${env:HOME}\yarn-cache" - $env:npm_config_devdir="${env:HOME}\npm-devdir" - New-Item -Path "$env:HOME" -Type directory -Force | out-null - New-Item -Path "$env:npm_config_cache" -Type directory -Force | out-null -} - -# throw when a process exits with something other than 0 -function exec([scriptblock]$cmd, [string]$errorMessage = "Error executing command: " + $cmd) { - & $cmd - if ($LastExitCode -ne 0) { - throw $errorMessage - } -} - -$Summary = @() -function step($Task, $Step) { - echo "" - echo "*****************************************************************************" - echo "Start: $Task" - echo "*****************************************************************************" - echo "" - - $Stopwatch = [Diagnostics.Stopwatch]::StartNew() - Invoke-Command $Step - $Stopwatch.Stop() - $Formatted = "{0:g}" -f $Stopwatch.Elapsed - - echo "*****************************************************************************" - echo "End: $Task, Total: $Formatted" - echo "*****************************************************************************" - - $global:Summary += @{ "$Task" = $Formatted } -} - -function done() { - echo "" - echo "Build Summary" - echo "=============" - $global:Summary | Format-Table @{L="Task";E={$_.Name}}, @{L="Duration";E={$_.Value}} -} \ No newline at end of file diff --git a/build/tfs/win32/node.ps1 b/build/tfs/win32/node.ps1 deleted file mode 100644 index 14ccd0008b..0000000000 --- a/build/tfs/win32/node.ps1 +++ /dev/null @@ -1,7 +0,0 @@ -# install node -$env:Path = $env:NVM_HOME + ";" + $env:NVM_SYMLINK + ";" + $env:Path -$NodeVersion = "8.9.1" -# nvm install $NodeVersion -# nvm use $NodeVersion -# npm install -g yarn -$env:Path = $env:NVM_HOME + "\v" + $NodeVersion + ";" + $env:Path \ No newline at end of file diff --git a/build/tfs/win32/product-build-win32.yml b/build/tfs/win32/product-build-win32.yml new file mode 100644 index 0000000000..c887ade31f --- /dev/null +++ b/build/tfs/win32/product-build-win32.yml @@ -0,0 +1,166 @@ +steps: +- task: NodeTool@0 + inputs: + versionSpec: "8.9.1" + +- task: geeklearningio.gl-vsts-tasks-yarn.yarn-installer-task.YarnInstaller@2 + inputs: + versionSpec: "1.3.2" + +- powershell: | + . build/tfs/win32/exec.ps1 + $ErrorActionPreference = "Stop" + "machine monacotools.visualstudio.com password $(VSO_PAT)" | Out-File "$env:USERPROFILE\_netrc" -Encoding ASCII + $env:npm_config_arch="$(VSCODE_ARCH)" + $env:CHILD_CONCURRENCY="1" + $env:VSCODE_MIXIN_PASSWORD="$(VSCODE_MIXIN_PASSWORD)" + exec { yarn } + exec { npm run gulp -- hygiene } + exec { npm run monaco-compile-check } + exec { npm run gulp -- mixin } + exec { node build/tfs/common/installDistro.js } + exec { node build/lib/builtInExtensions.js } + +- powershell: | + . build/tfs/win32/exec.ps1 + $ErrorActionPreference = "Stop" + $env:VSCODE_MIXIN_PASSWORD="$(VSCODE_MIXIN_PASSWORD)" + exec { npm run gulp -- "vscode-win32-$(VSCODE_ARCH)-min" } + exec { npm run gulp -- "vscode-win32-$(VSCODE_ARCH)-copy-inno-updater" } + name: build + +- powershell: | + . build/tfs/win32/exec.ps1 + $ErrorActionPreference = "Stop" + exec { npm run gulp -- "electron-$(VSCODE_ARCH)" } + exec { .\scripts\test.bat --build --tfs "Unit Tests" } + # yarn smoketest -- --build "$(agent.builddirectory)\VSCode-win32-$(VSCODE_ARCH)" + name: test + +- task: SFP.build-tasks.custom-build-task-1.EsrpCodeSigning@1 + inputs: + ConnectedServiceName: 'ESRP CodeSign' + FolderPath: '$(agent.builddirectory)/VSCode-win32-$(VSCODE_ARCH)' + Pattern: '*.dll,*.exe,*.node' + signConfigType: inlineSignParams + inlineOperation: | + [ + { + "keyCode": "CP-229803", + "operationSetCode": "SigntoolSign", + "parameters": [ + { + "parameterName": "OpusName", + "parameterValue": "VS Code" + }, + { + "parameterName": "OpusInfo", + "parameterValue": "https://code.visualstudio.com/" + }, + { + "parameterName": "PageHash", + "parameterValue": "/NPH" + }, + { + "parameterName": "TimeStamp", + "parameterValue": "/t \"http://ts4096.gtm.microsoft.com/TSS/AuthenticodeTS\"" + } + ], + "toolName": "sign", + "toolVersion": "1.0" + }, + { + "keyCode": "CP-230012", + "operationSetCode": "SigntoolSign", + "parameters": [ + { + "parameterName": "OpusName", + "parameterValue": "VS Code" + }, + { + "parameterName": "OpusInfo", + "parameterValue": "https://code.visualstudio.com/" + }, + { + "parameterName": "Append", + "parameterValue": "/as" + }, + { + "parameterName": "FileDigest", + "parameterValue": "/fd \"SHA256\"" + }, + { + "parameterName": "PageHash", + "parameterValue": "/NPH" + }, + { + "parameterName": "TimeStamp", + "parameterValue": "/tr \"http://rfc3161.gtm.corp.microsoft.com/TSS/HttpTspServer\" /td sha256" + } + ], + "toolName": "sign", + "toolVersion": "1.0" + }, + { + "keyCode": "CP-230012", + "operationSetCode": "SigntoolVerify", + "parameters": [ + { + "parameterName": "VerifyAll", + "parameterValue": "/all" + } + ], + "toolName": "sign", + "toolVersion": "1.0" + } + ] + SessionTimeout: 120 + +- task: NuGetCommand@2 + displayName: Install ESRPClient.exe + inputs: + restoreSolution: 'build\tfs\win32\ESRPClient\packages.config' + feedsToUse: config + nugetConfigPath: 'build\tfs\win32\ESRPClient\NuGet.config' + externalFeedCredentials: 3fc0b7f7-da09-4ae7-a9c8-d69824b1819b + restoreDirectory: packages + +- task: ESRPImportCertTask@1 + displayName: Import ESRP Request Signing Certificate + inputs: + ESRP: 'ESRP CodeSign' + +- powershell: | + $ErrorActionPreference = "Stop" + .\build\tfs\win32\import-esrp-auth-cert.ps1 -AuthCertificateBase64 $(ESRP_AUTH_CERTIFICATE) -AuthCertificateKey $(ESRP_AUTH_CERTIFICATE_KEY) + displayName: Import ESRP Auth Certificate + +- powershell: | + . build/tfs/win32/exec.ps1 + $ErrorActionPreference = "Stop" + exec { npm run gulp -- "vscode-win32-$(VSCODE_ARCH)-archive" "vscode-win32-$(VSCODE_ARCH)-system-setup" "vscode-win32-$(VSCODE_ARCH)-user-setup" } + + $Repo = "$(pwd)" + $Root = "$Repo\.." + $SystemExe = "$Repo\.build\win32-$(VSCODE_ARCH)\system-setup\VSCodeSetup.exe" + $UserExe = "$Repo\.build\win32-$(VSCODE_ARCH)\user-setup\VSCodeSetup.exe" + $Zip = "$Repo\.build\win32-$(VSCODE_ARCH)\archive\VSCode-win32-$(VSCODE_ARCH).zip" + $Build = "$Root\VSCode-win32-$(VSCODE_ARCH)" + + # get version + $PackageJson = Get-Content -Raw -Path "$Build\resources\app\package.json" | ConvertFrom-Json + $Version = $PackageJson.version + $Quality = "$env:VSCODE_QUALITY" + $env:AZURE_STORAGE_ACCESS_KEY_2 = "$(AZURE_STORAGE_ACCESS_KEY_2)" + $env:MOONCAKE_STORAGE_ACCESS_KEY = "$(MOONCAKE_STORAGE_ACCESS_KEY)" + $env:AZURE_DOCUMENTDB_MASTERKEY = "$(AZURE_DOCUMENTDB_MASTERKEY)" + + $assetPlatform = if ("$(VSCODE_ARCH)" -eq "ia32") { "win32" } else { "win32-x64" } + + exec { node build/tfs/common/publish.js $Quality "$global:assetPlatform-archive" archive "VSCode-win32-$(VSCODE_ARCH)-$Version.zip" $Version true $Zip } + exec { node build/tfs/common/publish.js $Quality "$global:assetPlatform" setup "VSCodeSetup-$(VSCODE_ARCH)-$Version.exe" $Version true $SystemExe } + exec { node build/tfs/common/publish.js $Quality "$global:assetPlatform-user" setup "VSCodeUserSetup-$(VSCODE_ARCH)-$Version.exe" $Version true $UserExe } + + # publish hockeyapp symbols + $hockeyAppId = if ("$(VSCODE_ARCH)" -eq "ia32") { "$(VSCODE_HOCKEYAPP_ID_WIN32)" } else { "$(VSCODE_HOCKEYAPP_ID_WIN64)" } + exec { node build/tfs/common/symbols.js "$(VSCODE_MIXIN_PASSWORD)" "$(VSCODE_HOCKEYAPP_TOKEN)" "$(VSCODE_ARCH)" $hockeyAppId } diff --git a/build/tfs/win32/sign.ps1 b/build/tfs/win32/sign.ps1 new file mode 100644 index 0000000000..6bcea9ea55 --- /dev/null +++ b/build/tfs/win32/sign.ps1 @@ -0,0 +1,82 @@ +function Create-TmpJson($Obj) { + $FileName = [System.IO.Path]::GetTempFileName() + ConvertTo-Json -Depth 100 $Obj | Out-File -Encoding UTF8 $FileName + return $FileName +} + +$Auth = Create-TmpJson @{ + Version = "1.0.0" + AuthenticationType = "AAD_CERT" + ClientId = $env:ESRPClientId + AuthCert = @{ + SubjectName = $env:ESRPAuthCertificateSubjectName + StoreLocation = "LocalMachine" + StoreName = "My" + } + RequestSigningCert = @{ + SubjectName = $env:ESRPCertificateSubjectName + StoreLocation = "LocalMachine" + StoreName = "My" + } +} + +$Policy = Create-TmpJson @{ + Version = "1.0.0" +} + +$Input = Create-TmpJson @{ + Version = "1.0.0" + SignBatches = @( + @{ + SourceLocationType = "UNC" + SignRequestFiles = @( + @{ + SourceLocation = $args[0] + } + ) + SigningInfo = @{ + Operations = @( + @{ + KeyCode = "CP-229803" + OperationCode = "SigntoolSign" + Parameters = @{ + OpusName = "VS Code" + OpusInfo = "https://code.visualstudio.com/" + PageHash = "/NPH" + TimeStamp = "/t `"http://ts4096.gtm.microsoft.com/TSS/AuthenticodeTS`"" + } + ToolName = "sign" + ToolVersion = "1.0" + }, + @{ + KeyCode = "CP-230012" + OperationCode = "SigntoolSign" + Parameters = @{ + OpusName = "VS Code" + OpusInfo = "https://code.visualstudio.com/" + Append = "/as" + FileDigest = "/fd `"SHA256`"" + PageHash = "/NPH" + TimeStamp = "/tr `"http://rfc3161.gtm.corp.microsoft.com/TSS/HttpTspServer`" /td sha256" + } + ToolName = "sign" + ToolVersion = "1.0" + }, + @{ + KeyCode = "CP-230012" + OperationCode = "SigntoolVerify" + Parameters = @{ + VerifyAll = "/all" + } + ToolName = "sign" + ToolVersion = "1.0" + } + ) + } + } + ) +} + +$Output = [System.IO.Path]::GetTempFileName() +# $ScriptPath = Split-Path -Path $MyInvocation.MyCommand.Definition -Parent +# & "$ScriptPath\ESRPClient\packages\EsrpClient.1.0.27\tools\ESRPClient.exe" Sign -a $Auth -p $Policy -i $Input -o $Output \ No newline at end of file diff --git a/build/tsconfig.json b/build/tsconfig.json index d60805e7f7..b2cc8c8a0a 100644 --- a/build/tsconfig.json +++ b/build/tsconfig.json @@ -6,6 +6,7 @@ "removeComments": false, "preserveConstEnums": true, "sourceMap": false, + "resolveJsonModule": true, "experimentalDecorators": true, // enable JavaScript type checking for the language service // use the tsconfig.build.json for compiling wich disable JavaScript diff --git a/build/win32/.gitignore b/build/win32/.gitignore new file mode 100644 index 0000000000..809f6a264e --- /dev/null +++ b/build/win32/.gitignore @@ -0,0 +1 @@ +code-processed.iss \ No newline at end of file diff --git a/build/win32/OSSREADME.json b/build/win32/OSSREADME.json index c7f63b03a6..330e2c2b4f 100755 --- a/build/win32/OSSREADME.json +++ b/build/win32/OSSREADME.json @@ -37,7 +37,7 @@ "version": "1.2.1", "repositoryUrl": "https://github.com/BurntSushi/byteorder", "licenseDetail": [ - "The Source EULA", + "The MIT License (MIT)", "", "Copyright (c) 2015 Andrew Gallant", "", @@ -66,7 +66,7 @@ "version": "0.2.0", "repositoryUrl": "https://github.com/Sgeo/take_mut", "licenseDetail": [ - "The Source EULA", + "The MIT License (MIT)", "", "Copyright (c) 2016 Sgeo", "", @@ -128,7 +128,7 @@ "version": "0.4.0", "repositoryUrl": "https://github.com/chronotope/chrono", "licenseDetail": [ - "Rust-chrono is dual-licensed under The Source EULA [1] and", + "Rust-chrono is dual-licensed under The MIT License [1] and", "Apache 2.0 License [2]. Copyright (c) 2014--2017, Kang Seonghoon and", "contributors.", "", @@ -138,7 +138,7 @@ "[1]: , which is reproduced below:", "", "~~~~", - "The Source EULA", + "The MIT License (MIT)", "", "Copyright (c) 2014, Kang Seonghoon.", "", @@ -545,33 +545,6 @@ ], "isProd": true }, - { - "name": "retep998/winapi-rs", - "version": "0.3.4", - "repositoryUrl": "https://github.com/retep998/winapi-rs", - "licenseDetail": [ - "Copyright (c) 2015 The winapi-rs Developers", - "", - "Permission is hereby granted, free of charge, to any person obtaining a copy", - "of this software and associated documentation files (the \"Software\"), to deal", - "in the Software without restriction, including without limitation the rights", - "to use, copy, modify, merge, publish, distribute, sublicense, and/or sell", - "copies of the Software, and to permit persons to whom the Software is", - "furnished to do so, subject to the following conditions:", - "", - "The above copyright notice and this permission notice shall be included in all", - "copies or substantial portions of the Software.", - "", - "THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR", - "IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,", - "FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE", - "AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER", - "LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,", - "OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE", - "SOFTWARE." - ], - "isProd": true - }, { "name": "retep998/winapi-rs", "version": "0.2.8", @@ -707,6 +680,33 @@ ], "isProd": true }, + { + "name": "retep998/winapi-rs", + "version": "0.3.4", + "repositoryUrl": "https://github.com/retep998/winapi-rs", + "licenseDetail": [ + "Copyright (c) 2015 The winapi-rs Developers", + "", + "Permission is hereby granted, free of charge, to any person obtaining a copy", + "of this software and associated documentation files (the \"Software\"), to deal", + "in the Software without restriction, including without limitation the rights", + "to use, copy, modify, merge, publish, distribute, sublicense, and/or sell", + "copies of the Software, and to permit persons to whom the Software is", + "furnished to do so, subject to the following conditions:", + "", + "The above copyright notice and this permission notice shall be included in all", + "copies or substantial portions of the Software.", + "", + "THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR", + "IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,", + "FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE", + "AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER", + "LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,", + "OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE", + "SOFTWARE." + ], + "isProd": true + }, { "name": "rust-lang-nursery/lazy-static.rs", "version": "1.0.0", diff --git a/build/win32/code.iss b/build/win32/code.iss index 64d8d9bf5c..64f558633e 100644 --- a/build/win32/code.iss +++ b/build/win32/code.iss @@ -12,7 +12,6 @@ AppPublisherURL=https://github.com/Microsoft/sqlopsstudio AppSupportURL=https://github.com/Microsoft/sqlopsstudio AppUpdatesURL=https://github.com/Microsoft/sqlopsstudio -DefaultDirName={pf}\{#DirName} DefaultGroupName={#NameLong} AllowNoIcons=yes OutputDir={#OutputDir} @@ -35,6 +34,13 @@ ShowLanguageDialog=auto ArchitecturesAllowed={#ArchitecturesAllowed} ArchitecturesInstallIn64BitMode={#ArchitecturesInstallIn64BitMode} +#if "user" == InstallTarget +DefaultDirName={userpf}\{#DirName} +PrivilegesRequired=lowest +#else +DefaultDirName={pf}\{#DirName} +#endif + [Languages] Name: "english"; MessagesFile: "compiler:Default.isl,{#RepoDir}\build\win32\i18n\messages.en.isl" {#LocalizedLanguageFile} Name: "german"; MessagesFile: "compiler:Languages\German.isl,{#RepoDir}\build\win32\i18n\messages.de.isl" {#LocalizedLanguageFile("deu")} @@ -67,11 +73,12 @@ Name: "addtopath"; Description: "{cm:AddToPath}"; GroupDescription: "{cm:Other}" Name: "runcode"; Description: "{cm:RunAfter,{#NameShort}}"; GroupDescription: "{cm:Other}"; Check: WizardSilent [Files] -Source: "*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs +Source: "*"; Excludes: "\tools,\tools\*,\resources\app\product.json"; DestDir: "{code:GetDestDir}"; Flags: ignoreversion recursesubdirs createallsubdirs +Source: "{#ProductJsonPath}"; DestDir: "{code:GetDestDir}\resources\app"; Flags: ignoreversion [Icons] Name: "{group}\{#NameLong}"; Filename: "{app}\{#ExeBasename}.exe"; AppUserModelID: "{#AppUserId}" -Name: "{commondesktop}\{#NameLong}"; Filename: "{app}\{#ExeBasename}.exe"; AppUserModelID: "{#AppUserId}" +Name: "{commondesktop}\{#NameLong}"; Filename: "{app}\{#ExeBasename}.exe"; Tasks: desktopicon; AppUserModelID: "{#AppUserId}" Name: "{userappdata}\Microsoft\Internet Explorer\Quick Launch\{#NameLong}"; Filename: "{app}\{#ExeBasename}.exe"; Tasks: quicklaunchicon; AppUserModelID: "{#AppUserId}" [Run] @@ -79,6 +86,11 @@ Filename: "{app}\{#ExeBasename}.exe"; Description: "{cm:LaunchProgram,{#NameLong Filename: "{app}\{#ExeBasename}.exe"; Description: "{cm:LaunchProgram,{#NameLong}}"; Flags: nowait postinstall; Check: WizardNotSilent [Registry] +#if "user" == InstallTarget +#define SoftwareClassesRootKey "HKCU" +#else +#define SoftwareClassesRootKey "HKLM" +#endif Root: HKCR; Subkey: "{#RegValueName}SourceFile"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,{#NameLong}}"; Flags: uninsdeletekey Root: HKCR; Subkey: "{#RegValueName}SourceFile\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\app\resources\win32\code_file.ico" Root: HKCR; Subkey: "{#RegValueName}SourceFile\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#ExeBasename}.exe"" ""%1""" @@ -90,6 +102,20 @@ Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.sql"; ValueType: string; V Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.sql"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.sql\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\app\resources\win32\code_file.ico"; Tasks: associatewithfiles Root: HKCU; Subkey: "Software\Classes\{#RegValueName}.sql\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#ExeBasename}.exe"" ""%1"""; Tasks: associatewithfiles +; Environment +#if "user" == InstallTarget +#define EnvironmentRootKey "HKCU" +#define EnvironmentKey "Environment" +#define Uninstall64RootKey "HKCU64" +#define Uninstall32RootKey "HKCU32" +#else +#define EnvironmentRootKey "HKLM" +#define EnvironmentKey "System\CurrentControlSet\Control\Session Manager\Environment" +#define Uninstall64RootKey "HKLM64" +#define Uninstall32RootKey "HKLM32" +#endif + +Root: {#EnvironmentRootKey}; Subkey: "{#EnvironmentKey}"; ValueType: expandsz; ValueName: "Path"; ValueData: "{olddata};{app}\bin"; Tasks: addtopath; Check: NeedsAddPath(ExpandConstant('{app}\bin')) [Code] // Don't allow installing conflicting architectures @@ -101,15 +127,33 @@ var begin Result := True; - if IsWin64 then begin - RegKey := 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\' + copy('{#IncompatibleAppId}', 2, 38) + '_is1'; + #if "user" == InstallTarget + #if "ia32" == Arch + #define IncompatibleArchRootKey "HKLM32" + #else + #define IncompatibleArchRootKey "HKLM64" + #endif + + if not WizardSilent() then begin + RegKey := 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\' + copy('{#IncompatibleTargetAppId}', 2, 38) + '_is1'; + + if RegKeyExists({#IncompatibleArchRootKey}, RegKey) then begin + if MsgBox('{#NameShort} is already installed on this system for all users. We recommend first uninstalling that version before installing this one. Are you sure you want to continue the installation?', mbConfirmation, MB_YESNO) = IDNO then begin + Result := false; + end; + end; + end; + #endif + + if Result and IsWin64 then begin + RegKey := 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\' + copy('{#IncompatibleArchAppId}', 2, 38) + '_is1'; if '{#Arch}' = 'ia32' then begin - Result := not RegKeyExists(HKLM64, RegKey); + Result := not RegKeyExists({#Uninstall64RootKey}, RegKey); ThisArch := '32'; AltArch := '64'; end else begin - Result := not RegKeyExists(HKLM32, RegKey); + Result := not RegKeyExists({#Uninstall32RootKey}, RegKey); ThisArch := '64'; AltArch := '32'; end; @@ -218,7 +262,7 @@ function NeedsAddPath(Param: string): boolean; var OrigPath: string; begin - if not RegQueryStringValue(HKEY_CURRENT_USER, 'Environment', 'Path', OrigPath) + if not RegQueryStringValue({#EnvironmentRootKey}, '{#EnvironmentKey}', 'Path', OrigPath) then begin Result := True; exit; @@ -237,7 +281,7 @@ begin if not CurUninstallStep = usUninstall then begin exit; end; - if not RegQueryStringValue(HKEY_CURRENT_USER, 'Environment', 'Path', Path) + if not RegQueryStringValue({#EnvironmentRootKey}, '{#EnvironmentKey}', 'Path', Path) then begin exit; end; @@ -253,5 +297,9 @@ begin end; end; end; - RegWriteExpandStringValue(HKEY_CURRENT_USER, 'Environment', 'Path', NewPath); + RegWriteExpandStringValue({#EnvironmentRootKey}, '{#EnvironmentKey}', 'Path', NewPath); end; + +#ifdef Debug + #expr SaveToFile(AddBackslash(SourcePath) + "code-processed.iss") +#endif diff --git a/build/win32/inno_updater.exe b/build/win32/inno_updater.exe index 6d83b2b748..d2715b864f 100644 Binary files a/build/win32/inno_updater.exe and b/build/win32/inno_updater.exe differ diff --git a/build/yarn.lock b/build/yarn.lock index 928911be13..2febe1099a 100644 --- a/build/yarn.lock +++ b/build/yarn.lock @@ -2057,9 +2057,9 @@ tweetnacl@^0.14.3, tweetnacl@~0.14.0: version "0.14.5" resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" -typescript@2.8.1: - version "2.8.1" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.8.1.tgz#6160e4f8f195d5ba81d4876f9c0cc1fbc0820624" +typescript@2.9.2: + version "2.9.2" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.9.2.tgz#1cbf61d05d6b96269244eb6a3bce4bd914e0f00c" unbzip2-stream@^1.0.9: version "1.2.5" diff --git a/extensions/bat/syntaxes/batchfile.tmLanguage.json b/extensions/bat/syntaxes/batchfile.tmLanguage.json index e5f00ed382..26ae88f43c 100644 --- a/extensions/bat/syntaxes/batchfile.tmLanguage.json +++ b/extensions/bat/syntaxes/batchfile.tmLanguage.json @@ -4,7 +4,7 @@ "If you want to provide a fix or improvement, please create a pull request against the original repository.", "Once accepted there, we are happy to receive an update request." ], - "version": "https://github.com/mmims/language-batchfile/commit/6235c491be4dff49cd3966b50142874d7f79580a", + "version": "https://github.com/mmims/language-batchfile/commit/4b67596631b4ecd2c89c2ec1b2e08a6623438903", "name": "Batch File", "scopeName": "source.batchfile", "patterns": [ @@ -163,12 +163,6 @@ "end": "(?=$\\n|[&|><)])", "name": "meta.expression.set.batchfile", "patterns": [ - { - "include": "#command_set_inside_arithmetic" - }, - { - "include": "#command_set_group" - }, { "begin": "\"", "beginCaptures": { @@ -194,6 +188,12 @@ "include": "#variables" } ] + }, + { + "include": "#command_set_inside_arithmetic" + }, + { + "include": "#command_set_group" } ] }, @@ -266,8 +266,15 @@ "command_set_operators": { "patterns": [ { - "match": "\\+\\=|\\-\\=|\\*\\=|/\\=|%%\\=|&\\=|\\|\\=|\\^\\=|<<\\=|>>\\=", - "name": "keyword.operator.assignment.augmented.batchfile" + "match": "([^ ]*)(\\+\\=|\\-\\=|\\*\\=|\\/\\=|%%\\=|&\\=|\\|\\=|\\^\\=|<<\\=|>>\\=)", + "captures": { + "1": { + "name": "variable.other.readwrite.batchfile" + }, + "2": { + "name": "keyword.operator.assignment.augmented.batchfile" + } + } }, { "match": "\\+|\\-|/|\\*|%%|\\||&|\\^|<<|>>|~", @@ -278,8 +285,15 @@ "name": "keyword.operator.logical.batchfile" }, { - "match": "=", - "name": "keyword.operator.assignment.batchfile" + "match": "([^ ][^=]*)(=)", + "captures": { + "1": { + "name": "variable.other.readwrite.batchfile" + }, + "2": { + "name": "keyword.operator.assignment.batchfile" + } + } } ] }, diff --git a/extensions/bat/test/colorize-results/test_bat.json b/extensions/bat/test/colorize-results/test_bat.json index 789c3bc3e7..3bdf9368d4 100644 --- a/extensions/bat/test/colorize-results/test_bat.json +++ b/extensions/bat/test/colorize-results/test_bat.json @@ -3,10 +3,10 @@ "c": "@", "t": "source.batchfile keyword.operator.at.batchfile", "r": { - "dark_plus": "keyword.operator: #D4D4D4", - "light_plus": "keyword.operator: #000000", - "dark_vs": "keyword.operator: #D4D4D4", - "light_vs": "keyword.operator: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword.operator: #D4D4D4" } }, @@ -14,10 +14,10 @@ "c": "echo", "t": "source.batchfile keyword.command.batchfile", "r": { - "dark_plus": "keyword: #569CD6", - "light_plus": "keyword: #0000FF", - "dark_vs": "keyword: #569CD6", - "light_vs": "keyword: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword: #569CD6" } }, @@ -25,10 +25,10 @@ "c": " ", "t": "source.batchfile", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -36,10 +36,10 @@ "c": "off", "t": "source.batchfile keyword.other.special-method.batchfile", "r": { - "dark_plus": "keyword: #569CD6", - "light_plus": "keyword: #0000FF", - "dark_vs": "keyword: #569CD6", - "light_vs": "keyword: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword: #569CD6" } }, @@ -47,10 +47,10 @@ "c": "setlocal", "t": "source.batchfile keyword.command.batchfile", "r": { - "dark_plus": "keyword: #569CD6", - "light_plus": "keyword: #0000FF", - "dark_vs": "keyword: #569CD6", - "light_vs": "keyword: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword: #569CD6" } }, @@ -58,10 +58,10 @@ "c": "title", "t": "source.batchfile keyword.command.batchfile", "r": { - "dark_plus": "keyword: #569CD6", - "light_plus": "keyword: #0000FF", - "dark_vs": "keyword: #569CD6", - "light_vs": "keyword: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword: #569CD6" } }, @@ -69,10 +69,10 @@ "c": " VSCode Dev", "t": "source.batchfile", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -80,10 +80,10 @@ "c": "pushd", "t": "source.batchfile keyword.command.batchfile", "r": { - "dark_plus": "keyword: #569CD6", - "light_plus": "keyword: #0000FF", - "dark_vs": "keyword: #569CD6", - "light_vs": "keyword: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword: #569CD6" } }, @@ -91,10 +91,10 @@ "c": " ", "t": "source.batchfile", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -102,10 +102,10 @@ "c": "%", "t": "source.batchfile punctuation.definition.variable.batchfile", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -113,10 +113,10 @@ "c": "~dp0", "t": "source.batchfile variable.parameter.batchfile", "r": { - "dark_plus": "variable: #9CDCFE", - "light_plus": "variable: #001080", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "variable: #9CDCFE" } }, @@ -124,10 +124,10 @@ "c": "\\..", "t": "source.batchfile", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -135,10 +135,10 @@ "c": "::", "t": "source.batchfile comment.line.colon.batchfile punctuation.definition.comment.batchfile", "r": { - "dark_plus": "comment: #608B4E", - "light_plus": "comment: #008000", - "dark_vs": "comment: #608B4E", - "light_vs": "comment: #008000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "comment: #7CA668" } }, @@ -146,10 +146,10 @@ "c": " Node modules", "t": "source.batchfile comment.line.colon.batchfile", "r": { - "dark_plus": "comment: #608B4E", - "light_plus": "comment: #008000", - "dark_vs": "comment: #608B4E", - "light_vs": "comment: #008000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "comment: #7CA668" } }, @@ -157,10 +157,10 @@ "c": "if", "t": "source.batchfile keyword.control.conditional.batchfile", "r": { - "dark_plus": "keyword.control: #C586C0", - "light_plus": "keyword.control: #AF00DB", - "dark_vs": "keyword.control: #569CD6", - "light_vs": "keyword.control: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword.control: #C586C0" } }, @@ -168,10 +168,10 @@ "c": " ", "t": "source.batchfile", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -179,10 +179,10 @@ "c": "not", "t": "source.batchfile keyword.operator.logical.batchfile", "r": { - "dark_plus": "keyword.operator: #D4D4D4", - "light_plus": "keyword.operator: #000000", - "dark_vs": "keyword.operator: #D4D4D4", - "light_vs": "keyword.operator: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword.operator: #D4D4D4" } }, @@ -190,10 +190,10 @@ "c": " ", "t": "source.batchfile", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -201,10 +201,10 @@ "c": "exist", "t": "source.batchfile keyword.other.special-method.batchfile", "r": { - "dark_plus": "keyword: #569CD6", - "light_plus": "keyword: #0000FF", - "dark_vs": "keyword: #569CD6", - "light_vs": "keyword: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword: #569CD6" } }, @@ -212,10 +212,10 @@ "c": " node_modules ", "t": "source.batchfile", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -223,10 +223,10 @@ "c": "call", "t": "source.batchfile keyword.control.statement.batchfile", "r": { - "dark_plus": "keyword.control: #C586C0", - "light_plus": "keyword.control: #AF00DB", - "dark_vs": "keyword.control: #569CD6", - "light_vs": "keyword.control: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword.control: #C586C0" } }, @@ -234,10 +234,10 @@ "c": " .\\scripts\\npm.bat install", "t": "source.batchfile", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -245,10 +245,10 @@ "c": "::", "t": "source.batchfile comment.line.colon.batchfile punctuation.definition.comment.batchfile", "r": { - "dark_plus": "comment: #608B4E", - "light_plus": "comment: #008000", - "dark_vs": "comment: #608B4E", - "light_vs": "comment: #008000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "comment: #7CA668" } }, @@ -256,10 +256,10 @@ "c": " Get electron", "t": "source.batchfile comment.line.colon.batchfile", "r": { - "dark_plus": "comment: #608B4E", - "light_plus": "comment: #008000", - "dark_vs": "comment: #608B4E", - "light_vs": "comment: #008000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "comment: #7CA668" } }, @@ -267,10 +267,10 @@ "c": "node .\\node_modules\\gulp\\bin\\gulp.js electron", "t": "source.batchfile", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -278,10 +278,10 @@ "c": "::", "t": "source.batchfile comment.line.colon.batchfile punctuation.definition.comment.batchfile", "r": { - "dark_plus": "comment: #608B4E", - "light_plus": "comment: #008000", - "dark_vs": "comment: #608B4E", - "light_vs": "comment: #008000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "comment: #7CA668" } }, @@ -289,10 +289,10 @@ "c": " Build", "t": "source.batchfile comment.line.colon.batchfile", "r": { - "dark_plus": "comment: #608B4E", - "light_plus": "comment: #008000", - "dark_vs": "comment: #608B4E", - "light_vs": "comment: #008000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "comment: #7CA668" } }, @@ -300,10 +300,10 @@ "c": "if", "t": "source.batchfile keyword.control.conditional.batchfile", "r": { - "dark_plus": "keyword.control: #C586C0", - "light_plus": "keyword.control: #AF00DB", - "dark_vs": "keyword.control: #569CD6", - "light_vs": "keyword.control: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword.control: #C586C0" } }, @@ -311,10 +311,10 @@ "c": " ", "t": "source.batchfile", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -322,10 +322,10 @@ "c": "not", "t": "source.batchfile keyword.operator.logical.batchfile", "r": { - "dark_plus": "keyword.operator: #D4D4D4", - "light_plus": "keyword.operator: #000000", - "dark_vs": "keyword.operator: #D4D4D4", - "light_vs": "keyword.operator: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword.operator: #D4D4D4" } }, @@ -333,10 +333,10 @@ "c": " ", "t": "source.batchfile", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -344,10 +344,10 @@ "c": "exist", "t": "source.batchfile keyword.other.special-method.batchfile", "r": { - "dark_plus": "keyword: #569CD6", - "light_plus": "keyword: #0000FF", - "dark_vs": "keyword: #569CD6", - "light_vs": "keyword: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword: #569CD6" } }, @@ -355,10 +355,10 @@ "c": " out node .\\node_modules\\gulp\\bin\\gulp.js compile", "t": "source.batchfile", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -366,10 +366,10 @@ "c": "::", "t": "source.batchfile comment.line.colon.batchfile punctuation.definition.comment.batchfile", "r": { - "dark_plus": "comment: #608B4E", - "light_plus": "comment: #008000", - "dark_vs": "comment: #608B4E", - "light_vs": "comment: #008000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "comment: #7CA668" } }, @@ -377,10 +377,10 @@ "c": " Configuration", "t": "source.batchfile comment.line.colon.batchfile", "r": { - "dark_plus": "comment: #608B4E", - "light_plus": "comment: #008000", - "dark_vs": "comment: #608B4E", - "light_vs": "comment: #008000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "comment: #7CA668" } }, @@ -388,10 +388,10 @@ "c": "set", "t": "source.batchfile keyword.command.batchfile", "r": { - "dark_plus": "keyword: #569CD6", - "light_plus": "keyword: #0000FF", - "dark_vs": "keyword: #569CD6", - "light_vs": "keyword: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword: #569CD6" } }, @@ -399,10 +399,10 @@ "c": " ", "t": "source.batchfile", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -410,10 +410,10 @@ "c": "NODE_ENV", "t": "source.batchfile variable.other.readwrite.batchfile", "r": { - "dark_plus": "variable: #9CDCFE", - "light_plus": "variable: #001080", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "variable: #9CDCFE" } }, @@ -421,10 +421,10 @@ "c": "=", "t": "source.batchfile keyword.operator.assignment.batchfile", "r": { - "dark_plus": "keyword.operator: #D4D4D4", - "light_plus": "keyword.operator: #000000", - "dark_vs": "keyword.operator: #D4D4D4", - "light_vs": "keyword.operator: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword.operator: #D4D4D4" } }, @@ -432,10 +432,10 @@ "c": "development", "t": "source.batchfile", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -443,10 +443,10 @@ "c": "call", "t": "source.batchfile keyword.control.statement.batchfile", "r": { - "dark_plus": "keyword.control: #C586C0", - "light_plus": "keyword.control: #AF00DB", - "dark_vs": "keyword.control: #569CD6", - "light_vs": "keyword.control: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword.control: #C586C0" } }, @@ -454,10 +454,10 @@ "c": " ", "t": "source.batchfile", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -465,10 +465,10 @@ "c": "echo", "t": "source.batchfile keyword.command.batchfile", "r": { - "dark_plus": "keyword: #569CD6", - "light_plus": "keyword: #0000FF", - "dark_vs": "keyword: #569CD6", - "light_vs": "keyword: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword: #569CD6" } }, @@ -476,10 +476,10 @@ "c": " ", "t": "source.batchfile", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -487,10 +487,10 @@ "c": "%%", "t": "source.batchfile constant.character.escape.batchfile", "r": { - "dark_plus": "constant.character.escape: #D7BA7D", - "light_plus": "constant.character.escape: #A31515", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "constant.character: #569CD6" } }, @@ -498,10 +498,10 @@ "c": "LINE:rem +=", "t": "source.batchfile", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -509,10 +509,10 @@ "c": "%%", "t": "source.batchfile constant.character.escape.batchfile", "r": { - "dark_plus": "constant.character.escape: #D7BA7D", - "light_plus": "constant.character.escape: #A31515", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "constant.character: #569CD6" } }, @@ -520,10 +520,10 @@ "c": "popd", "t": "source.batchfile keyword.command.batchfile", "r": { - "dark_plus": "keyword: #569CD6", - "light_plus": "keyword: #0000FF", - "dark_vs": "keyword: #569CD6", - "light_vs": "keyword: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword: #569CD6" } }, @@ -531,10 +531,10 @@ "c": "endlocal", "t": "source.batchfile keyword.command.batchfile", "r": { - "dark_plus": "keyword: #569CD6", - "light_plus": "keyword: #0000FF", - "dark_vs": "keyword: #569CD6", - "light_vs": "keyword: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword: #569CD6" } } diff --git a/extensions/configuration-editing/package.json b/extensions/configuration-editing/package.json index 7a6798f8eb..f63d8c8408 100644 --- a/extensions/configuration-editing/package.json +++ b/extensions/configuration-editing/package.json @@ -18,9 +18,28 @@ }, "dependencies": { "jsonc-parser": "^1.0.0", - "vscode-nls": "^3.2.1" + "vscode-nls": "^3.2.4" }, "contributes": { + "languages": [ + { + "id": "jsonc", + "extensions": [ + ".code-workspace", + "language-configuration.json", + "icon-theme.json", + "color-theme.json", + ".code-snippets" + ], + "filenames": [ + "settings.json", + "launch.json", + "tasks.json", + "keybindings.json", + "extensions.json" + ] + } + ], "jsonValidation": [ { "fileMatch": "vscode://defaultsettings/keybindings.json", diff --git a/extensions/configuration-editing/package.nls.json b/extensions/configuration-editing/package.nls.json index b8c247a9de..20a9c1af8b 100644 --- a/extensions/configuration-editing/package.nls.json +++ b/extensions/configuration-editing/package.nls.json @@ -1,4 +1,4 @@ { "displayName": "Configuration Editing", - "description": "Provides capabilities (advanced IntelliSense, auto-fixing) in configuration files like settings, launch and extension recommendation files." + "description": "Provides capabilities (advanced IntelliSense, auto-fixing) in configuration files like settings, launch, and extension recommendation files." } \ No newline at end of file diff --git a/extensions/configuration-editing/src/extension.ts b/extensions/configuration-editing/src/extension.ts index 1a9ed8dba4..853cad9e13 100644 --- a/extensions/configuration-editing/src/extension.ts +++ b/extensions/configuration-editing/src/extension.ts @@ -27,6 +27,12 @@ export function activate(context: vscode.ExtensionContext): void { //extensions suggestions context.subscriptions.push(...registerExtensionsCompletions()); + // launch.json variable suggestions + context.subscriptions.push(registerVariableCompletions('**/launch.json')); + + // task.json variable suggestions + context.subscriptions.push(registerVariableCompletions('**/tasks.json')); + // launch.json decorations context.subscriptions.push(vscode.window.onDidChangeActiveTextEditor(editor => updateLaunchJsonDecorations(editor), null, context.subscriptions)); context.subscriptions.push(vscode.workspace.onDidChangeTextDocument(event => { @@ -108,6 +114,30 @@ function registerSettingsCompletions(): vscode.Disposable { }); } +function registerVariableCompletions(pattern: string): vscode.Disposable { + return vscode.languages.registerCompletionItemProvider({ language: 'jsonc', pattern }, { + provideCompletionItems(document, position, token) { + const location = getLocation(document.getText(), document.offsetAt(position)); + if (!location.isAtPropertyKey && location.previousNode && location.previousNode.type === 'string') { + const indexOf$ = document.lineAt(position.line).text.indexOf('$'); + const startPosition = indexOf$ >= 0 ? new vscode.Position(position.line, indexOf$) : position; + + return [{ label: 'workspaceFolder', detail: localize('workspaceFolder', "The path of the folder opened in VS Code") }, { label: 'workspaceFolderBasename', detail: localize('workspaceFolderBasename', "The name of the folder opened in VS Code without any slashes (/)") }, + { label: 'relativeFile', detail: localize('relativeFile', "The current opened file relative to ${workspaceFolder}") }, { label: 'file', detail: localize('file', "The current opened file") }, { label: 'cwd', detail: localize('cwd', "The task runner's current working directory on startup") }, + { label: 'lineNumber', detail: localize('lineNumber', "The current selected line number in the active file") }, { label: 'selectedText', detail: localize('selectedText', "The current selected text in the active file") }, + { label: 'fileDirname', detail: localize('fileDirname', "The current opened file's dirname") }, { label: 'fileExtname', detail: localize('fileExtname', "The current opened file's extension") }, { label: 'fileBasename', detail: localize('fileBasename', "The current opened file's basename") }, + { label: 'fileBasenameNoExtension', detail: localize('fileBasenameNoExtension', "The current opened file's basename with no file extension") }].map(variable => ({ + label: '${' + variable.label + '}', + range: new vscode.Range(startPosition, position), + detail: variable.detail + })); + } + + return []; + } + }); +} + interface IExtensionsContent { recommendations: string[]; } diff --git a/extensions/configuration-editing/yarn.lock b/extensions/configuration-editing/yarn.lock index 29d3d43ae8..bcf4ddb12d 100644 --- a/extensions/configuration-editing/yarn.lock +++ b/extensions/configuration-editing/yarn.lock @@ -10,6 +10,6 @@ jsonc-parser@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-1.0.0.tgz#ddcc864ae708e60a7a6dd36daea00172fa8d9272" -vscode-nls@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/vscode-nls/-/vscode-nls-3.2.1.tgz#b1f3e04e8a94a715d5a7bcbc8339c51e6d74ca51" +vscode-nls@^3.2.4: + version "3.2.4" + resolved "https://registry.yarnpkg.com/vscode-nls/-/vscode-nls-3.2.4.tgz#2166b4183c8aea884d20727f5449e62be69fd398" diff --git a/extensions/docker/test/colorize-results/Dockerfile.json b/extensions/docker/test/colorize-results/Dockerfile.json index a18ec445c0..1b29260acf 100644 --- a/extensions/docker/test/colorize-results/Dockerfile.json +++ b/extensions/docker/test/colorize-results/Dockerfile.json @@ -3,10 +3,10 @@ "c": "FROM", "t": "source.dockerfile keyword.other.special-method.dockerfile", "r": { - "dark_plus": "keyword: #569CD6", - "light_plus": "keyword: #0000FF", - "dark_vs": "keyword: #569CD6", - "light_vs": "keyword: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword: #569CD6" } }, @@ -14,10 +14,10 @@ "c": " ubuntu", "t": "source.dockerfile", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -25,10 +25,10 @@ "c": "MAINTAINER", "t": "source.dockerfile keyword.other.special-method.dockerfile", "r": { - "dark_plus": "keyword: #569CD6", - "light_plus": "keyword: #0000FF", - "dark_vs": "keyword: #569CD6", - "light_vs": "keyword: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword: #569CD6" } }, @@ -36,10 +36,10 @@ "c": " Kimbro Staken", "t": "source.dockerfile", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -47,10 +47,10 @@ "c": "RUN", "t": "source.dockerfile keyword.other.special-method.dockerfile", "r": { - "dark_plus": "keyword: #569CD6", - "light_plus": "keyword: #0000FF", - "dark_vs": "keyword: #569CD6", - "light_vs": "keyword: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword: #569CD6" } }, @@ -58,10 +58,10 @@ "c": " apt-get install -y software-properties-common python", "t": "source.dockerfile", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -69,10 +69,10 @@ "c": "RUN", "t": "source.dockerfile keyword.other.special-method.dockerfile", "r": { - "dark_plus": "keyword: #569CD6", - "light_plus": "keyword: #0000FF", - "dark_vs": "keyword: #569CD6", - "light_vs": "keyword: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword: #569CD6" } }, @@ -80,10 +80,10 @@ "c": " add-apt-repository ppa:chris-lea/node.js", "t": "source.dockerfile", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -91,10 +91,10 @@ "c": "RUN", "t": "source.dockerfile keyword.other.special-method.dockerfile", "r": { - "dark_plus": "keyword: #569CD6", - "light_plus": "keyword: #0000FF", - "dark_vs": "keyword: #569CD6", - "light_vs": "keyword: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword: #569CD6" } }, @@ -102,10 +102,10 @@ "c": " echo ", "t": "source.dockerfile", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -113,10 +113,10 @@ "c": "\"deb http://us.archive.ubuntu.com/ubuntu/ precise universe\"", "t": "source.dockerfile string.quoted.double.dockerfile", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string: #A31515", - "dark_vs": "string: #CE9178", - "light_vs": "string: #A31515", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -124,10 +124,10 @@ "c": " >> /etc/apt/sources.list", "t": "source.dockerfile", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -135,10 +135,10 @@ "c": "RUN", "t": "source.dockerfile keyword.other.special-method.dockerfile", "r": { - "dark_plus": "keyword: #569CD6", - "light_plus": "keyword: #0000FF", - "dark_vs": "keyword: #569CD6", - "light_vs": "keyword: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword: #569CD6" } }, @@ -146,10 +146,10 @@ "c": " apt-get update", "t": "source.dockerfile", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -157,10 +157,10 @@ "c": "RUN", "t": "source.dockerfile keyword.other.special-method.dockerfile", "r": { - "dark_plus": "keyword: #569CD6", - "light_plus": "keyword: #0000FF", - "dark_vs": "keyword: #569CD6", - "light_vs": "keyword: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword: #569CD6" } }, @@ -168,10 +168,10 @@ "c": " apt-get install -y nodejs", "t": "source.dockerfile", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -179,10 +179,10 @@ "c": "#", "t": "source.dockerfile comment.line.number-sign.dockerfile punctuation.definition.comment.dockerfile", "r": { - "dark_plus": "comment: #608B4E", - "light_plus": "comment: #008000", - "dark_vs": "comment: #608B4E", - "light_vs": "comment: #008000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "comment: #7CA668" } }, @@ -190,10 +190,10 @@ "c": "RUN apt-get install -y nodejs=0.6.12~dfsg1-1ubuntu1", "t": "source.dockerfile comment.line.number-sign.dockerfile", "r": { - "dark_plus": "comment: #608B4E", - "light_plus": "comment: #008000", - "dark_vs": "comment: #608B4E", - "light_vs": "comment: #008000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "comment: #7CA668" } }, @@ -201,10 +201,10 @@ "c": "RUN", "t": "source.dockerfile keyword.other.special-method.dockerfile", "r": { - "dark_plus": "keyword: #569CD6", - "light_plus": "keyword: #0000FF", - "dark_vs": "keyword: #569CD6", - "light_vs": "keyword: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword: #569CD6" } }, @@ -212,10 +212,10 @@ "c": " mkdir /var/www", "t": "source.dockerfile", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -223,10 +223,10 @@ "c": "ADD", "t": "source.dockerfile keyword.other.special-method.dockerfile", "r": { - "dark_plus": "keyword: #569CD6", - "light_plus": "keyword: #0000FF", - "dark_vs": "keyword: #569CD6", - "light_vs": "keyword: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword: #569CD6" } }, @@ -234,10 +234,10 @@ "c": " app.js /var/www/app.js", "t": "source.dockerfile", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -245,10 +245,10 @@ "c": "CMD", "t": "source.dockerfile keyword.other.special-method.dockerfile", "r": { - "dark_plus": "keyword: #569CD6", - "light_plus": "keyword: #0000FF", - "dark_vs": "keyword: #569CD6", - "light_vs": "keyword: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword: #569CD6" } }, @@ -256,10 +256,10 @@ "c": " [", "t": "source.dockerfile", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -267,10 +267,10 @@ "c": "\"/usr/bin/node\"", "t": "source.dockerfile string.quoted.double.dockerfile", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string: #A31515", - "dark_vs": "string: #CE9178", - "light_vs": "string: #A31515", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -278,10 +278,10 @@ "c": ", ", "t": "source.dockerfile", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -289,10 +289,10 @@ "c": "\"/var/www/app.js\"", "t": "source.dockerfile string.quoted.double.dockerfile", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string: #A31515", - "dark_vs": "string: #CE9178", - "light_vs": "string: #A31515", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -300,10 +300,10 @@ "c": "] ", "t": "source.dockerfile", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } } diff --git a/extensions/extension-editing/package.json b/extensions/extension-editing/package.json index e5c502426c..88b339023b 100644 --- a/extensions/extension-editing/package.json +++ b/extensions/extension-editing/package.json @@ -21,7 +21,7 @@ "jsonc-parser": "^1.0.0", "markdown-it": "^8.3.1", "parse5": "^3.0.2", - "vscode-nls": "^3.2.1" + "vscode-nls": "^3.2.4" }, "contributes": { "jsonValidation": [ diff --git a/extensions/extension-editing/package.nls.json b/extensions/extension-editing/package.nls.json index 9265e6a3c9..263fb6bc87 100644 --- a/extensions/extension-editing/package.nls.json +++ b/extensions/extension-editing/package.nls.json @@ -1,4 +1,4 @@ { - "displayName": "Package File Editing", - "description": "Provides IntelliSense for VS Code extension points and linting capabilities in package.json files." + "displayName": "Extension Authoring", + "description": "Provides linting capabilities for authoring extensions." } \ No newline at end of file diff --git a/extensions/extension-editing/src/extensionLinter.ts b/extensions/extension-editing/src/extensionLinter.ts index 36d312d7df..282e86db26 100644 --- a/extensions/extension-editing/src/extensionLinter.ts +++ b/extensions/extension-editing/src/extensionLinter.ts @@ -3,7 +3,6 @@ * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as fs from 'fs'; import * as path from 'path'; import * as nls from 'vscode-nls'; @@ -264,13 +263,16 @@ export class ExtensionLinter { } private async loadPackageJson(folder: Uri) { - const file = folder.with({ path: path.posix.join(folder.path, 'package.json') }); - const exists = await fileExists(file.fsPath); - if (!exists) { + if (folder.scheme === 'git') { // #36236 + return undefined; + } + const file = folder.with({ path: path.posix.join(folder.path, 'package.json') }); + try { + const document = await workspace.openTextDocument(file); + return parseTree(document.getText()); + } catch (err) { return undefined; } - const document = await workspace.openTextDocument(file); - return parseTree(document.getText()); } private packageJsonChanged(folder: Uri) { @@ -338,20 +340,6 @@ function endsWith(haystack: string, needle: string): boolean { } } -function fileExists(path: string): Promise { - return new Promise((resolve, reject) => { - fs.lstat(path, (err, stats) => { - if (!err) { - resolve(true); - } else if (err.code === 'ENOENT') { - resolve(false); - } else { - reject(err); - } - }); - }); -} - function parseUri(src: string) { try { return Uri.parse(src); diff --git a/extensions/extension-editing/yarn.lock b/extensions/extension-editing/yarn.lock index 350fdcb5fe..cdc02d1e03 100644 --- a/extensions/extension-editing/yarn.lock +++ b/extensions/extension-editing/yarn.lock @@ -58,6 +58,6 @@ uc.micro@^1.0.1, uc.micro@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-1.0.3.tgz#7ed50d5e0f9a9fb0a573379259f2a77458d50192" -vscode-nls@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/vscode-nls/-/vscode-nls-3.2.1.tgz#b1f3e04e8a94a715d5a7bcbc8339c51e6d74ca51" +vscode-nls@^3.2.4: + version "3.2.4" + resolved "https://registry.yarnpkg.com/vscode-nls/-/vscode-nls-3.2.4.tgz#2166b4183c8aea884d20727f5449e62be69fd398" diff --git a/extensions/git/README.md b/extensions/git/README.md index b97ec81e9a..bd7a8ef26c 100644 --- a/extensions/git/README.md +++ b/extensions/git/README.md @@ -1,2 +1,7 @@ # Git integration for Visual Studio Code +**Notice:** This extension is bundled with Visual Studio Code. It can be disabled but not uninstalled. + +## Features + +See [Git support in VS Code](https://code.visualstudio.com/docs/editor/versioncontrol#_git-support) to learn about the features of this extension. \ No newline at end of file diff --git a/extensions/git/languages/ignore.language-configuration.json b/extensions/git/languages/ignore.language-configuration.json new file mode 100644 index 0000000000..b75f42e22a --- /dev/null +++ b/extensions/git/languages/ignore.language-configuration.json @@ -0,0 +1,5 @@ +{ + "comments": { + "lineComment": "#", + } +} diff --git a/extensions/git/package.json b/extensions/git/package.json index c2851ea34c..371637af77 100644 --- a/extensions/git/package.json +++ b/extensions/git/package.json @@ -38,6 +38,11 @@ "dark": "resources/icons/dark/git.svg" } }, + { + "command": "git.openRepository", + "title": "%command.openRepository%", + "category": "Git" + }, { "command": "git.close", "title": "%command.close%", @@ -336,6 +341,10 @@ "command": "git.init", "when": "config.git.enabled" }, + { + "command": "git.openRepository", + "when": "config.git.enabled" + }, { "command": "git.close", "when": "config.git.enabled && gitOpenRepositoryCount != 0" @@ -881,7 +890,16 @@ "scope": "application" }, "git.autoRepositoryDetection": { - "type": "boolean", + "type": [ + "boolean", + "string" + ], + "enum": [ + true, + false, + "subFolders", + "openEditors" + ], "description": "%config.autoRepositoryDetection%", "default": true }, @@ -893,7 +911,8 @@ "git.autofetch": { "type": "boolean", "description": "%config.autofetch%", - "default": false + "default": false, + "tags": ["usesOnlineServices"] }, "git.confirmSync": { "type": "boolean", @@ -907,6 +926,11 @@ "tracked", "off" ], + "enumDescriptions": [ + "%config.countBadge.all%", + "%config.countBadge.tracked%", + "%config.countBadge.off%" + ], "description": "%config.countBadge%", "default": "all" }, @@ -918,6 +942,12 @@ "tags", "remote" ], + "enumDescriptions": [ + "%config.checkoutType.all%", + "%config.checkoutType.local%", + "%config.checkoutType.tags%", + "%config.checkoutType.remote%" + ], "description": "%config.checkoutType%", "default": "all" }, @@ -943,11 +973,13 @@ }, "git.enableSmartCommit": { "type": "boolean", + "scope": "resource", "description": "%config.enableSmartCommit%", "default": false }, "git.enableCommitSigning": { "type": "boolean", + "scope": "resource", "description": "%config.enableCommitSigning%", "default": false }, @@ -958,6 +990,7 @@ }, "git.promptToSaveFilesBeforeCommit": { "type": "boolean", + "scope": "resource", "default": false, "description": "%config.promptToSaveFilesBeforeCommit%" }, @@ -966,6 +999,11 @@ "default": true, "description": "%config.showInlineOpenFileAction%" }, + "git.showPushSuccessNotification": { + "type": "boolean", + "description": "%config.showPushSuccessNotification%", + "default": false + }, "git.inputValidation": { "type": "string", "enum": [ @@ -987,15 +1025,36 @@ "scope": "resource", "default": 10, "description": "%config.detectSubmodulesLimit%" + }, + "git.alwaysSignOff": { + "type": "boolean", + "scope": "resource", + "default": false, + "description": "%config.alwaysSignOff%" + }, + "git.ignoredRepositories": { + "type": "array", + "default": [], + "scope": "window", + "description": "%config.ignoredRepositories%" } } }, "colors": [ + { + "id": "gitDecoration.addedResourceForeground", + "description": "%colors.added%", + "defaults": { + "light": "#587c0c", + "dark": "#81b88b", + "highContrast": "#1b5225" + } + }, { "id": "gitDecoration.modifiedResourceForeground", "description": "%colors.modified%", "defaults": { - "light": "#a76e12", + "light": "#895503", "dark": "#E2C08D", "highContrast": "#E2C08D" } @@ -1013,7 +1072,7 @@ "id": "gitDecoration.untrackedResourceForeground", "description": "%colors.untracked%", "defaults": { - "light": "#019001", + "light": "#018101", "dark": "#73C991", "highContrast": "#73C991" } @@ -1082,6 +1141,17 @@ ".rej" ], "configuration": "./languages/diff.language-configuration.json" + }, + { + "id": "ignore", + "aliases": [ + "Ignore", + "ignore" + ], + "filenames": [ + ".gitignore" + ], + "configuration": "./languages/ignore.language-configuration.json" } ], "grammars": [ @@ -1099,6 +1169,11 @@ "language": "diff", "scopeName": "source.diff", "path": "./syntaxes/diff.tmLanguage.json" + }, + { + "language": "ignore", + "scopeName": "source.ignore", + "path": "./syntaxes/ignore.tmLanguage.json" } ], "configurationDefaults": { @@ -1114,8 +1189,8 @@ "file-type": "^7.2.0", "iconv-lite": "0.4.19", "jschardet": "^1.6.0", - "vscode-extension-telemetry": "0.0.17", - "vscode-nls": "^3.2.1", + "vscode-extension-telemetry": "0.0.18", + "vscode-nls": "^3.2.4", "which": "^1.3.0" }, "devDependencies": { @@ -1126,4 +1201,4 @@ "@types/which": "^1.0.28", "mocha": "^3.2.0" } -} +} \ No newline at end of file diff --git a/extensions/git/package.nls.json b/extensions/git/package.nls.json index 7f2c43dd23..dc335771b9 100644 --- a/extensions/git/package.nls.json +++ b/extensions/git/package.nls.json @@ -3,6 +3,7 @@ "description": "Git SCM Integration", "command.clone": "Clone", "command.init": "Initialize Repository", + "command.openRepository": "Open Repository", "command.close": "Close Repository", "command.refresh": "Refresh", "command.openChange": "Open Changes", @@ -49,28 +50,39 @@ "command.stash": "Stash", "command.stashPop": "Pop Stash...", "command.stashPopLatest": "Pop Latest Stash", - "config.enabled": "Whether git is enabled", - "config.path": "Path to the git executable", - "config.autoRepositoryDetection": "Whether repositories should be automatically detected", - "config.autorefresh": "Whether auto refreshing is enabled", - "config.autofetch": "Whether auto fetching is enabled", - "config.enableLongCommitWarning": "Whether long commit messages should be warned about", - "config.confirmSync": "Confirm before synchronizing git repositories", - "config.countBadge": "Controls the git badge counter. `all` counts all changes. `tracked` counts only the tracked changes. `off` turns it off.", - "config.checkoutType": "Controls what type of branches are listed when running `Checkout to...`. `all` shows all refs, `local` shows only the local branches, `tags` shows only tags and `remote` shows only remote branches.", - "config.ignoreLegacyWarning": "Ignores the legacy Git warning", - "config.ignoreMissingGitWarning": "Ignores the warning when Git is missing", - "config.ignoreLimitWarning": "Ignores the warning when there are too many changes in a repository", - "config.defaultCloneDirectory": "The default location where to clone a git repository", + "config.enabled": "Whether git is enabled.", + "config.path": "Path to the git executable.", + "config.autoRepositoryDetection": "Configures when repositories should be automatically detected.", + "config.autorefresh": "Whether auto refreshing is enabled.", + "config.autofetch": "Whether auto fetching is enabled.", + "config.enableLongCommitWarning": "Whether long commit messages should be warned about.", + "config.confirmSync": "Confirm before synchronizing git repositories.", + "config.countBadge": "Controls the git badge counter.", + "config.countBadge.all": "Count all changes.", + "config.countBadge.tracked": "Count only tracked changes.", + "config.countBadge.off": "Turn off counter.", + "config.checkoutType": "Controls what type of branches are listed when running `Checkout to...`.", + "config.checkoutType.all": "Show all references.", + "config.checkoutType.local": "Show only local branches.", + "config.checkoutType.tags": "Show only tags.", + "config.checkoutType.remote": "Show only remote branches.", + "config.ignoreLegacyWarning": "Ignores the legacy Git warning.", + "config.ignoreMissingGitWarning": "Ignores the warning when Git is missing.", + "config.ignoreLimitWarning": "Ignores the warning when there are too many changes in a repository.", + "config.defaultCloneDirectory": "The default location to clone a git repository.", "config.enableSmartCommit": "Commit all changes when there are no staged changes.", "config.enableCommitSigning": "Enables commit signing with GPG.", "config.discardAllScope": "Controls what changes are discarded by the `Discard all changes` command. `all` discards all changes. `tracked` discards only tracked files. `prompt` shows a prompt dialog every time the action is run.", - "config.decorations.enabled": "Controls if Git contributes colors and badges to the explorer and the open editors view.", + "config.decorations.enabled": "Controls whether Git contributes colors and badges to the explorer and the open editors view.", "config.promptToSaveFilesBeforeCommit": "Controls whether Git should check for unsaved files before committing.", "config.showInlineOpenFileAction": "Controls whether to show an inline Open File action in the Git changes view.", + "config.showPushSuccessNotification": "Controls whether to show a notification when a push is successful.", "config.inputValidation": "Controls when to show commit message input validation.", "config.detectSubmodules": "Controls whether to automatically detect git submodules.", + "colors.added": "Color for added resources.", "config.detectSubmodulesLimit": "Controls the limit of git submodules detected.", + "config.alwaysSignOff": "Controls the signoff flag for all commits.", + "config.ignoredRepositories": "List of git repositories to ignore.", "colors.modified": "Color for modified resources.", "colors.deleted": "Color for deleted resources.", "colors.untracked": "Color for untracked resources.", diff --git a/extensions/git/resources/icons/dark/open-change.svg b/extensions/git/resources/icons/dark/open-change.svg index c951728aba..e43ba7616c 100644 --- a/extensions/git/resources/icons/dark/open-change.svg +++ b/extensions/git/resources/icons/dark/open-change.svg @@ -1 +1 @@ - \ No newline at end of file +Compare_16x \ No newline at end of file diff --git a/extensions/git/resources/icons/light/open-change.svg b/extensions/git/resources/icons/light/open-change.svg index 3a205509bc..e53964f3b8 100644 --- a/extensions/git/resources/icons/light/open-change.svg +++ b/extensions/git/resources/icons/light/open-change.svg @@ -1 +1 @@ - \ No newline at end of file +Compare_16x \ No newline at end of file diff --git a/extensions/git/src/api.ts b/extensions/git/src/api.ts index 41b3103ade..a4cde7c98c 100644 --- a/extensions/git/src/api.ts +++ b/extensions/git/src/api.ts @@ -42,19 +42,24 @@ export interface API { export class APIImpl implements API { - constructor(private modelPromise: Promise) { } + constructor(private model: Model) { } async getGitPath(): Promise { - const model = await this.modelPromise; - return model.git.path; + return this.model.git.path; } async getRepositories(): Promise { - const model = await this.modelPromise; - return model.repositories.map(repository => new RepositoryImpl(repository)); + return this.model.repositories.map(repository => new RepositoryImpl(repository)); } } -export function createApi(modelPromise: Promise): API { - return new APIImpl(modelPromise); -} \ No newline at end of file +export class NoopAPIImpl implements API { + + async getGitPath(): Promise { + throw new Error('Git model not found'); + } + + async getRepositories(): Promise { + throw new Error('Git model not found'); + } +} diff --git a/extensions/git/src/askpass.ts b/extensions/git/src/askpass.ts index 48b008d7b0..a3263aa67c 100644 --- a/extensions/git/src/askpass.ts +++ b/extensions/git/src/askpass.ts @@ -10,6 +10,7 @@ import { denodeify } from './util'; import * as path from 'path'; import * as http from 'http'; import * as os from 'os'; +import * as fs from 'fs'; import * as crypto from 'crypto'; const randomBytes = denodeify(crypto.randomBytes); @@ -38,6 +39,7 @@ export class Askpass implements Disposable { private server: http.Server; private ipcHandlePathPromise: Promise; + private ipcHandlePath: string | undefined; private enabled = true; constructor() { @@ -52,6 +54,7 @@ export class Askpass implements Disposable { const buffer = await randomBytes(20); const nonce = buffer.toString('hex'); const ipcHandlePath = getIPCHandlePath(nonce); + this.ipcHandlePath = ipcHandlePath; try { this.server.listen(ipcHandlePath); @@ -110,5 +113,9 @@ export class Askpass implements Disposable { dispose(): void { this.server.close(); + + if (this.ipcHandlePath && process.platform !== 'win32') { + fs.unlinkSync(this.ipcHandlePath); + } } } \ No newline at end of file diff --git a/extensions/git/src/commands.ts b/extensions/git/src/commands.ts index 38680404fd..ad1ae453d2 100644 --- a/extensions/git/src/commands.ts +++ b/extensions/git/src/commands.ts @@ -10,7 +10,7 @@ import { Ref, RefType, Git, GitErrorCodes, Branch } from './git'; import { Repository, Resource, Status, CommitOptions, ResourceGroupType } from './repository'; import { Model } from './model'; import { toGitUri, fromGitUri } from './uri'; -import { grep, isDescendant } from './util'; +import { grep, isDescendant, pathEquals } from './util'; import { applyLineChanges, intersectDiffWithRange, toLineRanges, invertLineChange, getModifiedRange } from './staging'; import * as path from 'path'; import { lstat, Stats } from 'fs'; @@ -137,6 +137,22 @@ const ImageMimetypes = [ 'image/bmp' ]; +async function categorizeResourceByResolution(resources: Resource[]): Promise<{ merge: Resource[], resolved: Resource[], unresolved: Resource[] }> { + const selection = resources.filter(s => s instanceof Resource) as Resource[]; + const merge = selection.filter(s => s.resourceGroupType === ResourceGroupType.Merge); + const isBothAddedOrModified = (s: Resource) => s.type === Status.BOTH_MODIFIED || s.type === Status.BOTH_ADDED; + const possibleUnresolved = merge.filter(isBothAddedOrModified); + const promises = possibleUnresolved.map(s => grep(s.resourceUri.fsPath, /^<{7}|^={7}|^>{7}/)); + const unresolvedBothModified = await Promise.all(promises); + const resolved = possibleUnresolved.filter((s, i) => !unresolvedBothModified[i]); + const unresolved = [ + ...merge.filter(s => !isBothAddedOrModified(s)), + ...possibleUnresolved.filter((s, i) => unresolvedBothModified[i]) + ]; + + return { merge, resolved, unresolved }; +} + export class CommandCenter { private disposables: Disposable[]; @@ -236,7 +252,7 @@ export class CommandCenter { gitRef = indexStatus ? '' : 'HEAD'; } - const { size, object } = await repository.lstree(gitRef, uri.fsPath); + const { size, object } = await repository.getObjectDetails(gitRef, uri.fsPath); const { mimetype } = await repository.detectObjectType(object); if (mimetype === 'text/plain') { @@ -485,7 +501,28 @@ export class CommandCenter { } await this.git.init(path); - await this.model.tryOpenRepository(path); + await this.model.openRepository(path); + } + + @command('git.openRepository', { repository: false }) + async openRepository(path?: string): Promise { + if (!path) { + const result = await window.showOpenDialog({ + canSelectFiles: false, + canSelectFolders: true, + canSelectMany: false, + defaultUri: Uri.file(os.homedir()), + openLabel: localize('open repo', "Open Repository") + }); + + if (!result || result.length === 0) { + return; + } + + path = result[0].fsPath; + } + + await this.model.openRepository(path); } @command('git.close', { repository: true }) @@ -612,9 +649,15 @@ export class CommandCenter { @command('git.stage') async stage(...resourceStates: SourceControlResourceState[]): Promise { + this.outputChannel.appendLine(`git.stage ${resourceStates.length}`); + + resourceStates = resourceStates.filter(s => !!s); + if (resourceStates.length === 0 || (resourceStates[0] && !(resourceStates[0].resourceUri instanceof Uri))) { const resource = this.getSCMResource(); + this.outputChannel.appendLine(`git.stage.getSCMResource ${resource ? resource.resourceUri.toString() : null}`); + if (!resource) { return; } @@ -623,20 +666,12 @@ export class CommandCenter { } const selection = resourceStates.filter(s => s instanceof Resource) as Resource[]; - const merge = selection.filter(s => s.resourceGroupType === ResourceGroupType.Merge); - const bothModified = merge.filter(s => s.type === Status.BOTH_MODIFIED); - const promises = bothModified.map(s => grep(s.resourceUri.fsPath, /^<{7}|^={7}|^>{7}/)); - const unresolvedBothModified = await Promise.all(promises); - const resolvedConflicts = bothModified.filter((s, i) => !unresolvedBothModified[i]); - const unresolvedConflicts = [ - ...merge.filter(s => s.type !== Status.BOTH_MODIFIED), - ...bothModified.filter((s, i) => unresolvedBothModified[i]) - ]; + const { resolved, unresolved } = await categorizeResourceByResolution(selection); - if (unresolvedConflicts.length > 0) { - const message = unresolvedConflicts.length > 1 - ? localize('confirm stage files with merge conflicts', "Are you sure you want to stage {0} files with merge conflicts?", unresolvedConflicts.length) - : localize('confirm stage file with merge conflicts', "Are you sure you want to stage {0} with merge conflicts?", path.basename(unresolvedConflicts[0].resourceUri.fsPath)); + if (unresolved.length > 0) { + const message = unresolved.length > 1 + ? localize('confirm stage files with merge conflicts', "Are you sure you want to stage {0} files with merge conflicts?", unresolved.length) + : localize('confirm stage file with merge conflicts', "Are you sure you want to stage {0} with merge conflicts?", path.basename(unresolved[0].resourceUri.fsPath)); const yes = localize('yes', "Yes"); const pick = await window.showWarningMessage(message, { modal: true }, yes); @@ -647,8 +682,9 @@ export class CommandCenter { } const workingTree = selection.filter(s => s.resourceGroupType === ResourceGroupType.WorkingTree); - const scmResources = [...workingTree, ...resolvedConflicts, ...unresolvedConflicts]; + const scmResources = [...workingTree, ...resolved, ...unresolved]; + this.outputChannel.appendLine(`git.stage.scmResources ${scmResources.length}`); if (!scmResources.length) { return; } @@ -660,12 +696,12 @@ export class CommandCenter { @command('git.stageAll', { repository: true }) async stageAll(repository: Repository): Promise { const resources = repository.mergeGroup.resourceStates.filter(s => s instanceof Resource) as Resource[]; - const mergeConflicts = resources.filter(s => s.resourceGroupType === ResourceGroupType.Merge); + const { merge, unresolved } = await categorizeResourceByResolution(resources); - if (mergeConflicts.length > 0) { - const message = mergeConflicts.length > 1 - ? localize('confirm stage files with merge conflicts', "Are you sure you want to stage {0} files with merge conflicts?", mergeConflicts.length) - : localize('confirm stage file with merge conflicts', "Are you sure you want to stage {0} with merge conflicts?", path.basename(mergeConflicts[0].resourceUri.fsPath)); + if (unresolved.length > 0) { + const message = unresolved.length > 1 + ? localize('confirm stage files with merge conflicts', "Are you sure you want to stage {0} files with merge conflicts?", merge.length) + : localize('confirm stage file with merge conflicts', "Are you sure you want to stage {0} with merge conflicts?", path.basename(merge[0].resourceUri.fsPath)); const yes = localize('yes', "Yes"); const pick = await window.showWarningMessage(message, { modal: true }, yes); @@ -768,24 +804,24 @@ export class CommandCenter { const originalUri = toGitUri(modifiedUri, '~'); const originalDocument = await workspace.openTextDocument(originalUri); - const basename = path.basename(modifiedUri.fsPath); - const message = localize('confirm revert', "Are you sure you want to revert the selected changes in {0}?", basename); - const yes = localize('revert', "Revert Changes"); - const pick = await window.showWarningMessage(message, { modal: true }, yes); - - if (pick !== yes) { - return; - } - + const selectionsBeforeRevert = textEditor.selections; + const visibleRangesBeforeRevert = textEditor.visibleRanges; const result = applyLineChanges(originalDocument, modifiedDocument, changes); + const edit = new WorkspaceEdit(); edit.replace(modifiedUri, new Range(new Position(0, 0), modifiedDocument.lineAt(modifiedDocument.lineCount - 1).range.end), result); workspace.applyEdit(edit); + await modifiedDocument.save(); + + textEditor.selections = selectionsBeforeRevert; + textEditor.revealRange(visibleRangesBeforeRevert[0]); } @command('git.unstage') async unstage(...resourceStates: SourceControlResourceState[]): Promise { + resourceStates = resourceStates.filter(s => !!s); + if (resourceStates.length === 0 || (resourceStates[0] && !(resourceStates[0].resourceUri instanceof Uri))) { const resource = this.getSCMResource(); @@ -852,6 +888,8 @@ export class CommandCenter { @command('git.clean') async clean(...resourceStates: SourceControlResourceState[]): Promise { + resourceStates = resourceStates.filter(s => !!s); + if (resourceStates.length === 0 || (resourceStates[0] && !(resourceStates[0].resourceUri instanceof Uri))) { const resource = this.getSCMResource(); @@ -974,7 +1012,7 @@ export class CommandCenter { getCommitMessage: () => Promise, opts?: CommitOptions ): Promise { - const config = workspace.getConfiguration('git'); + const config = workspace.getConfiguration('git', Uri.file(repository.root)); const promptToSaveFilesBeforeCommit = config.get('promptToSaveFilesBeforeCommit') === true; if (promptToSaveFilesBeforeCommit) { @@ -983,8 +1021,8 @@ export class CommandCenter { if (unsavedTextDocuments.length > 0) { const message = unsavedTextDocuments.length === 1 - ? localize('unsaved files single', "The following file is unsaved: {0}.\n\nWould you like to save it before comitting?", path.basename(unsavedTextDocuments[0].uri.fsPath)) - : localize('unsaved files', "There are {0} unsaved files.\n\nWould you like to save them before comitting?", unsavedTextDocuments.length); + ? localize('unsaved files single', "The following file is unsaved: {0}.\n\nWould you like to save it before committing?", path.basename(unsavedTextDocuments[0].uri.fsPath)) + : localize('unsaved files', "There are {0} unsaved files.\n\nWould you like to save them before committing?", unsavedTextDocuments.length); const saveAndCommit = localize('save and commit', "Save All & Commit"); const commit = localize('commit', "Commit Anyway"); const pick = await window.showWarningMessage(message, { modal: true }, saveAndCommit, commit); @@ -1028,6 +1066,10 @@ export class CommandCenter { // enable signing of commits if configurated opts.signCommit = enableCommitSigning; + if (config.get('alwaysSignOff')) { + opts.signoff = true; + } + if ( // no changes (noStagedChanges && noUnstagedChanges) @@ -1130,11 +1172,19 @@ export class CommandCenter { const HEAD = repository.HEAD; if (!HEAD || !HEAD.commit) { + window.showWarningMessage(localize('no more', "Can't undo because HEAD doesn't point to any commit.")); return; } const commit = await repository.getCommit('HEAD'); - await repository.reset('HEAD~'); + + if (commit.parents.length > 0) { + await repository.reset('HEAD~'); + } else { + await repository.deleteRef('HEAD'); + await this.unstageAll(repository); + } + repository.inputBox.value = commit.message; } @@ -1271,16 +1321,7 @@ export class CommandCenter { return; } - try { - await choice.run(repository); - } catch (err) { - if (err.gitErrorCode !== GitErrorCodes.Conflict) { - throw err; - } - - const message = localize('merge conflicts', "There are merge conflicts. Resolve them before committing."); - await window.showWarningMessage(message); - } + await choice.run(repository); } @command('git.createTag', { repository: true }) @@ -1325,7 +1366,7 @@ export class CommandCenter { return; } - const remotePicks = remotes.map(r => ({ label: r.name, description: r.url })); + const remotePicks = remotes.filter(r => r.fetchUrl !== undefined).map(r => ({ label: r.name, description: r.fetchUrl! })); const placeHolder = localize('pick remote pull repo', "Pick a remote to pull the branch from"); const remotePick = await window.showQuickPick(remotePicks, { placeHolder }); @@ -1344,7 +1385,7 @@ export class CommandCenter { const remoteCharCnt = remotePick.label.length; - repository.pullFrom(false, remotePick.label, branchPick.label.slice(remoteCharCnt + 1)); + await repository.pullFrom(false, remotePick.label, branchPick.label.slice(remoteCharCnt + 1)); } @command('git.pull', { repository: true }) @@ -1432,7 +1473,7 @@ export class CommandCenter { } const branchName = repository.HEAD.name; - const picks = remotes.map(r => ({ label: r.name, description: r.url })); + const picks = remotes.filter(r => r.pushUrl !== undefined).map(r => ({ label: r.name, description: r.pushUrl! })); const placeHolder = localize('pick remote', "Pick a remote to publish the branch '{0}' to:", branchName); const pick = await window.showQuickPick(picks, { placeHolder }); @@ -1440,7 +1481,7 @@ export class CommandCenter { return; } - repository.pushTo(pick.label, branchName); + await repository.pushTo(pick.label, branchName); } private async _sync(repository: Repository, rebase: boolean): Promise { @@ -1450,8 +1491,12 @@ export class CommandCenter { return; } + const remoteName = HEAD.remote || HEAD.upstream.remote; + const remote = repository.remotes.find(r => r.name === remoteName); + const isReadonly = remote && remote.isReadOnly; + const config = workspace.getConfiguration('git'); - const shouldPrompt = config.get('confirmSync') === true; + const shouldPrompt = !isReadonly && config.get('confirmSync') === true; if (shouldPrompt) { const message = localize('sync is unpredictable', "This action will push and pull commits to and from '{0}/{1}'.", HEAD.upstream.remote, HEAD.upstream.name); @@ -1522,6 +1567,8 @@ export class CommandCenter { @command('git.ignore') async ignore(...resourceStates: SourceControlResourceState[]): Promise { + resourceStates = resourceStates.filter(s => !!s); + if (resourceStates.length === 0 || (resourceStates[0] && !(resourceStates[0].resourceUri instanceof Uri))) { const resource = this.getSCMResource(); @@ -1647,10 +1694,11 @@ export class CommandCenter { return result.catch(async err => { const options: MessageOptions = { - modal: err.gitErrorCode === GitErrorCodes.DirtyWorkTree + modal: true }; let message: string; + let type: 'error' | 'warning' = 'error'; switch (err.gitErrorCode) { case GitErrorCodes.DirtyWorkTree: @@ -1659,6 +1707,11 @@ export class CommandCenter { case GitErrorCodes.PushRejected: message = localize('cant push', "Can't push refs to remote. Try running 'Pull' first to integrate your changes."); break; + case GitErrorCodes.Conflict: + message = localize('merge conflicts', "There are merge conflicts. Resolve them before committing."); + type = 'warning'; + options.modal = false; + break; default: const hint = (err.stderr || err.message || String(err)) .replace(/^error: /mi, '') @@ -1679,11 +1732,11 @@ export class CommandCenter { return; } - options.modal = true; - const outputChannel = this.outputChannel as OutputChannel; const openOutputChannelChoice = localize('open git log', "Open Git Log"); - const choice = await window.showErrorMessage(message, options, openOutputChannelChoice); + const choice = type === 'error' + ? await window.showErrorMessage(message, options, openOutputChannelChoice) + : await window.showWarningMessage(message, options, openOutputChannelChoice); if (choice === openOutputChannelChoice) { outputChannel.show(); @@ -1698,7 +1751,12 @@ export class CommandCenter { } private getSCMResource(uri?: Uri): Resource | undefined { - uri = uri ? uri : window.activeTextEditor && window.activeTextEditor.document.uri; + uri = uri ? uri : (window.activeTextEditor && window.activeTextEditor.document.uri); + + this.outputChannel.appendLine(`git.getSCMResource.uri ${uri && uri.toString()}`); + for (const r of this.model.repositories.map(r => r.root)) { + this.outputChannel.appendLine(`repo root ${r}`); + } if (!uri) { return undefined; @@ -1737,7 +1795,7 @@ export class CommandCenter { } // Could it be a submodule? - if (resource.fsPath === repository.root) { + if (pathEquals(resource.fsPath, repository.root)) { repository = this.model.getRepositoryForSubmodule(resource) || repository; } diff --git a/extensions/git/src/contentProvider.ts b/extensions/git/src/contentProvider.ts index e75e5418ef..e1d736d888 100644 --- a/extensions/git/src/contentProvider.ts +++ b/extensions/git/src/contentProvider.ts @@ -9,7 +9,7 @@ import { workspace, Uri, Disposable, Event, EventEmitter, window } from 'vscode' import { debounce, throttle } from './decorators'; import { fromGitUri, toGitUri } from './uri'; import { Model, ModelChangeEvent, OriginalResourceChangeEvent } from './model'; -import { filterEvent, eventToPromise, isDescendant } from './util'; +import { filterEvent, eventToPromise, isDescendant, pathEquals } from './util'; interface CacheRow { uri: Uri; @@ -130,7 +130,7 @@ export class GitContentProvider { const { path } = fromGitUri(row.uri); const isOpen = workspace.textDocuments .filter(d => d.uri.scheme === 'file') - .some(d => d.uri.fsPath === path); + .some(d => pathEquals(d.uri.fsPath, path)); if (isOpen || now - row.timestamp < THREE_MINUTES) { cache[row.uri.toString()] = row; diff --git a/extensions/git/src/git.ts b/extensions/git/src/git.ts index 5df804da21..1102b26e2f 100644 --- a/extensions/git/src/git.ts +++ b/extensions/git/src/git.ts @@ -13,7 +13,7 @@ import * as which from 'which'; import { EventEmitter } from 'events'; import iconv = require('iconv-lite'); import * as filetype from 'file-type'; -import { assign, uniqBy, groupBy, denodeify, IDisposable, toDisposable, dispose, mkdirp, readBytes, detectUnicodeEncoding, Encoding, onceEvent } from './util'; +import { assign, groupBy, denodeify, IDisposable, toDisposable, dispose, mkdirp, readBytes, detectUnicodeEncoding, Encoding, onceEvent } from './util'; import { CancellationToken } from 'vscode'; import { detectEncoding } from './encoding'; @@ -33,7 +33,9 @@ export interface IFileStatus { export interface Remote { name: string; - url: string; + fetchUrl?: string; + pushUrl?: string; + isReadOnly: boolean; } export interface Stash { @@ -334,7 +336,8 @@ export const GitErrorCodes = { NoStashFound: 'NoStashFound', LocalChangesOverwritten: 'LocalChangesOverwritten', NoUpstreamBranch: 'NoUpstreamBranch', - IsInSubmodule: 'IsInSubmodule' + IsInSubmodule: 'IsInSubmodule', + WrongCase: 'WrongCase', }; function getGitErrorCode(stderr: string): string | undefined { @@ -342,7 +345,7 @@ function getGitErrorCode(stderr: string): string | undefined { return GitErrorCodes.RepositoryIsLocked; } else if (/Authentication failed/.test(stderr)) { return GitErrorCodes.AuthenticationFailed; - } else if (/Not a git repository/.test(stderr)) { + } else if (/Not a git repository/i.test(stderr)) { return GitErrorCodes.NotAGitRepository; } else if (/bad config file/.test(stderr)) { return GitErrorCodes.BadConfigFile; @@ -499,6 +502,7 @@ export class Git { export interface Commit { hash: string; message: string; + parents: string[]; } export class GitStatusParser { @@ -629,6 +633,47 @@ export function parseGitmodules(raw: string): Submodule[] { return result; } +export function parseGitCommit(raw: string): Commit | null { + const match = /^([0-9a-f]{40})\n(.*)\n([^]*)$/m.exec(raw.trim()); + if (!match) { + return null; + } + + const parents = match[2] ? match[2].split(' ') : []; + return { hash: match[1], message: match[3], parents }; +} + +interface LsTreeElement { + mode: string; + type: string; + object: string; + size: string; + file: string; +} + +export function parseLsTree(raw: string): LsTreeElement[] { + return raw.split('\n') + .filter(l => !!l) + .map(line => /^(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(.*)$/.exec(line)!) + .filter(m => !!m) + .map(([, mode, type, object, size, file]) => ({ mode, type, object, size, file })); +} + +interface LsFilesElement { + mode: string; + object: string; + stage: string; + file: string; +} + +export function parseLsFiles(raw: string): LsFilesElement[] { + return raw.split('\n') + .filter(l => !!l) + .map(line => /^(\S+)\s+(\S+)\s+(\S+)\s+(.*)$/.exec(line)!) + .filter(m => !!m) + .map(([, mode, object, stage, file]) => ({ mode, object, stage, file })); +} + export interface DiffOptions { cached?: boolean; } @@ -697,47 +742,72 @@ export class Repository { return Promise.reject('Can\'t open file from git'); } - const { exitCode, stdout } = await exec(child); + const { exitCode, stdout, stderr } = await exec(child); if (exitCode) { - return Promise.reject(new GitError({ + const err = new GitError({ message: 'Could not show object.', exitCode - })); + }); + + if (/exists on disk, but not in/.test(stderr)) { + err.gitErrorCode = GitErrorCodes.WrongCase; + } + + return Promise.reject(err); } return stdout; } - async lstree(treeish: string, path: string): Promise<{ mode: string, object: string, size: number }> { + async getObjectDetails(treeish: string, path: string): Promise<{ mode: string, object: string, size: number }> { if (!treeish) { // index - const { stdout } = await this.run(['ls-files', '--stage', '--', path]); + const elements = await this.lsfiles(path); - const match = /^(\d+)\s+([0-9a-f]{40})\s+(\d+)/.exec(stdout); - - if (!match) { + if (elements.length === 0) { throw new GitError({ message: 'Error running ls-files' }); } - const [, mode, object] = match; + const { mode, object } = elements[0]; const catFile = await this.run(['cat-file', '-s', object]); const size = parseInt(catFile.stdout); return { mode, object, size }; } - const { stdout } = await this.run(['ls-tree', '-l', treeish, '--', path]); + const elements = await this.lstree(treeish, path); - const match = /^(\d+)\s+(\w+)\s+([0-9a-f]{40})\s+(\d+)/.exec(stdout); - - if (!match) { - throw new GitError({ message: 'Error running ls-tree' }); + if (elements.length === 0) { + throw new GitError({ message: 'Error running ls-files' }); } - const [, mode, , object, size] = match; + const { mode, object, size } = elements[0]; return { mode, object, size: parseInt(size) }; } + async lstree(treeish: string, path: string): Promise { + const { stdout } = await this.run(['ls-tree', '-l', treeish, '--', path]); + return parseLsTree(stdout); + } + + async lsfiles(path: string): Promise { + const { stdout } = await this.run(['ls-files', '--stage', '--', path]); + return parseLsFiles(stdout); + } + + async getGitRelativePath(ref: string, relativePath: string): Promise { + const relativePathLowercase = relativePath.toLowerCase(); + const dirname = path.posix.dirname(relativePath) + '/'; + const elements: { file: string; }[] = ref ? await this.lstree(ref, dirname) : await this.lsfiles(dirname); + const element = elements.filter(file => file.file.toLowerCase() === relativePathLowercase)[0]; + + if (!element) { + throw new GitError({ message: 'Git relative path not found.' }); + } + + return element.file; + } + async detectObjectType(object: string): Promise<{ mimetype: string, encoding?: string }> { const child = await this.stream(['show', object]); const buffer = await readBytes(child.stdout, 4100); @@ -820,7 +890,7 @@ export class Repository { let mode: string; try { - const details = await this.lstree('HEAD', path); + const details = await this.getObjectDetails('HEAD', path); mode = details.mode; } catch (err) { mode = '100644'; @@ -874,27 +944,41 @@ export class Repository { try { await this.run(args, { input: message || '' }); } catch (commitErr) { - if (/not possible because you have unmerged files/.test(commitErr.stderr || '')) { - commitErr.gitErrorCode = GitErrorCodes.UnmergedChanges; - throw commitErr; - } + await this.handleCommitError(commitErr); + } + } - try { - await this.run(['config', '--get-all', 'user.name']); - } catch (err) { - err.gitErrorCode = GitErrorCodes.NoUserNameConfigured; - throw err; - } + async rebaseContinue(): Promise { + const args = ['rebase', '--continue']; - try { - await this.run(['config', '--get-all', 'user.email']); - } catch (err) { - err.gitErrorCode = GitErrorCodes.NoUserEmailConfigured; - throw err; - } + try { + await this.run(args); + } catch (commitErr) { + await this.handleCommitError(commitErr); + } + } + private async handleCommitError(commitErr: any): Promise { + if (/not possible because you have unmerged files/.test(commitErr.stderr || '')) { + commitErr.gitErrorCode = GitErrorCodes.UnmergedChanges; throw commitErr; } + + try { + await this.run(['config', '--get-all', 'user.name']); + } catch (err) { + err.gitErrorCode = GitErrorCodes.NoUserNameConfigured; + throw err; + } + + try { + await this.run(['config', '--get-all', 'user.email']); + } catch (err) { + err.gitErrorCode = GitErrorCodes.NoUserEmailConfigured; + throw err; + } + + throw commitErr; } async branch(name: string, checkout: boolean): Promise { @@ -912,6 +996,11 @@ export class Repository { await this.run(args); } + async deleteRef(ref: string): Promise { + const args = ['update-ref', '-d', ref]; + await this.run(args); + } + async merge(ref: string): Promise { const args = ['merge', ref]; @@ -1226,14 +1315,34 @@ export class Repository { async getRemotes(): Promise { const result = await this.run(['remote', '--verbose']); - const regex = /^([^\s]+)\s+([^\s]+)\s/; - const rawRemotes = result.stdout.trim().split('\n') - .filter(b => !!b) - .map(line => regex.exec(line) as RegExpExecArray) - .filter(g => !!g) - .map((groups: RegExpExecArray) => ({ name: groups[1], url: groups[2] })); + const lines = result.stdout.trim().split('\n').filter(l => !!l); + const remotes: Remote[] = []; - return uniqBy(rawRemotes, remote => remote.name); + for (const line of lines) { + const parts = line.split(/\s/); + const [name, url, type] = parts; + + let remote = remotes.find(r => r.name === name); + + if (!remote) { + remote = { name, isReadOnly: false }; + remotes.push(remote); + } + + if (/fetch/i.test(type)) { + remote.fetchUrl = url; + } else if (/push/i.test(type)) { + remote.pushUrl = url; + } else { + remote.fetchUrl = url; + remote.pushUrl = url; + } + + // https://github.com/Microsoft/vscode/issues/45271 + remote.isReadOnly = remote.pushUrl === undefined || remote.pushUrl === 'no_push'; + } + + return remotes; } async getBranch(name: string): Promise { @@ -1306,14 +1415,8 @@ export class Repository { } async getCommit(ref: string): Promise { - const result = await this.run(['show', '-s', '--format=%H\n%B', ref]); - const match = /^([0-9a-f]{40})\n([^]*)$/m.exec(result.stdout.trim()); - - if (!match) { - return Promise.reject('bad commit format'); - } - - return { hash: match[1], message: match[2] }; + const result = await this.run(['show', '-s', '--format=%H\n%P\n%B', ref]); + return parseGitCommit(result.stdout) || Promise.reject('bad commit format'); } async updateSubmodules(paths: string[]): Promise { diff --git a/extensions/git/src/main.ts b/extensions/git/src/main.ts index d5bae6d498..f7e2dba8e3 100644 --- a/extensions/git/src/main.ts +++ b/extensions/git/src/main.ts @@ -16,15 +16,23 @@ import { GitDecorations } from './decorationProvider'; import { Askpass } from './askpass'; import { toDisposable, filterEvent, eventToPromise } from './util'; import TelemetryReporter from 'vscode-extension-telemetry'; -import { API, createApi } from './api'; +import { API, NoopAPIImpl, APIImpl } from './api'; import { GitProtocolHandler } from './protocolHandler'; -let telemetryReporter: TelemetryReporter; +const deactivateTasks: { (): Promise; }[] = []; -async function init(context: ExtensionContext, outputChannel: OutputChannel, disposables: Disposable[]): Promise { +export async function deactivate(): Promise { + for (const task of deactivateTasks) { + await task(); + } +} + +async function createModel(context: ExtensionContext, outputChannel: OutputChannel, telemetryReporter: TelemetryReporter, disposables: Disposable[]): Promise { const pathHint = workspace.getConfiguration('git').get('path'); const info = await findGit(pathHint, path => outputChannel.appendLine(localize('looking', "Looking for git in: {0}", path))); const askpass = new Askpass(); + disposables.push(askpass); + const env = await askpass.getEnv(); const git = new Git({ gitPath: info.path, version: info.version, env }); const model = new Model(git, context.globalState, outputChannel); @@ -61,13 +69,30 @@ async function init(context: ExtensionContext, outputChannel: OutputChannel, dis return model; } -async function _activate(context: ExtensionContext, disposables: Disposable[]): Promise { +export async function activate(context: ExtensionContext): Promise { + const disposables: Disposable[] = []; + context.subscriptions.push(new Disposable(() => Disposable.from(...disposables).dispose())); + const outputChannel = window.createOutputChannel('Git'); commands.registerCommand('git.showOutput', () => outputChannel.show()); disposables.push(outputChannel); + const { name, version, aiKey } = require(context.asAbsolutePath('./package.json')) as { name: string, version: string, aiKey: string }; + const telemetryReporter = new TelemetryReporter(name, version, aiKey); + deactivateTasks.push(() => telemetryReporter.dispose()); + + const config = workspace.getConfiguration('git', null); + const enabled = config.get('enabled'); + + if (!enabled) { + const onConfigChange = filterEvent(workspace.onDidChangeConfiguration, e => e.affectsConfiguration('git')); + const onEnabled = filterEvent(onConfigChange, () => workspace.getConfiguration('git', null).get('enabled') === true); + await eventToPromise(onEnabled); + } + try { - return await init(context, outputChannel, disposables); + const model = await createModel(context, outputChannel, telemetryReporter, disposables); + return new APIImpl(model); } catch (err) { if (!/Git installation not found/.test(err.message || '')) { throw err; @@ -76,60 +101,30 @@ async function _activate(context: ExtensionContext, disposables: Disposable[]): const config = workspace.getConfiguration('git'); const shouldIgnore = config.get('ignoreMissingGitWarning') === true; - if (shouldIgnore) { - return; + if (!shouldIgnore) { + console.warn(err.message); + outputChannel.appendLine(err.message); + outputChannel.show(); + + const download = localize('downloadgit', "Download Git"); + const neverShowAgain = localize('neverShowAgain', "Don't Show Again"); + const choice = await window.showWarningMessage( + localize('notfound', "Git not found. Install it or configure it using the 'git.path' setting."), + download, + neverShowAgain + ); + + if (choice === download) { + commands.executeCommand('vscode.open', Uri.parse('https://git-scm.com/')); + } else if (choice === neverShowAgain) { + await config.update('ignoreMissingGitWarning', true, true); + } } - console.warn(err.message); - outputChannel.appendLine(err.message); - outputChannel.show(); - - const download = localize('downloadgit', "Download Git"); - const neverShowAgain = localize('neverShowAgain', "Don't Show Again"); - const choice = await window.showWarningMessage( - localize('notfound', "Git not found. Install it or configure it using the 'git.path' setting."), - download, - neverShowAgain - ); - - if (choice === download) { - commands.executeCommand('vscode.open', Uri.parse('https://git-scm.com/')); - } else if (choice === neverShowAgain) { - await config.update('ignoreMissingGitWarning', true, true); - } + return new NoopAPIImpl(); } } -export function activate(context: ExtensionContext): API { - const config = workspace.getConfiguration('git', null); - const enabled = config.get('enabled'); - - const disposables: Disposable[] = []; - context.subscriptions.push(new Disposable(() => Disposable.from(...disposables).dispose())); - - const { name, version, aiKey } = require(context.asAbsolutePath('./package.json')) as { name: string, version: string, aiKey: string }; - telemetryReporter = new TelemetryReporter(name, version, aiKey); - - let activatePromise: Promise; - - if (enabled) { - activatePromise = _activate(context, disposables); - } else { - const onConfigChange = filterEvent(workspace.onDidChangeConfiguration, e => e.affectsConfiguration('git')); - const onEnabled = filterEvent(onConfigChange, () => workspace.getConfiguration('git', null).get('enabled') === true); - - activatePromise = eventToPromise(onEnabled) - .then(() => _activate(context, disposables)); - } - - const modelPromise = activatePromise - .then(model => model || Promise.reject('Git model not found')); - - activatePromise.catch(err => console.error(err)); - - return createApi(modelPromise); -} - async function checkGitVersion(info: IGit): Promise { // {{SQL CARBON EDIT}} @@ -166,7 +161,3 @@ async function checkGitVersion(info: IGit): Promise { // {{SQL CARBON EDIT}} */ } - -export function deactivate(): Promise { - return telemetryReporter ? telemetryReporter.dispose() : Promise.resolve(null); -} diff --git a/extensions/git/src/model.ts b/extensions/git/src/model.ts index 41f75e81b6..d33a140bce 100644 --- a/extensions/git/src/model.ts +++ b/extensions/git/src/model.ts @@ -91,6 +91,13 @@ export class Model { * for git repositories. */ private async scanWorkspaceFolders(): Promise { + const config = workspace.getConfiguration('git'); + const autoRepositoryDetection = config.get('autoRepositoryDetection'); + + if (autoRepositoryDetection !== true && autoRepositoryDetection !== 'subFolders') { + return; + } + for (const folder of workspace.workspaceFolders || []) { const root = folder.uri.fsPath; @@ -99,7 +106,7 @@ export class Model { children .filter(child => child !== '.git') - .forEach(child => this.tryOpenRepository(path.join(root, child))); + .forEach(child => this.openRepository(path.join(root, child))); } catch (err) { // noop } @@ -118,7 +125,7 @@ export class Model { @debounce(500) private eventuallyScanPossibleGitRepositories(): void { for (const path of this.possibleGitRepositoryPaths) { - this.tryOpenRepository(path); + this.openRepository(path); } this.possibleGitRepositoryPaths.clear(); @@ -139,7 +146,7 @@ export class Model { .filter(r => !activeRepositories.has(r!.repository)) .filter(r => !(workspace.workspaceFolders || []).some(f => isDescendant(f.uri.fsPath, r!.repository.root))) as OpenRepository[]; - possibleRepositoryFolders.forEach(p => this.tryOpenRepository(p.uri.fsPath)); + possibleRepositoryFolders.forEach(p => this.openRepository(p.uri.fsPath)); openRepositoriesToDispose.forEach(r => r.dispose()); } @@ -153,15 +160,15 @@ export class Model { .filter(({ root }) => workspace.getConfiguration('git', root).get('enabled') !== true) .map(({ repository }) => repository); - possibleRepositoryFolders.forEach(p => this.tryOpenRepository(p.uri.fsPath)); + possibleRepositoryFolders.forEach(p => this.openRepository(p.uri.fsPath)); openRepositoriesToDispose.forEach(r => r.dispose()); } private onDidChangeVisibleTextEditors(editors: TextEditor[]): void { const config = workspace.getConfiguration('git'); - const enabled = config.get('autoRepositoryDetection') === true; + const autoRepositoryDetection = config.get('autoRepositoryDetection'); - if (!enabled) { + if (autoRepositoryDetection !== true && autoRepositoryDetection !== 'openEditors') { return; } @@ -178,12 +185,12 @@ export class Model { return; } - this.tryOpenRepository(path.dirname(uri.fsPath)); + this.openRepository(path.dirname(uri.fsPath)); }); } @sequentialize - async tryOpenRepository(path: string): Promise { + async openRepository(path: string): Promise { if (this.getRepository(path)) { return; } @@ -207,6 +214,13 @@ export class Model { return; } + const config = workspace.getConfiguration('git'); + const ignoredRepos = new Set(config.get>('ignoredRepositories')); + + if (ignoredRepos.has(rawRoot)) { + return; + } + const repository = new Repository(this.git.open(repositoryRoot), this.globalState); this.open(repository); diff --git a/extensions/git/src/protocolHandler.ts b/extensions/git/src/protocolHandler.ts index 57c70c75e8..42d311ce45 100644 --- a/extensions/git/src/protocolHandler.ts +++ b/extensions/git/src/protocolHandler.ts @@ -5,16 +5,16 @@ 'use strict'; -import { ProtocolHandler, Uri, window, Disposable, commands } from 'vscode'; +import { UriHandler, Uri, window, Disposable, commands } from 'vscode'; import { dispose } from './util'; import * as querystring from 'querystring'; -export class GitProtocolHandler implements ProtocolHandler { +export class GitProtocolHandler implements UriHandler { private disposables: Disposable[] = []; constructor() { - this.disposables.push(window.registerProtocolHandler(this)); + this.disposables.push(window.registerUriHandler(this)); } handleUri(uri: Uri): void { diff --git a/extensions/git/src/repository.ts b/extensions/git/src/repository.ts index cae0335516..1766886392 100644 --- a/extensions/git/src/repository.ts +++ b/extensions/git/src/repository.ts @@ -217,7 +217,8 @@ export class Resource implements SourceControlResourceState { case Status.INDEX_DELETED: case Status.DELETED: return new ThemeColor('gitDecoration.deletedResourceForeground'); - case Status.INDEX_ADDED: // todo@joh - special color? + case Status.INDEX_ADDED: + return new ThemeColor('gitDecoration.addedResourceForeground'); case Status.INDEX_RENAMED: // todo@joh - special color? case Status.UNTRACKED: return new ThemeColor('gitDecoration.untrackedResourceForeground'); @@ -292,13 +293,15 @@ export enum Operation { GetCommitTemplate = 'GetCommitTemplate', DeleteBranch = 'DeleteBranch', RenameBranch = 'RenameBranch', + DeleteRef = 'DeleteRef', Merge = 'Merge', Ignore = 'Ignore', Tag = 'Tag', Stash = 'Stash', CheckIgnore = 'CheckIgnore', - LSTree = 'LSTree', - SubmoduleUpdate = 'SubmoduleUpdate' + GetObjectDetails = 'GetObjectDetails', + SubmoduleUpdate = 'SubmoduleUpdate', + RebaseContinue = 'RebaseContinue', } function isReadOnly(operation: Operation): boolean { @@ -306,7 +309,7 @@ function isReadOnly(operation: Operation): boolean { case Operation.Show: case Operation.GetCommitTemplate: case Operation.CheckIgnore: - case Operation.LSTree: + case Operation.GetObjectDetails: return true; default: return false; @@ -317,7 +320,7 @@ function shouldShowProgress(operation: Operation): boolean { switch (operation) { case Operation.Fetch: case Operation.CheckIgnore: - case Operation.LSTree: + case Operation.GetObjectDetails: case Operation.Show: return false; default: @@ -478,6 +481,22 @@ export class Repository implements Disposable { return this._submodules; } + private _rebaseCommit: Commit | undefined = undefined; + + set rebaseCommit(rebaseCommit: Commit | undefined) { + if (this._rebaseCommit && !rebaseCommit) { + this.inputBox.value = ''; + } else if (rebaseCommit && (!this._rebaseCommit || this._rebaseCommit.hash !== rebaseCommit.hash)) { + this.inputBox.value = rebaseCommit.message; + } + + this._rebaseCommit = rebaseCommit; + } + + get rebaseCommit(): Commit | undefined { + return this._rebaseCommit; + } + private _operations = new OperationsImpl(); get operations(): Operations { return this._operations; } @@ -539,6 +558,16 @@ export class Repository implements Disposable { this.disposables.push(new AutoFetcher(this, globalState)); + // https://github.com/Microsoft/vscode/issues/39039 + const onSuccessfulPush = filterEvent(this.onDidRunOperation, e => e.operation === Operation.Push && !e.error); + onSuccessfulPush(() => { + const gitConfig = workspace.getConfiguration('git'); + + if (gitConfig.get('showPushSuccessNotification')) { + window.showInformationMessage(localize('push success', "Successfully pushed.")); + } + }, null, this.disposables); + const statusBar = new StatusBarCommands(this); this.disposables.push(statusBar); statusBar.onDidChange(() => this._sourceControl.statusBarCommands = statusBar.commands, null, this.disposables); @@ -552,6 +581,15 @@ export class Repository implements Disposable { } validateInput(text: string, position: number): SourceControlInputBoxValidation | undefined { + if (this.rebaseCommit) { + if (this.rebaseCommit.message !== text) { + return { + message: localize('commit in rebase', "It's not possible to change the commit message in the middle of a rebase. Please complete the rebase operation and use interactive rebase instead."), + type: SourceControlInputBoxValidationType.Warning + }; + } + } + const config = workspace.getConfiguration('git'); const setting = config.get<'always' | 'warn' | 'off'>('inputValidation'); @@ -559,6 +597,13 @@ export class Repository implements Disposable { return; } + if (/^\s+$/.test(text)) { + return { + message: localize('commitMessageWhitespacesOnlyWarning', "Current commit message only contains whitespace characters"), + type: SourceControlInputBoxValidationType.Warning + }; + } + let start = 0, end; let match: RegExpExecArray | null; const regex = /\r?\n/g; @@ -628,13 +673,23 @@ export class Repository implements Disposable { } async commit(message: string, opts: CommitOptions = Object.create(null)): Promise { - await this.run(Operation.Commit, async () => { - if (opts.all) { - await this.repository.add([]); - } + if (this.rebaseCommit) { + await this.run(Operation.RebaseContinue, async () => { + if (opts.all) { + await this.repository.add([]); + } - await this.repository.commit(message, opts); - }); + await this.repository.rebaseContinue(); + }); + } else { + await this.run(Operation.Commit, async () => { + if (opts.all) { + await this.repository.add([]); + } + + await this.repository.commit(message, opts); + }); + } } async clean(resources: Uri[]): Promise { @@ -722,6 +777,10 @@ export class Repository implements Disposable { await this.run(Operation.Reset, () => this.repository.reset(treeish, hard)); } + async deleteRef(ref: string): Promise { + await this.run(Operation.DeleteRef, () => this.repository.deleteRef(ref)); + } + @throttle async fetch(): Promise { await this.run(Operation.Fetch, () => this.repository.fetch()); @@ -789,35 +848,50 @@ export class Repository implements Disposable { } private async _sync(head: Branch, rebase: boolean): Promise { - let remote: string | undefined; + let remoteName: string | undefined; let pullBranch: string | undefined; let pushBranch: string | undefined; if (head.name && head.upstream) { - remote = head.upstream.remote; + remoteName = head.upstream.remote; pullBranch = `${head.upstream.name}`; pushBranch = `${head.name}:${head.upstream.name}`; } await this.run(Operation.Sync, async () => { - await this.repository.pull(rebase, remote, pullBranch); + await this.repository.pull(rebase, remoteName, pullBranch); - const shouldPush = this.HEAD && typeof this.HEAD.ahead === 'number' ? this.HEAD.ahead > 0 : true; + const remote = this.remotes.find(r => r.name === remoteName); + + if (remote && remote.isReadOnly) { + return; + } + + const shouldPush = this.HEAD && (typeof this.HEAD.ahead === 'number' ? this.HEAD.ahead > 0 : true); if (shouldPush) { - await this.repository.push(remote, pushBranch); + await this.repository.push(remoteName, pushBranch); } }); } async show(ref: string, filePath: string): Promise { - return this.run(Operation.Show, () => { + return await this.run(Operation.Show, async () => { const relativePath = path.relative(this.repository.root, filePath).replace(/\\/g, '/'); const configFiles = workspace.getConfiguration('files', Uri.file(filePath)); const defaultEncoding = configFiles.get('encoding'); const autoGuessEncoding = configFiles.get('autoGuessEncoding'); - return this.repository.bufferString(`${ref}:${relativePath}`, defaultEncoding, autoGuessEncoding); + try { + return await this.repository.bufferString(`${ref}:${relativePath}`, defaultEncoding, autoGuessEncoding); + } catch (err) { + if (err.gitErrorCode === GitErrorCodes.WrongCase) { + const gitRelativePath = await this.repository.getGitRelativePath(ref, relativePath); + return await this.repository.bufferString(`${ref}:${gitRelativePath}`, defaultEncoding, autoGuessEncoding); + } + + throw err; + } }); } @@ -828,8 +902,8 @@ export class Repository implements Disposable { }); } - lstree(ref: string, filePath: string): Promise<{ mode: string, object: string, size: number }> { - return this.run(Operation.LSTree, () => this.repository.lstree(ref, filePath)); + getObjectDetails(ref: string, filePath: string): Promise<{ mode: string, object: string, size: number }> { + return this.run(Operation.GetObjectDetails, () => this.repository.getObjectDetails(ref, filePath)); } detectObjectType(object: string): Promise<{ mimetype: string, encoding?: string }> { @@ -1011,12 +1085,13 @@ export class Repository implements Disposable { // noop } - const [refs, remotes, submodules] = await Promise.all([this.repository.getRefs(), this.repository.getRemotes(), this.repository.getSubmodules()]); + const [refs, remotes, submodules, rebaseCommit] = await Promise.all([this.repository.getRefs(), this.repository.getRemotes(), this.repository.getSubmodules(), this.getRebaseCommit()]); this._HEAD = HEAD; this._refs = refs; this._remotes = remotes; this._submodules = submodules; + this.rebaseCommit = rebaseCommit; const index: Resource[] = []; const workingTree: Resource[] = []; @@ -1075,6 +1150,17 @@ export class Repository implements Disposable { this._onDidChangeStatus.fire(); } + private async getRebaseCommit(): Promise { + const rebaseHeadPath = path.join(this.repository.root, '.git', 'REBASE_HEAD'); + + try { + const rebaseHead = await new Promise((c, e) => fs.readFile(rebaseHeadPath, 'utf8', (err, result) => err ? e(err) : c(result))); + return await this.getCommit(rebaseHead.trim()); + } catch (err) { + return undefined; + } + } + private onFSChange(uri: Uri): void { const config = workspace.getConfiguration('git'); const autorefresh = config.get('autorefresh'); @@ -1150,6 +1236,13 @@ export class Repository implements Disposable { return ''; } + const remoteName = this.HEAD && this.HEAD.remote || this.HEAD.upstream.remote; + const remote = this.remotes.find(r => r.name === remoteName); + + if (remote && remote.isReadOnly) { + return `${this.HEAD.behind}↓`; + } + return `${this.HEAD.behind}↓ ${this.HEAD.ahead}↑`; } diff --git a/extensions/git/src/statusbar.ts b/extensions/git/src/statusbar.ts index 8041cbd6be..15a26bcc16 100644 --- a/extensions/git/src/statusbar.ts +++ b/extensions/git/src/statusbar.ts @@ -24,7 +24,8 @@ class CheckoutStatusBar { } get command(): Command | undefined { - const title = `$(git-branch) ${this.repository.headLabel}`; + const rebasing = !!this.repository.rebaseCommit; + const title = `$(git-branch) ${this.repository.headLabel}${rebasing ? ` (${localize('rebasing', 'Rebasing')})` : ''}`; return { command: 'git.checkout', @@ -71,10 +72,11 @@ class SyncStatusBar { } private onOperationsChange(): void { - this.state = { - ...this.state, - isSyncRunning: this.repository.operations.isRunning(Operation.Sync) - }; + const isSyncRunning = this.repository.operations.isRunning(Operation.Sync) || + this.repository.operations.isRunning(Operation.Push) || + this.repository.operations.isRunning(Operation.Pull); + + this.state = { ...this.state, isSyncRunning }; } private onModelChange(): void { @@ -173,4 +175,4 @@ export class StatusBarCommands { this.checkoutStatusBar.dispose(); this.disposables = dispose(this.disposables); } -} \ No newline at end of file +} diff --git a/extensions/git/src/test/git.test.ts b/extensions/git/src/test/git.test.ts index 20420eb618..bd2c3f1cf4 100644 --- a/extensions/git/src/test/git.test.ts +++ b/extensions/git/src/test/git.test.ts @@ -6,7 +6,7 @@ 'use strict'; import 'mocha'; -import { GitStatusParser, parseGitmodules } from '../git'; +import { GitStatusParser, parseGitCommit, parseGitmodules, parseLsTree, parseLsFiles } from '../git'; import * as assert from 'assert'; suite('git', () => { @@ -175,4 +175,106 @@ suite('git', () => { ]); }); }); + + suite('parseGitCommit', () => { + test('single parent commit', function () { + const GIT_OUTPUT_SINGLE_PARENT = `52c293a05038d865604c2284aa8698bd087915a1 +8e5a374372b8393906c7e380dbb09349c5385554 +This is a commit message.`; + + assert.deepEqual(parseGitCommit(GIT_OUTPUT_SINGLE_PARENT), { + hash: '52c293a05038d865604c2284aa8698bd087915a1', + message: 'This is a commit message.', + parents: ['8e5a374372b8393906c7e380dbb09349c5385554'] + }); + }); + + test('multiple parent commits', function () { + const GIT_OUTPUT_MULTIPLE_PARENTS = `52c293a05038d865604c2284aa8698bd087915a1 +8e5a374372b8393906c7e380dbb09349c5385554 df27d8c75b129ab9b178b386077da2822101b217 +This is a commit message.`; + + assert.deepEqual(parseGitCommit(GIT_OUTPUT_MULTIPLE_PARENTS), { + hash: '52c293a05038d865604c2284aa8698bd087915a1', + message: 'This is a commit message.', + parents: ['8e5a374372b8393906c7e380dbb09349c5385554', 'df27d8c75b129ab9b178b386077da2822101b217'] + }); + }); + + test('no parent commits', function () { + const GIT_OUTPUT_NO_PARENTS = `52c293a05038d865604c2284aa8698bd087915a1 + +This is a commit message.`; + + assert.deepEqual(parseGitCommit(GIT_OUTPUT_NO_PARENTS), { + hash: '52c293a05038d865604c2284aa8698bd087915a1', + message: 'This is a commit message.', + parents: [] + }); + }); + }); + + suite('parseLsTree', function () { + test('sample', function () { + const input = `040000 tree 0274a81f8ee9ca3669295dc40f510bd2021d0043 - .vscode +100644 blob 1d487c1817262e4f20efbfa1d04c18f51b0046f6 491570 Screen Shot 2018-06-01 at 14.48.05.png +100644 blob 686c16e4f019b734655a2576ce8b98749a9ffdb9 764420 Screen Shot 2018-06-07 at 20.04.59.png +100644 blob 257cc5642cb1a054f08cc83f2d943e56fd3ebe99 4 boom.txt +100644 blob 86dc360dd25f13fa50ffdc8259e9653921f4f2b7 11 boomcaboom.txt +100644 blob a68b14060589b16d7ac75f67b905c918c03c06eb 24 file.js +100644 blob f7bcfb05af46850d780f88c069edcd57481d822d 201 file.md +100644 blob ab8b86114a051f6490f1ec5e3141b9a632fb46b5 8 hello.js +100644 blob 257cc5642cb1a054f08cc83f2d943e56fd3ebe99 4 what.js +100644 blob be859e3f412fa86513cd8bebe8189d1ea1a3e46d 24 what.txt +100644 blob 56ec42c9dc6fcf4534788f0fe34b36e09f37d085 261186 what.txt2`; + + const output = parseLsTree(input); + + assert.deepEqual(output, [ + { mode: '040000', type: 'tree', object: '0274a81f8ee9ca3669295dc40f510bd2021d0043', size: '-', file: '.vscode' }, + { mode: '100644', type: 'blob', object: '1d487c1817262e4f20efbfa1d04c18f51b0046f6', size: '491570', file: 'Screen Shot 2018-06-01 at 14.48.05.png' }, + { mode: '100644', type: 'blob', object: '686c16e4f019b734655a2576ce8b98749a9ffdb9', size: '764420', file: 'Screen Shot 2018-06-07 at 20.04.59.png' }, + { mode: '100644', type: 'blob', object: '257cc5642cb1a054f08cc83f2d943e56fd3ebe99', size: '4', file: 'boom.txt' }, + { mode: '100644', type: 'blob', object: '86dc360dd25f13fa50ffdc8259e9653921f4f2b7', size: '11', file: 'boomcaboom.txt' }, + { mode: '100644', type: 'blob', object: 'a68b14060589b16d7ac75f67b905c918c03c06eb', size: '24', file: 'file.js' }, + { mode: '100644', type: 'blob', object: 'f7bcfb05af46850d780f88c069edcd57481d822d', size: '201', file: 'file.md' }, + { mode: '100644', type: 'blob', object: 'ab8b86114a051f6490f1ec5e3141b9a632fb46b5', size: '8', file: 'hello.js' }, + { mode: '100644', type: 'blob', object: '257cc5642cb1a054f08cc83f2d943e56fd3ebe99', size: '4', file: 'what.js' }, + { mode: '100644', type: 'blob', object: 'be859e3f412fa86513cd8bebe8189d1ea1a3e46d', size: '24', file: 'what.txt' }, + { mode: '100644', type: 'blob', object: '56ec42c9dc6fcf4534788f0fe34b36e09f37d085', size: '261186', file: 'what.txt2' } + ]); + }); + }); + + suite('parseLsFiles', function () { + test('sample', function () { + const input = `100644 7a73a41bfdf76d6f793007240d80983a52f15f97 0 .vscode/settings.json +100644 1d487c1817262e4f20efbfa1d04c18f51b0046f6 0 Screen Shot 2018-06-01 at 14.48.05.png +100644 686c16e4f019b734655a2576ce8b98749a9ffdb9 0 Screen Shot 2018-06-07 at 20.04.59.png +100644 257cc5642cb1a054f08cc83f2d943e56fd3ebe99 0 boom.txt +100644 86dc360dd25f13fa50ffdc8259e9653921f4f2b7 0 boomcaboom.txt +100644 a68b14060589b16d7ac75f67b905c918c03c06eb 0 file.js +100644 f7bcfb05af46850d780f88c069edcd57481d822d 0 file.md +100644 ab8b86114a051f6490f1ec5e3141b9a632fb46b5 0 hello.js +100644 257cc5642cb1a054f08cc83f2d943e56fd3ebe99 0 what.js +100644 be859e3f412fa86513cd8bebe8189d1ea1a3e46d 0 what.txt +100644 56ec42c9dc6fcf4534788f0fe34b36e09f37d085 0 what.txt2`; + + const output = parseLsFiles(input); + + assert.deepEqual(output, [ + { mode: '100644', object: '7a73a41bfdf76d6f793007240d80983a52f15f97', stage: '0', file: '.vscode/settings.json' }, + { mode: '100644', object: '1d487c1817262e4f20efbfa1d04c18f51b0046f6', stage: '0', file: 'Screen Shot 2018-06-01 at 14.48.05.png' }, + { mode: '100644', object: '686c16e4f019b734655a2576ce8b98749a9ffdb9', stage: '0', file: 'Screen Shot 2018-06-07 at 20.04.59.png' }, + { mode: '100644', object: '257cc5642cb1a054f08cc83f2d943e56fd3ebe99', stage: '0', file: 'boom.txt' }, + { mode: '100644', object: '86dc360dd25f13fa50ffdc8259e9653921f4f2b7', stage: '0', file: 'boomcaboom.txt' }, + { mode: '100644', object: 'a68b14060589b16d7ac75f67b905c918c03c06eb', stage: '0', file: 'file.js' }, + { mode: '100644', object: 'f7bcfb05af46850d780f88c069edcd57481d822d', stage: '0', file: 'file.md' }, + { mode: '100644', object: 'ab8b86114a051f6490f1ec5e3141b9a632fb46b5', stage: '0', file: 'hello.js' }, + { mode: '100644', object: '257cc5642cb1a054f08cc83f2d943e56fd3ebe99', stage: '0', file: 'what.js' }, + { mode: '100644', object: 'be859e3f412fa86513cd8bebe8189d1ea1a3e46d', stage: '0', file: 'what.txt' }, + { mode: '100644', object: '56ec42c9dc6fcf4534788f0fe34b36e09f37d085', stage: '0', file: 'what.txt2' }, + ]); + }); + }); }); \ No newline at end of file diff --git a/extensions/git/src/util.ts b/extensions/git/src/util.ts index b00642d693..b1c052be68 100644 --- a/extensions/git/src/util.ts +++ b/extensions/git/src/util.ts @@ -324,3 +324,13 @@ export function isDescendant(parent: string, descendant: string): boolean { return descendant.startsWith(parent); } + +export function pathEquals(a: string, b: string): boolean { + // Windows is case insensitive + if (isWindowsPath(a)) { + a = a.toLowerCase(); + b = b.toLowerCase(); + } + + return a === b; +} \ No newline at end of file diff --git a/extensions/git/syntaxes/git-rebase.tmLanguage.json b/extensions/git/syntaxes/git-rebase.tmLanguage.json index 3ee481bede..a2c116bd09 100644 --- a/extensions/git/syntaxes/git-rebase.tmLanguage.json +++ b/extensions/git/syntaxes/git-rebase.tmLanguage.json @@ -4,7 +4,7 @@ "If you want to provide a fix or improvement, please create a pull request against the original repository.", "Once accepted there, we are happy to receive an update request." ], - "version": "https://github.com/textmate/git.tmbundle/commit/d1db42c2d71948662098183a6df519fb53a7a15b", + "version": "https://github.com/textmate/git.tmbundle/commit/3f6ad2138200db14b57a090ecb2d2e733275ca3e", "name": "Git Rebase Message", "scopeName": "text.git-rebase", "patterns": [ @@ -29,7 +29,23 @@ "name": "meta.commit-message.git-rebase" } }, - "match": "^\\s*(pick|p|reword|r|edit|e|squash|s|fixup|f|exec|x|drop|d)\\s+([0-9a-f]+)\\s+(.*)$", + "match": "^\\s*(pick|p|reword|r|edit|e|squash|s|fixup|f|drop|d)\\s+([0-9a-f]+)\\s+(.*)$", + "name": "meta.commit-command.git-rebase" + }, + { + "captures": { + "1": { + "name": "support.function.git-rebase" + }, + "2": { + "patterns": [ + { + "include": "source.shell" + } + ] + } + }, + "match": "^\\s*(exec|x)\\s+(.*)$", "name": "meta.commit-command.git-rebase" } ] diff --git a/extensions/git/syntaxes/ignore.tmLanguage.json b/extensions/git/syntaxes/ignore.tmLanguage.json new file mode 100644 index 0000000000..7df8865537 --- /dev/null +++ b/extensions/git/syntaxes/ignore.tmLanguage.json @@ -0,0 +1,10 @@ +{ + "name": "Ignore", + "scopeName": "source.ignore", + "patterns": [ + { + "match": "^#.*", + "name": "comment.line.number-sign.ignore" + } + ] +} diff --git a/extensions/git/test/colorize-results/COMMIT_EDITMSG.json b/extensions/git/test/colorize-results/COMMIT_EDITMSG.json index b5457404c8..8b8c3318e7 100644 --- a/extensions/git/test/colorize-results/COMMIT_EDITMSG.json +++ b/extensions/git/test/colorize-results/COMMIT_EDITMSG.json @@ -3,10 +3,10 @@ "c": "This is the summary line. It can't be too long.", "t": "text.git-commit meta.scope.message.git-commit meta.scope.subject.git-commit", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -14,10 +14,10 @@ "c": "After I can write a much more detailed description without quite the same restrictions on length.", "t": "text.git-commit meta.scope.message.git-commit", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -25,10 +25,10 @@ "c": "#", "t": "text.git-commit meta.scope.metadata.git-commit comment.line.number-sign.git-commit punctuation.definition.comment.git-commit", "r": { - "dark_plus": "comment: #608B4E", - "light_plus": "comment: #008000", - "dark_vs": "comment: #608B4E", - "light_vs": "comment: #008000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "comment: #7CA668" } }, @@ -36,10 +36,10 @@ "c": " Please enter the commit message for your changes. Lines starting", "t": "text.git-commit meta.scope.metadata.git-commit comment.line.number-sign.git-commit", "r": { - "dark_plus": "comment: #608B4E", - "light_plus": "comment: #008000", - "dark_vs": "comment: #608B4E", - "light_vs": "comment: #008000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "comment: #7CA668" } }, @@ -47,10 +47,10 @@ "c": "#", "t": "text.git-commit meta.scope.metadata.git-commit comment.line.number-sign.git-commit punctuation.definition.comment.git-commit", "r": { - "dark_plus": "comment: #608B4E", - "light_plus": "comment: #008000", - "dark_vs": "comment: #608B4E", - "light_vs": "comment: #008000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "comment: #7CA668" } }, @@ -58,10 +58,10 @@ "c": " with '#' will be ignored, and an empty message aborts the commit.", "t": "text.git-commit meta.scope.metadata.git-commit comment.line.number-sign.git-commit", "r": { - "dark_plus": "comment: #608B4E", - "light_plus": "comment: #008000", - "dark_vs": "comment: #608B4E", - "light_vs": "comment: #008000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "comment: #7CA668" } }, @@ -69,10 +69,10 @@ "c": "#", "t": "text.git-commit meta.scope.metadata.git-commit comment.line.number-sign.git-commit punctuation.definition.comment.git-commit", "r": { - "dark_plus": "comment: #608B4E", - "light_plus": "comment: #008000", - "dark_vs": "comment: #608B4E", - "light_vs": "comment: #008000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "comment: #7CA668" } }, @@ -80,10 +80,10 @@ "c": " On branch master", "t": "text.git-commit meta.scope.metadata.git-commit comment.line.number-sign.git-commit", "r": { - "dark_plus": "comment: #608B4E", - "light_plus": "comment: #008000", - "dark_vs": "comment: #608B4E", - "light_vs": "comment: #008000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "comment: #7CA668" } }, @@ -91,10 +91,10 @@ "c": "#", "t": "text.git-commit meta.scope.metadata.git-commit comment.line.number-sign.git-commit punctuation.definition.comment.git-commit", "r": { - "dark_plus": "comment: #608B4E", - "light_plus": "comment: #008000", - "dark_vs": "comment: #608B4E", - "light_vs": "comment: #008000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "comment: #7CA668" } }, @@ -102,10 +102,10 @@ "c": " Your branch is up-to-date with 'origin/master'.", "t": "text.git-commit meta.scope.metadata.git-commit comment.line.number-sign.git-commit", "r": { - "dark_plus": "comment: #608B4E", - "light_plus": "comment: #008000", - "dark_vs": "comment: #608B4E", - "light_vs": "comment: #008000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "comment: #7CA668" } }, @@ -113,10 +113,10 @@ "c": "#", "t": "text.git-commit meta.scope.metadata.git-commit comment.line.number-sign.git-commit punctuation.definition.comment.git-commit", "r": { - "dark_plus": "comment: #608B4E", - "light_plus": "comment: #008000", - "dark_vs": "comment: #608B4E", - "light_vs": "comment: #008000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "comment: #7CA668" } }, @@ -124,10 +124,10 @@ "c": "#", "t": "text.git-commit meta.scope.metadata.git-commit comment.line.number-sign.git-commit punctuation.definition.comment.git-commit", "r": { - "dark_plus": "comment: #608B4E", - "light_plus": "comment: #008000", - "dark_vs": "comment: #608B4E", - "light_vs": "comment: #008000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "comment: #7CA668" } }, @@ -135,10 +135,10 @@ "c": " Changes to be committed:", "t": "text.git-commit meta.scope.metadata.git-commit comment.line.number-sign.git-commit", "r": { - "dark_plus": "comment: #608B4E", - "light_plus": "comment: #008000", - "dark_vs": "comment: #608B4E", - "light_vs": "comment: #008000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "comment: #7CA668" } }, @@ -146,10 +146,10 @@ "c": "#", "t": "text.git-commit meta.scope.metadata.git-commit comment.line.number-sign.git-commit punctuation.definition.comment.git-commit", "r": { - "dark_plus": "comment: #608B4E", - "light_plus": "comment: #008000", - "dark_vs": "comment: #608B4E", - "light_vs": "comment: #008000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "comment: #7CA668" } }, @@ -157,10 +157,10 @@ "c": "\t", "t": "text.git-commit meta.scope.metadata.git-commit comment.line.number-sign.git-commit", "r": { - "dark_plus": "comment: #608B4E", - "light_plus": "comment: #008000", - "dark_vs": "comment: #608B4E", - "light_vs": "comment: #008000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "comment: #7CA668" } }, @@ -168,10 +168,10 @@ "c": "deleted: README.md", "t": "text.git-commit meta.scope.metadata.git-commit comment.line.number-sign.git-commit markup.deleted.git-commit", "r": { - "dark_plus": "markup.deleted: #CE9178", - "light_plus": "markup.deleted: #A31515", - "dark_vs": "markup.deleted: #CE9178", - "light_vs": "markup.deleted: #A31515", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "markup.deleted: #CE9178" } }, @@ -179,10 +179,10 @@ "c": "#", "t": "text.git-commit meta.scope.metadata.git-commit comment.line.number-sign.git-commit punctuation.definition.comment.git-commit", "r": { - "dark_plus": "comment: #608B4E", - "light_plus": "comment: #008000", - "dark_vs": "comment: #608B4E", - "light_vs": "comment: #008000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "comment: #7CA668" } }, @@ -190,10 +190,10 @@ "c": "\t", "t": "text.git-commit meta.scope.metadata.git-commit comment.line.number-sign.git-commit", "r": { - "dark_plus": "comment: #608B4E", - "light_plus": "comment: #008000", - "dark_vs": "comment: #608B4E", - "light_vs": "comment: #008000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "comment: #7CA668" } }, @@ -201,10 +201,10 @@ "c": "modified: index.less", "t": "text.git-commit meta.scope.metadata.git-commit comment.line.number-sign.git-commit markup.changed.git-commit", "r": { - "dark_plus": "markup.changed: #569CD6", - "light_plus": "markup.changed: #0451A5", - "dark_vs": "markup.changed: #569CD6", - "light_vs": "markup.changed: #0451A5", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "markup.changed: #569CD6" } }, @@ -212,10 +212,10 @@ "c": "#", "t": "text.git-commit meta.scope.metadata.git-commit comment.line.number-sign.git-commit punctuation.definition.comment.git-commit", "r": { - "dark_plus": "comment: #608B4E", - "light_plus": "comment: #008000", - "dark_vs": "comment: #608B4E", - "light_vs": "comment: #008000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "comment: #7CA668" } }, @@ -223,10 +223,10 @@ "c": "\t", "t": "text.git-commit meta.scope.metadata.git-commit comment.line.number-sign.git-commit", "r": { - "dark_plus": "comment: #608B4E", - "light_plus": "comment: #008000", - "dark_vs": "comment: #608B4E", - "light_vs": "comment: #008000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "comment: #7CA668" } }, @@ -234,10 +234,10 @@ "c": "new file: spec/COMMIT_EDITMSG", "t": "text.git-commit meta.scope.metadata.git-commit comment.line.number-sign.git-commit markup.inserted.git-commit", "r": { - "dark_plus": "markup.inserted: #B5CEA8", - "light_plus": "markup.inserted: #09885A", - "dark_vs": "markup.inserted: #B5CEA8", - "light_vs": "markup.inserted: #09885A", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "markup.inserted: #B5CEA8" } }, @@ -245,10 +245,10 @@ "c": "#", "t": "text.git-commit meta.scope.metadata.git-commit comment.line.number-sign.git-commit punctuation.definition.comment.git-commit", "r": { - "dark_plus": "comment: #608B4E", - "light_plus": "comment: #008000", - "dark_vs": "comment: #608B4E", - "light_vs": "comment: #008000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "comment: #7CA668" } } diff --git a/extensions/git/test/colorize-results/example_diff.json b/extensions/git/test/colorize-results/example_diff.json index 07ec9f737b..e061fcbdd3 100644 --- a/extensions/git/test/colorize-results/example_diff.json +++ b/extensions/git/test/colorize-results/example_diff.json @@ -3,10 +3,10 @@ "c": "diff --git a/helloworld.txt b/helloworld.txt", "t": "source.diff meta.diff.header.git", "r": { - "dark_plus": "meta.diff.header: #569CD6", - "light_plus": "meta.diff.header: #000080", - "dark_vs": "meta.diff.header: #569CD6", - "light_vs": "meta.diff.header: #000080", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "meta.diff.header: #000080" } }, @@ -14,10 +14,10 @@ "c": "index e4f37c4..557db03 100644", "t": "source.diff meta.diff.index.git", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -25,10 +25,10 @@ "c": "---", "t": "source.diff meta.diff.header.from-file punctuation.definition.from-file.diff", "r": { - "dark_plus": "meta.diff.header: #569CD6", - "light_plus": "meta.diff.header: #000080", - "dark_vs": "meta.diff.header: #569CD6", - "light_vs": "meta.diff.header: #000080", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "meta.diff.header: #000080" } }, @@ -36,10 +36,10 @@ "c": " a/helloworld.txt", "t": "source.diff meta.diff.header.from-file", "r": { - "dark_plus": "meta.diff.header: #569CD6", - "light_plus": "meta.diff.header: #000080", - "dark_vs": "meta.diff.header: #569CD6", - "light_vs": "meta.diff.header: #000080", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "meta.diff.header: #000080" } }, @@ -47,10 +47,10 @@ "c": "+++", "t": "source.diff meta.diff.header.to-file punctuation.definition.to-file.diff", "r": { - "dark_plus": "meta.diff.header: #569CD6", - "light_plus": "meta.diff.header: #000080", - "dark_vs": "meta.diff.header: #569CD6", - "light_vs": "meta.diff.header: #000080", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "meta.diff.header: #000080" } }, @@ -58,10 +58,10 @@ "c": " b/helloworld.txt", "t": "source.diff meta.diff.header.to-file", "r": { - "dark_plus": "meta.diff.header: #569CD6", - "light_plus": "meta.diff.header: #000080", - "dark_vs": "meta.diff.header: #569CD6", - "light_vs": "meta.diff.header: #000080", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "meta.diff.header: #000080" } }, @@ -69,10 +69,10 @@ "c": "@@", "t": "source.diff meta.diff.range.unified punctuation.definition.range.diff", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -80,10 +80,10 @@ "c": " ", "t": "source.diff meta.diff.range.unified", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -91,10 +91,10 @@ "c": "-1 +1", "t": "source.diff meta.diff.range.unified meta.toc-list.line-number.diff", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -102,10 +102,10 @@ "c": " ", "t": "source.diff meta.diff.range.unified", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -113,10 +113,10 @@ "c": "@@", "t": "source.diff meta.diff.range.unified punctuation.definition.range.diff", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -124,10 +124,10 @@ "c": "-", "t": "source.diff markup.deleted.diff punctuation.definition.deleted.diff", "r": { - "dark_plus": "markup.deleted: #CE9178", - "light_plus": "markup.deleted: #A31515", - "dark_vs": "markup.deleted: #CE9178", - "light_vs": "markup.deleted: #A31515", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "markup.deleted: #CE9178" } }, @@ -135,10 +135,10 @@ "c": "Hello world", "t": "source.diff markup.deleted.diff", "r": { - "dark_plus": "markup.deleted: #CE9178", - "light_plus": "markup.deleted: #A31515", - "dark_vs": "markup.deleted: #CE9178", - "light_vs": "markup.deleted: #A31515", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "markup.deleted: #CE9178" } }, @@ -146,10 +146,10 @@ "c": "+", "t": "source.diff markup.inserted.diff punctuation.definition.inserted.diff", "r": { - "dark_plus": "markup.inserted: #B5CEA8", - "light_plus": "markup.inserted: #09885A", - "dark_vs": "markup.inserted: #B5CEA8", - "light_vs": "markup.inserted: #09885A", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "markup.inserted: #B5CEA8" } }, @@ -157,10 +157,10 @@ "c": "Hello World", "t": "source.diff markup.inserted.diff", "r": { - "dark_plus": "markup.inserted: #B5CEA8", - "light_plus": "markup.inserted: #09885A", - "dark_vs": "markup.inserted: #B5CEA8", - "light_vs": "markup.inserted: #09885A", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "markup.inserted: #B5CEA8" } } diff --git a/extensions/git/test/colorize-results/git-rebase-todo.json b/extensions/git/test/colorize-results/git-rebase-todo.json index 87781fdbe0..e0497296ac 100644 --- a/extensions/git/test/colorize-results/git-rebase-todo.json +++ b/extensions/git/test/colorize-results/git-rebase-todo.json @@ -3,10 +3,10 @@ "c": "pick", "t": "text.git-rebase meta.commit-command.git-rebase support.function.git-rebase", "r": { - "dark_plus": "support.function.git-rebase: #9CDCFE", - "light_plus": "support.function.git-rebase: #0451A5", - "dark_vs": "support.function.git-rebase: #9CDCFE", - "light_vs": "support.function.git-rebase: #0451A5", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "support.function.git-rebase: #D4D4D4" } }, @@ -14,10 +14,10 @@ "c": " ", "t": "text.git-rebase meta.commit-command.git-rebase", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -25,10 +25,10 @@ "c": "1fc6c95", "t": "text.git-rebase meta.commit-command.git-rebase constant.sha.git-rebase", "r": { - "dark_plus": "constant.sha.git-rebase: #B5CEA8", - "light_plus": "constant.sha.git-rebase: #09885A", - "dark_vs": "constant.sha.git-rebase: #B5CEA8", - "light_vs": "constant.sha.git-rebase: #09885A", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "constant.sha.git-rebase: #B5CEA8" } }, @@ -36,10 +36,10 @@ "c": " ", "t": "text.git-rebase meta.commit-command.git-rebase", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -47,10 +47,10 @@ "c": "Patch A", "t": "text.git-rebase meta.commit-command.git-rebase meta.commit-message.git-rebase", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -58,10 +58,10 @@ "c": "squash", "t": "text.git-rebase meta.commit-command.git-rebase support.function.git-rebase", "r": { - "dark_plus": "support.function.git-rebase: #9CDCFE", - "light_plus": "support.function.git-rebase: #0451A5", - "dark_vs": "support.function.git-rebase: #9CDCFE", - "light_vs": "support.function.git-rebase: #0451A5", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "support.function.git-rebase: #D4D4D4" } }, @@ -69,10 +69,10 @@ "c": " ", "t": "text.git-rebase meta.commit-command.git-rebase", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -80,10 +80,10 @@ "c": "fa39187", "t": "text.git-rebase meta.commit-command.git-rebase constant.sha.git-rebase", "r": { - "dark_plus": "constant.sha.git-rebase: #B5CEA8", - "light_plus": "constant.sha.git-rebase: #09885A", - "dark_vs": "constant.sha.git-rebase: #B5CEA8", - "light_vs": "constant.sha.git-rebase: #09885A", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "constant.sha.git-rebase: #B5CEA8" } }, @@ -91,10 +91,10 @@ "c": " ", "t": "text.git-rebase meta.commit-command.git-rebase", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -102,10 +102,10 @@ "c": "Something to add to patch A", "t": "text.git-rebase meta.commit-command.git-rebase meta.commit-message.git-rebase", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -113,10 +113,10 @@ "c": "pick", "t": "text.git-rebase meta.commit-command.git-rebase support.function.git-rebase", "r": { - "dark_plus": "support.function.git-rebase: #9CDCFE", - "light_plus": "support.function.git-rebase: #0451A5", - "dark_vs": "support.function.git-rebase: #9CDCFE", - "light_vs": "support.function.git-rebase: #0451A5", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "support.function.git-rebase: #D4D4D4" } }, @@ -124,10 +124,10 @@ "c": " ", "t": "text.git-rebase meta.commit-command.git-rebase", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -135,10 +135,10 @@ "c": "7b36971", "t": "text.git-rebase meta.commit-command.git-rebase constant.sha.git-rebase", "r": { - "dark_plus": "constant.sha.git-rebase: #B5CEA8", - "light_plus": "constant.sha.git-rebase: #09885A", - "dark_vs": "constant.sha.git-rebase: #B5CEA8", - "light_vs": "constant.sha.git-rebase: #09885A", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "constant.sha.git-rebase: #B5CEA8" } }, @@ -146,10 +146,10 @@ "c": " ", "t": "text.git-rebase meta.commit-command.git-rebase", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -157,10 +157,10 @@ "c": "Something to move before patch B", "t": "text.git-rebase meta.commit-command.git-rebase meta.commit-message.git-rebase", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -168,10 +168,10 @@ "c": "pick", "t": "text.git-rebase meta.commit-command.git-rebase support.function.git-rebase", "r": { - "dark_plus": "support.function.git-rebase: #9CDCFE", - "light_plus": "support.function.git-rebase: #0451A5", - "dark_vs": "support.function.git-rebase: #9CDCFE", - "light_vs": "support.function.git-rebase: #0451A5", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "support.function.git-rebase: #D4D4D4" } }, @@ -179,10 +179,10 @@ "c": " ", "t": "text.git-rebase meta.commit-command.git-rebase", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -190,10 +190,10 @@ "c": "6b2481b", "t": "text.git-rebase meta.commit-command.git-rebase constant.sha.git-rebase", "r": { - "dark_plus": "constant.sha.git-rebase: #B5CEA8", - "light_plus": "constant.sha.git-rebase: #09885A", - "dark_vs": "constant.sha.git-rebase: #B5CEA8", - "light_vs": "constant.sha.git-rebase: #09885A", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "constant.sha.git-rebase: #B5CEA8" } }, @@ -201,10 +201,10 @@ "c": " ", "t": "text.git-rebase meta.commit-command.git-rebase", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -212,10 +212,10 @@ "c": "Patch B", "t": "text.git-rebase meta.commit-command.git-rebase meta.commit-message.git-rebase", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -223,10 +223,10 @@ "c": "fixup", "t": "text.git-rebase meta.commit-command.git-rebase support.function.git-rebase", "r": { - "dark_plus": "support.function.git-rebase: #9CDCFE", - "light_plus": "support.function.git-rebase: #0451A5", - "dark_vs": "support.function.git-rebase: #9CDCFE", - "light_vs": "support.function.git-rebase: #0451A5", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "support.function.git-rebase: #D4D4D4" } }, @@ -234,10 +234,10 @@ "c": " ", "t": "text.git-rebase meta.commit-command.git-rebase", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -245,10 +245,10 @@ "c": "c619268", "t": "text.git-rebase meta.commit-command.git-rebase constant.sha.git-rebase", "r": { - "dark_plus": "constant.sha.git-rebase: #B5CEA8", - "light_plus": "constant.sha.git-rebase: #09885A", - "dark_vs": "constant.sha.git-rebase: #B5CEA8", - "light_vs": "constant.sha.git-rebase: #09885A", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "constant.sha.git-rebase: #B5CEA8" } }, @@ -256,10 +256,10 @@ "c": " ", "t": "text.git-rebase meta.commit-command.git-rebase", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -267,10 +267,10 @@ "c": "A fix for Patch B", "t": "text.git-rebase meta.commit-command.git-rebase meta.commit-message.git-rebase", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -278,10 +278,10 @@ "c": "edit", "t": "text.git-rebase meta.commit-command.git-rebase support.function.git-rebase", "r": { - "dark_plus": "support.function.git-rebase: #9CDCFE", - "light_plus": "support.function.git-rebase: #0451A5", - "dark_vs": "support.function.git-rebase: #9CDCFE", - "light_vs": "support.function.git-rebase: #0451A5", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "support.function.git-rebase: #D4D4D4" } }, @@ -289,10 +289,10 @@ "c": " ", "t": "text.git-rebase meta.commit-command.git-rebase", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -300,10 +300,10 @@ "c": "dd1475d", "t": "text.git-rebase meta.commit-command.git-rebase constant.sha.git-rebase", "r": { - "dark_plus": "constant.sha.git-rebase: #B5CEA8", - "light_plus": "constant.sha.git-rebase: #09885A", - "dark_vs": "constant.sha.git-rebase: #B5CEA8", - "light_vs": "constant.sha.git-rebase: #09885A", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "constant.sha.git-rebase: #B5CEA8" } }, @@ -311,10 +311,10 @@ "c": " ", "t": "text.git-rebase meta.commit-command.git-rebase", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -322,10 +322,10 @@ "c": "Something I want to split", "t": "text.git-rebase meta.commit-command.git-rebase meta.commit-message.git-rebase", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -333,10 +333,10 @@ "c": "reword", "t": "text.git-rebase meta.commit-command.git-rebase support.function.git-rebase", "r": { - "dark_plus": "support.function.git-rebase: #9CDCFE", - "light_plus": "support.function.git-rebase: #0451A5", - "dark_vs": "support.function.git-rebase: #9CDCFE", - "light_vs": "support.function.git-rebase: #0451A5", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "support.function.git-rebase: #D4D4D4" } }, @@ -344,10 +344,10 @@ "c": " ", "t": "text.git-rebase meta.commit-command.git-rebase", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -355,10 +355,10 @@ "c": "4ca2acc", "t": "text.git-rebase meta.commit-command.git-rebase constant.sha.git-rebase", "r": { - "dark_plus": "constant.sha.git-rebase: #B5CEA8", - "light_plus": "constant.sha.git-rebase: #09885A", - "dark_vs": "constant.sha.git-rebase: #B5CEA8", - "light_vs": "constant.sha.git-rebase: #09885A", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "constant.sha.git-rebase: #B5CEA8" } }, @@ -366,10 +366,10 @@ "c": " ", "t": "text.git-rebase meta.commit-command.git-rebase", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -377,10 +377,10 @@ "c": "i cant' typ goods", "t": "text.git-rebase meta.commit-command.git-rebase meta.commit-message.git-rebase", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -388,10 +388,10 @@ "c": "#", "t": "text.git-rebase comment.line.number-sign.git-rebase punctuation.definition.comment.git-rebase", "r": { - "dark_plus": "comment: #608B4E", - "light_plus": "comment: #008000", - "dark_vs": "comment: #608B4E", - "light_vs": "comment: #008000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "comment: #7CA668" } }, @@ -399,10 +399,10 @@ "c": " Commands:", "t": "text.git-rebase comment.line.number-sign.git-rebase", "r": { - "dark_plus": "comment: #608B4E", - "light_plus": "comment: #008000", - "dark_vs": "comment: #608B4E", - "light_vs": "comment: #008000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "comment: #7CA668" } }, @@ -410,10 +410,10 @@ "c": "#", "t": "text.git-rebase comment.line.number-sign.git-rebase punctuation.definition.comment.git-rebase", "r": { - "dark_plus": "comment: #608B4E", - "light_plus": "comment: #008000", - "dark_vs": "comment: #608B4E", - "light_vs": "comment: #008000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "comment: #7CA668" } }, @@ -421,10 +421,10 @@ "c": " p, pick = use commit", "t": "text.git-rebase comment.line.number-sign.git-rebase", "r": { - "dark_plus": "comment: #608B4E", - "light_plus": "comment: #008000", - "dark_vs": "comment: #608B4E", - "light_vs": "comment: #008000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "comment: #7CA668" } }, @@ -432,10 +432,10 @@ "c": "#", "t": "text.git-rebase comment.line.number-sign.git-rebase punctuation.definition.comment.git-rebase", "r": { - "dark_plus": "comment: #608B4E", - "light_plus": "comment: #008000", - "dark_vs": "comment: #608B4E", - "light_vs": "comment: #008000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "comment: #7CA668" } }, @@ -443,10 +443,10 @@ "c": " r, reword = use commit, but edit the commit message", "t": "text.git-rebase comment.line.number-sign.git-rebase", "r": { - "dark_plus": "comment: #608B4E", - "light_plus": "comment: #008000", - "dark_vs": "comment: #608B4E", - "light_vs": "comment: #008000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "comment: #7CA668" } }, @@ -454,10 +454,10 @@ "c": "#", "t": "text.git-rebase comment.line.number-sign.git-rebase punctuation.definition.comment.git-rebase", "r": { - "dark_plus": "comment: #608B4E", - "light_plus": "comment: #008000", - "dark_vs": "comment: #608B4E", - "light_vs": "comment: #008000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "comment: #7CA668" } }, @@ -465,10 +465,10 @@ "c": " e, edit = use commit, but stop for amending", "t": "text.git-rebase comment.line.number-sign.git-rebase", "r": { - "dark_plus": "comment: #608B4E", - "light_plus": "comment: #008000", - "dark_vs": "comment: #608B4E", - "light_vs": "comment: #008000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "comment: #7CA668" } }, @@ -476,10 +476,10 @@ "c": "#", "t": "text.git-rebase comment.line.number-sign.git-rebase punctuation.definition.comment.git-rebase", "r": { - "dark_plus": "comment: #608B4E", - "light_plus": "comment: #008000", - "dark_vs": "comment: #608B4E", - "light_vs": "comment: #008000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "comment: #7CA668" } }, @@ -487,10 +487,10 @@ "c": " s, squash = use commit, but meld into previous commit", "t": "text.git-rebase comment.line.number-sign.git-rebase", "r": { - "dark_plus": "comment: #608B4E", - "light_plus": "comment: #008000", - "dark_vs": "comment: #608B4E", - "light_vs": "comment: #008000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "comment: #7CA668" } }, @@ -498,10 +498,10 @@ "c": "#", "t": "text.git-rebase comment.line.number-sign.git-rebase punctuation.definition.comment.git-rebase", "r": { - "dark_plus": "comment: #608B4E", - "light_plus": "comment: #008000", - "dark_vs": "comment: #608B4E", - "light_vs": "comment: #008000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "comment: #7CA668" } }, @@ -509,10 +509,10 @@ "c": " f, fixup = like \"squash\", but discard this commit's log message", "t": "text.git-rebase comment.line.number-sign.git-rebase", "r": { - "dark_plus": "comment: #608B4E", - "light_plus": "comment: #008000", - "dark_vs": "comment: #608B4E", - "light_vs": "comment: #008000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "comment: #7CA668" } }, @@ -520,10 +520,10 @@ "c": "#", "t": "text.git-rebase comment.line.number-sign.git-rebase punctuation.definition.comment.git-rebase", "r": { - "dark_plus": "comment: #608B4E", - "light_plus": "comment: #008000", - "dark_vs": "comment: #608B4E", - "light_vs": "comment: #008000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "comment: #7CA668" } }, @@ -531,10 +531,10 @@ "c": " x, exec = run command (the rest of the line) using shell", "t": "text.git-rebase comment.line.number-sign.git-rebase", "r": { - "dark_plus": "comment: #608B4E", - "light_plus": "comment: #008000", - "dark_vs": "comment: #608B4E", - "light_vs": "comment: #008000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "comment: #7CA668" } } diff --git a/extensions/git/yarn.lock b/extensions/git/yarn.lock index 3fb8a6f087..497e26b21d 100644 --- a/extensions/git/yarn.lock +++ b/extensions/git/yarn.lock @@ -257,15 +257,15 @@ supports-color@3.1.2: dependencies: has-flag "^1.0.0" -vscode-extension-telemetry@0.0.17: - version "0.0.17" - resolved "https://registry.yarnpkg.com/vscode-extension-telemetry/-/vscode-extension-telemetry-0.0.17.tgz#15123e7edb34e7b9724b6056f54a869bbb922cb7" +vscode-extension-telemetry@0.0.18: + version "0.0.18" + resolved "https://registry.yarnpkg.com/vscode-extension-telemetry/-/vscode-extension-telemetry-0.0.18.tgz#602ba20d8c71453aa34533a291e7638f6e5c0327" dependencies: applicationinsights "1.0.1" -vscode-nls@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/vscode-nls/-/vscode-nls-3.2.1.tgz#b1f3e04e8a94a715d5a7bcbc8339c51e6d74ca51" +vscode-nls@^3.2.4: + version "3.2.4" + resolved "https://registry.yarnpkg.com/vscode-nls/-/vscode-nls-3.2.4.tgz#2166b4183c8aea884d20727f5449e62be69fd398" which@^1.3.0: version "1.3.0" diff --git a/extensions/json-language-features/README.md b/extensions/json-language-features/README.md new file mode 100644 index 0000000000..2ff5e6e57d --- /dev/null +++ b/extensions/json-language-features/README.md @@ -0,0 +1,7 @@ +# Language Features for JSON files + +**Notice:** This extension is bundled with Visual Studio Code. It can be disabled but not uninstalled. + +## Features + +See [JSON in Visual Studio Code](https://code.visualstudio.com/docs/languages/json) to learn about the features of this extension. \ No newline at end of file diff --git a/extensions/json-language-features/client/src/jsonMain.ts b/extensions/json-language-features/client/src/jsonMain.ts index 102a081756..8904a0abe5 100644 --- a/extensions/json-language-features/client/src/jsonMain.ts +++ b/extensions/json-language-features/client/src/jsonMain.ts @@ -8,12 +8,10 @@ import * as path from 'path'; import * as nls from 'vscode-nls'; const localize = nls.loadMessageBundle(); -import { workspace, languages, ExtensionContext, extensions, Uri, LanguageConfiguration, TextDocument, FoldingRangeKind, FoldingRange, Disposable, FoldingContext } from 'vscode'; -import { LanguageClient, LanguageClientOptions, RequestType, ServerOptions, TransportKind, NotificationType, DidChangeConfigurationNotification, CancellationToken } from 'vscode-languageclient'; +import { workspace, languages, ExtensionContext, extensions, Uri, LanguageConfiguration } from 'vscode'; +import { LanguageClient, LanguageClientOptions, RequestType, ServerOptions, TransportKind, NotificationType, DidChangeConfigurationNotification } from 'vscode-languageclient'; import TelemetryReporter from 'vscode-extension-telemetry'; -import { FoldingRangeRequest, FoldingRangeRequestParam, FoldingRangeClientCapabilities, FoldingRangeKind as LSFoldingRangeKind } from 'vscode-languageserver-protocol-foldingprovider'; - import { hash } from './utils/hash'; namespace VSCodeContentRequest { @@ -97,21 +95,6 @@ export function activate(context: ExtensionContext) { // Create the language client and start the client. let client = new LanguageClient('json', localize('jsonserver.name', 'JSON Language Server'), serverOptions, clientOptions); client.registerProposedFeatures(); - client.registerFeature({ - fillClientCapabilities(capabilities: FoldingRangeClientCapabilities): void { - let textDocumentCap = capabilities.textDocument; - if (!textDocumentCap) { - textDocumentCap = capabilities.textDocument = {}; - } - textDocumentCap.foldingRange = { - dynamicRegistration: false, - rangeLimit: 5000, - lineFoldingOnly: true - }; - }, - initialize(capabilities, documentSelector): void { - } - }); let disposable = client.start(); toDispose.push(disposable); @@ -141,8 +124,6 @@ export function activate(context: ExtensionContext) { toDispose.push(workspace.onDidCloseTextDocument(d => handleContentChange(d.uri))); client.sendNotification(SchemaAssociationNotification.type, getSchemaAssociation(context)); - - toDispose.push(initFoldingProvider()); }); let languageConfiguration: LanguageConfiguration = { @@ -154,38 +135,6 @@ export function activate(context: ExtensionContext) { }; languages.setLanguageConfiguration('json', languageConfiguration); languages.setLanguageConfiguration('jsonc', languageConfiguration); - - function initFoldingProvider(): Disposable { - function getKind(kind: string | undefined): FoldingRangeKind | undefined { - if (kind) { - switch (kind) { - case LSFoldingRangeKind.Comment: - return FoldingRangeKind.Comment; - case LSFoldingRangeKind.Imports: - return FoldingRangeKind.Imports; - case LSFoldingRangeKind.Region: - return FoldingRangeKind.Region; - } - } - return void 0; - } - return languages.registerFoldingRangeProvider(documentSelector, { - provideFoldingRanges(document: TextDocument, context: FoldingContext, token: CancellationToken) { - const param: FoldingRangeRequestParam = { - textDocument: client.code2ProtocolConverter.asTextDocumentIdentifier(document) - }; - return client.sendRequest(FoldingRangeRequest.type, param, token).then(ranges => { - if (Array.isArray(ranges)) { - return ranges.map(r => new FoldingRange(r.startLine, r.endLine, getKind(r.kind))); - } - return null; - }, error => { - client.logFailedRequest(FoldingRangeRequest.type, error); - return null; - }); - } - }); - } } export function deactivate(): Promise { @@ -251,11 +200,22 @@ function getSettings(): Settings { settings.json!.schemas!.push(schemaSetting); } let fileMatches = setting.fileMatch; + let resultingFileMatches = schemaSetting.fileMatch!; if (Array.isArray(fileMatches)) { if (fileMatchPrefix) { - fileMatches = fileMatches.map(m => fileMatchPrefix + m); + for (let fileMatch of fileMatches) { + if (fileMatch[0] === '/') { + resultingFileMatches.push(fileMatchPrefix + fileMatch); + resultingFileMatches.push(fileMatchPrefix + '/*' + fileMatch); + } else { + resultingFileMatches.push(fileMatchPrefix + '/' + fileMatch); + resultingFileMatches.push(fileMatchPrefix + '/*/' + fileMatch); + } + } + } else { + resultingFileMatches.push(...fileMatches); } - schemaSetting.fileMatch!.push(...fileMatches); + } if (setting.schema) { schemaSetting.schema = setting.schema; @@ -276,10 +236,10 @@ function getSettings(): Settings { let folderSchemas = schemaConfigInfo!.workspaceFolderValue; if (Array.isArray(folderSchemas)) { let folderPath = folderUri.toString(); - if (folderPath[folderPath.length - 1] !== '/') { - folderPath = folderPath + '/'; + if (folderPath[folderPath.length - 1] === '/') { + folderPath = folderPath.substr(0, folderPath.length - 1); } - collectSchemaSettings(folderSchemas, folderUri.fsPath, folderPath + '*'); + collectSchemaSettings(folderSchemas, folderUri.fsPath, folderPath); } } } diff --git a/extensions/json-language-features/package.json b/extensions/json-language-features/package.json index 53ff50c6a8..f814f5e747 100644 --- a/extensions/json-language-features/package.json +++ b/extensions/json-language-features/package.json @@ -100,10 +100,9 @@ } }, "dependencies": { - "vscode-extension-telemetry": "0.0.17", - "vscode-languageclient": "^4.0.0", - "vscode-languageserver-protocol-foldingprovider": "^2.0.0-next.2", - "vscode-nls": "^3.2.2" + "vscode-extension-telemetry": "0.0.18", + "vscode-languageclient": "^4.4.0", + "vscode-nls": "^3.2.4" }, "devDependencies": { "@types/node": "7.0.43" diff --git a/extensions/json-language-features/package.nls.json b/extensions/json-language-features/package.nls.json index f9d52e8ebc..943de414e1 100644 --- a/extensions/json-language-features/package.nls.json +++ b/extensions/json-language-features/package.nls.json @@ -6,7 +6,7 @@ "json.schemas.fileMatch.desc": "An array of file patterns to match against when resolving JSON files to schemas.", "json.schemas.fileMatch.item.desc": "A file pattern that can contain '*' to match against when resolving JSON files to schemas.", "json.schemas.schema.desc": "The schema definition for the given URL. The schema only needs to be provided to avoid accesses to the schema URL.", - "json.format.enable.desc": "Enable/disable default JSON formatter (requires restart)", + "json.format.enable.desc": "Enable/disable default JSON formatter", "json.tracing.desc": "Traces the communication between VS Code and the JSON language server.", "json.colorDecorators.enable.desc": "Enables or disables color decorators", "json.colorDecorators.enable.deprecationMessage": "The setting `json.colorDecorators.enable` has been deprecated in favor of `editor.colorDecorators`." diff --git a/extensions/json-language-features/server/package.json b/extensions/json-language-features/server/package.json index 3f4cc7718c..e894d84872 100644 --- a/extensions/json-language-features/server/package.json +++ b/extensions/json-language-features/server/package.json @@ -11,13 +11,12 @@ "vscode-json-languageserver": "./bin/vscode-json-languageserver" }, "dependencies": { - "jsonc-parser": "^2.0.0-next.1", - "request-light": "^0.2.2", - "vscode-json-languageservice": "^3.1.2-next.2", - "vscode-languageserver": "^4.0.0", - "vscode-languageserver-protocol-foldingprovider": "^2.0.0-next.2", - "vscode-nls": "^3.2.2", - "vscode-uri": "^1.0.3" + "jsonc-parser": "^2.0.1", + "request-light": "^0.2.3", + "vscode-json-languageservice": "^3.1.4", + "vscode-languageserver": "^4.4.0", + "vscode-nls": "^3.2.4", + "vscode-uri": "^1.0.5" }, "devDependencies": { "@types/mocha": "2.2.33", diff --git a/extensions/json-language-features/server/src/jsonServerMain.ts b/extensions/json-language-features/server/src/jsonServerMain.ts index 77e492623a..91b5af1aa8 100644 --- a/extensions/json-language-features/server/src/jsonServerMain.ts +++ b/extensions/json-language-features/server/src/jsonServerMain.ts @@ -19,8 +19,6 @@ import { formatError, runSafe, runSafeAsync } from './utils/runner'; import { JSONDocument, JSONSchema, getLanguageService, DocumentLanguageSettings, SchemaConfiguration } from 'vscode-json-languageservice'; import { getLanguageModelCache } from './languageModelCache'; -import { FoldingRangeRequest, FoldingRangeServerCapabilities } from 'vscode-languageserver-protocol-foldingprovider'; - interface ISchemaAssociations { [pattern: string]: string[]; } @@ -38,7 +36,7 @@ namespace SchemaContentChangeNotification { } // Create a connection for the server -let connection: IConnection = createConnection(); +const connection: IConnection = createConnection(); process.on('unhandledRejection', (e: any) => { console.error(formatError(`Unhandled exception`, e)); @@ -53,7 +51,7 @@ console.error = connection.console.error.bind(connection.console); // Create a simple text document manager. The text document manager // supports full document sync only -let documents: TextDocuments = new TextDocuments(); +const documents: TextDocuments = new TextDocuments(); // Make the text document manager listen on the connection // for open, change and close text document events documents.listen(connection); @@ -67,7 +65,7 @@ let foldingRangeLimit = Number.MAX_VALUE; connection.onInitialize((params: InitializeParams): InitializeResult => { function getClientCapability(name: string, def: T) { - let keys = name.split('.'); + const keys = name.split('.'); let c: any = params.capabilities; for (let i = 0; c && i < keys.length; i++) { if (!c.hasOwnProperty(keys[i])) { @@ -81,29 +79,29 @@ connection.onInitialize((params: InitializeParams): InitializeResult => { clientSnippetSupport = getClientCapability('textDocument.completion.completionItem.snippetSupport', false); clientDynamicRegisterSupport = getClientCapability('workspace.symbol.dynamicRegistration', false); foldingRangeLimit = getClientCapability('textDocument.foldingRange.rangeLimit', Number.MAX_VALUE); - let capabilities: ServerCapabilities & FoldingRangeServerCapabilities = { + const capabilities: ServerCapabilities = { // Tell the client that the server works in FULL text document sync mode textDocumentSync: documents.syncKind, completionProvider: clientSnippetSupport ? { resolveProvider: true, triggerCharacters: ['"', ':'] } : void 0, hoverProvider: true, documentSymbolProvider: true, documentRangeFormattingProvider: false, - colorProvider: true, + colorProvider: {}, foldingRangeProvider: true }; return { capabilities }; }); -let workspaceContext = { +const workspaceContext = { resolveRelativePath: (relativePath: string, resource: string) => { return URL.resolve(resource, relativePath); } }; -let schemaRequestService = (uri: string): Thenable => { +const schemaRequestService = (uri: string): Thenable => { if (startsWith(uri, 'file://')) { - let fsPath = URI.parse(uri).fsPath; + const fsPath = URI.parse(uri).fsPath; return new Promise((c, e) => { fs.readFile(fsPath, 'UTF-8', (err, result) => { err ? e('') : c(result.toString()); @@ -129,7 +127,7 @@ let schemaRequestService = (uri: string): Thenable => { } }); } - let headers = { 'Accept-Encoding': 'gzip, deflate' }; + const headers = { 'Accept-Encoding': 'gzip, deflate' }; return xhr({ url: uri, followRedirects: 5, headers }).then(response => { return response.responseText; }, (error: XHRResponse) => { @@ -138,7 +136,7 @@ let schemaRequestService = (uri: string): Thenable => { }; // create the JSON language service -let languageService = getLanguageService({ +const languageService = getLanguageService({ schemaRequestService, workspaceContext, contributions: [] @@ -176,7 +174,7 @@ connection.onDidChangeConfiguration((change) => { // dynamically enable & disable the formatter if (clientDynamicRegisterSupport) { - let enableFormatter = settings && settings.json && settings.json.format && settings.json.format.enable; + const enableFormatter = settings && settings.json && settings.json.format && settings.json.format.enable; if (enableFormatter) { if (!formatterRegistration) { formatterRegistration = connection.client.register(DocumentRangeFormattingRequest.type, { documentSelector: [{ language: 'json' }, { language: 'jsonc' }] }); @@ -200,14 +198,14 @@ connection.onNotification(SchemaContentChangeNotification.type, uri => { }); function updateConfiguration() { - let languageSettings = { + const languageSettings = { validate: true, allowComments: true, schemas: new Array() }; if (schemaAssociations) { for (var pattern in schemaAssociations) { - let association = schemaAssociations[pattern]; + const association = schemaAssociations[pattern]; if (Array.isArray(association)) { association.forEach(uri => { languageSettings.schemas.push({ uri, fileMatch: [pattern] }); @@ -244,11 +242,11 @@ documents.onDidClose(event => { connection.sendDiagnostics({ uri: event.document.uri, diagnostics: [] }); }); -let pendingValidationRequests: { [uri: string]: NodeJS.Timer; } = {}; +const pendingValidationRequests: { [uri: string]: NodeJS.Timer; } = {}; const validationDelayMs = 500; function cleanPendingValidation(textDocument: TextDocument): void { - let request = pendingValidationRequests[textDocument.uri]; + const request = pendingValidationRequests[textDocument.uri]; if (request) { clearTimeout(request); delete pendingValidationRequests[textDocument.uri]; @@ -269,13 +267,13 @@ function validateTextDocument(textDocument: TextDocument): void { connection.sendDiagnostics({ uri: textDocument.uri, diagnostics: [] }); return; } - let jsonDocument = getJSONDocument(textDocument); - let version = textDocument.version; + const jsonDocument = getJSONDocument(textDocument); + const version = textDocument.version; - let documentSettings: DocumentLanguageSettings = textDocument.languageId === 'jsonc' ? { comments: 'ignore', trailingCommas: 'ignore' } : { comments: 'error', trailingCommas: 'error' }; + const documentSettings: DocumentLanguageSettings = textDocument.languageId === 'jsonc' ? { comments: 'ignore', trailingCommas: 'ignore' } : { comments: 'error', trailingCommas: 'error' }; languageService.doValidation(textDocument, jsonDocument, documentSettings).then(diagnostics => { setTimeout(() => { - let currDocument = documents.get(textDocument.uri); + const currDocument = documents.get(textDocument.uri); if (currDocument && currDocument.version === version) { // Send the computed diagnostics to VSCode. connection.sendDiagnostics({ uri: textDocument.uri, diagnostics }); @@ -299,7 +297,7 @@ connection.onDidChangeWatchedFiles((change) => { } }); -let jsonDocuments = getLanguageModelCache(10, 60, document => languageService.parseJSONDocument(document)); +const jsonDocuments = getLanguageModelCache(10, 60, document => languageService.parseJSONDocument(document)); documents.onDidClose(e => { jsonDocuments.onDocumentRemoved(e.document); }); @@ -312,10 +310,13 @@ function getJSONDocument(document: TextDocument): JSONDocument { } connection.onCompletion((textDocumentPosition, token) => { - return runSafeAsync(() => { - let document = documents.get(textDocumentPosition.textDocument.uri); - let jsonDocument = getJSONDocument(document); - return languageService.doComplete(document, textDocumentPosition.position, jsonDocument); + return runSafeAsync(async () => { + const document = documents.get(textDocumentPosition.textDocument.uri); + if (document) { + const jsonDocument = getJSONDocument(document); + return languageService.doComplete(document, textDocumentPosition.position, jsonDocument); + } + return null; }, null, `Error while computing completions for ${textDocumentPosition.textDocument.uri}`, token); }); @@ -326,53 +327,62 @@ connection.onCompletionResolve((completionItem, token) => { }); connection.onHover((textDocumentPositionParams, token) => { - return runSafeAsync(() => { - let document = documents.get(textDocumentPositionParams.textDocument.uri); - let jsonDocument = getJSONDocument(document); - return languageService.doHover(document, textDocumentPositionParams.position, jsonDocument); + return runSafeAsync(async () => { + const document = documents.get(textDocumentPositionParams.textDocument.uri); + if (document) { + const jsonDocument = getJSONDocument(document); + return languageService.doHover(document, textDocumentPositionParams.position, jsonDocument); + } + return null; }, null, `Error while computing hover for ${textDocumentPositionParams.textDocument.uri}`, token); }); connection.onDocumentSymbol((documentSymbolParams, token) => { return runSafe(() => { - let document = documents.get(documentSymbolParams.textDocument.uri); - let jsonDocument = getJSONDocument(document); - return languageService.findDocumentSymbols(document, jsonDocument); + const document = documents.get(documentSymbolParams.textDocument.uri); + if (document) { + const jsonDocument = getJSONDocument(document); + return languageService.findDocumentSymbols(document, jsonDocument); + } + return []; }, [], `Error while computing document symbols for ${documentSymbolParams.textDocument.uri}`, token); }); connection.onDocumentRangeFormatting((formatParams, token) => { return runSafe(() => { - let document = documents.get(formatParams.textDocument.uri); - return languageService.format(document, formatParams.range, formatParams.options); + const document = documents.get(formatParams.textDocument.uri); + if (document) { + return languageService.format(document, formatParams.range, formatParams.options); + } + return []; }, [], `Error while formatting range for ${formatParams.textDocument.uri}`, token); }); connection.onDocumentColor((params, token) => { - return runSafeAsync(() => { - let document = documents.get(params.textDocument.uri); + return runSafeAsync(async () => { + const document = documents.get(params.textDocument.uri); if (document) { - let jsonDocument = getJSONDocument(document); + const jsonDocument = getJSONDocument(document); return languageService.findDocumentColors(document, jsonDocument); } - return Promise.resolve([]); + return []; }, [], `Error while computing document colors for ${params.textDocument.uri}`, token); }); connection.onColorPresentation((params, token) => { return runSafe(() => { - let document = documents.get(params.textDocument.uri); + const document = documents.get(params.textDocument.uri); if (document) { - let jsonDocument = getJSONDocument(document); + const jsonDocument = getJSONDocument(document); return languageService.getColorPresentations(document, jsonDocument, params.color, params.range); } return []; }, [], `Error while computing color presentations for ${params.textDocument.uri}`, token); }); -connection.onRequest(FoldingRangeRequest.type, (params, token) => { +connection.onFoldingRanges((params, token) => { return runSafe(() => { - let document = documents.get(params.textDocument.uri); + const document = documents.get(params.textDocument.uri); if (document) { return languageService.getFoldingRanges(document, { rangeLimit: foldingRangeLimit }); } diff --git a/extensions/json-language-features/server/yarn.lock b/extensions/json-language-features/server/yarn.lock index 26fe2245dc..8948926b0b 100644 --- a/extensions/json-language-features/server/yarn.lock +++ b/extensions/json-language-features/server/yarn.lock @@ -16,13 +16,7 @@ agent-base@4, agent-base@^4.1.0: dependencies: es6-promisify "^5.0.0" -debug@2: - version "2.6.9" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" - dependencies: - ms "2.0.0" - -debug@^3.1.0: +debug@3.1.0, debug@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" dependencies: @@ -38,98 +32,75 @@ es6-promisify@^5.0.0: dependencies: es6-promise "^4.0.3" -http-proxy-agent@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-2.0.0.tgz#46482a2f0523a4d6082551709f469cb3e4a85ff4" +http-proxy-agent@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz#e4821beef5b2142a2026bd73926fe537631c5405" dependencies: agent-base "4" - debug "2" + debug "3.1.0" -https-proxy-agent@2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.1.1.tgz#a7ce4382a1ba8266ee848578778122d491260fd9" +https-proxy-agent@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz#51552970fa04d723e04c56d04178c3f92592bbc0" dependencies: agent-base "^4.1.0" debug "^3.1.0" -jsonc-parser@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-2.0.0.tgz#62ff087a7e753875febf3c55f1fc0cd737c36b5a" - -jsonc-parser@^2.0.0-next.1: - version "2.0.0-next.1" - resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-2.0.0-next.1.tgz#445a824f765a96abfbb286d759a9b1d226b18088" +jsonc-parser@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-2.0.1.tgz#9d23cd2709714fff508a1a6679d82135bee1ae60" ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" -request-light@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/request-light/-/request-light-0.2.2.tgz#53e48af32ad1514e45221ea5ece5ce782720f712" +request-light@^0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/request-light/-/request-light-0.2.3.tgz#a18635ec6dd92f8705c019c42ef645f684d94f7e" dependencies: - http-proxy-agent "2.0.0" - https-proxy-agent "2.1.1" - vscode-nls "^2.0.2" + http-proxy-agent "^2.1.0" + https-proxy-agent "^2.2.1" + vscode-nls "^3.2.2" -vscode-json-languageservice@^3.1.2-next.2: - version "3.1.2-next.2" - resolved "https://registry.yarnpkg.com/vscode-json-languageservice/-/vscode-json-languageservice-3.1.2-next.2.tgz#da5346e5c22edbce739f29c110eb41732d41dc2d" +vscode-json-languageservice@^3.1.4: + version "3.1.4" + resolved "https://registry.yarnpkg.com/vscode-json-languageservice/-/vscode-json-languageservice-3.1.4.tgz#72e84e2754ad117f9e8d36876c1a66fe16234235" dependencies: - jsonc-parser "^2.0.0" - vscode-languageserver-types "^3.6.1" - vscode-nls "^3.2.1" + jsonc-parser "^2.0.1" + vscode-languageserver-types "^3.10.0" + vscode-nls "^3.2.4" + vscode-uri "^1.0.5" + +vscode-jsonrpc@^3.6.2: + version "3.6.2" + resolved "https://registry.yarnpkg.com/vscode-jsonrpc/-/vscode-jsonrpc-3.6.2.tgz#3b5eef691159a15556ecc500e9a8a0dd143470c8" + +vscode-languageserver-protocol@^3.10.0: + version "3.10.0" + resolved "https://registry.yarnpkg.com/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.10.0.tgz#f8dcdf987687f64a26e7c32d498fc781a0e886dc" + dependencies: + vscode-jsonrpc "^3.6.2" + vscode-languageserver-types "^3.10.0" + +vscode-languageserver-types@^3.10.0: + version "3.10.0" + resolved "https://registry.yarnpkg.com/vscode-languageserver-types/-/vscode-languageserver-types-3.10.0.tgz#944e5308f3b36a3f372c766f1a344e903ec9c389" + +vscode-languageserver@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/vscode-languageserver/-/vscode-languageserver-4.4.0.tgz#b6e8b37a739ccb629d92f3635f0099d191c856fa" + dependencies: + vscode-languageserver-protocol "^3.10.0" vscode-uri "^1.0.3" -vscode-jsonrpc@^3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/vscode-jsonrpc/-/vscode-jsonrpc-3.6.0.tgz#848d56995d5168950d84feb5d9c237ae5c6a02d4" - -vscode-languageserver-protocol-foldingprovider@^2.0.0-next.2: - version "2.0.0-next.2" - resolved "https://registry.yarnpkg.com/vscode-languageserver-protocol-foldingprovider/-/vscode-languageserver-protocol-foldingprovider-2.0.0-next.2.tgz#fbb9cfdf5b8c4ac451826ba6312f1f88379f35b0" - dependencies: - vscode-languageserver-protocol "^3.6.0" - vscode-languageserver-types "^3.6.0" - -vscode-languageserver-protocol@^3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.6.0.tgz#579642cdcccf74b0cd771c33daa3239acb40d040" - dependencies: - vscode-jsonrpc "^3.6.0" - vscode-languageserver-types "^3.6.0" - -vscode-languageserver-types@^3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/vscode-languageserver-types/-/vscode-languageserver-types-3.6.0.tgz#0bba63b0fa82a714394a4478f55a596ee4ed7d0a" - -vscode-languageserver-types@^3.6.1: - version "3.6.1" - resolved "https://registry.yarnpkg.com/vscode-languageserver-types/-/vscode-languageserver-types-3.6.1.tgz#4bc06a48dff653495f12f94b8b1e228988a1748d" - -vscode-languageserver@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/vscode-languageserver/-/vscode-languageserver-4.0.0.tgz#8b792f0d6d10acfe363d02371ed4ce53d08af88a" - dependencies: - vscode-languageserver-protocol "^3.6.0" - vscode-uri "^1.0.1" - -vscode-nls@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/vscode-nls/-/vscode-nls-2.0.2.tgz#808522380844b8ad153499af5c3b03921aea02da" - -vscode-nls@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/vscode-nls/-/vscode-nls-3.2.1.tgz#b1f3e04e8a94a715d5a7bcbc8339c51e6d74ca51" - -vscode-nls@^3.2.2: - version "3.2.2" - resolved "https://registry.yarnpkg.com/vscode-nls/-/vscode-nls-3.2.2.tgz#3817eca5b985c2393de325197cf4e15eb2aa5350" - -vscode-uri@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/vscode-uri/-/vscode-uri-1.0.1.tgz#11a86befeac3c4aa3ec08623651a3c81a6d0bbc8" +vscode-nls@^3.2.2, vscode-nls@^3.2.4: + version "3.2.4" + resolved "https://registry.yarnpkg.com/vscode-nls/-/vscode-nls-3.2.4.tgz#2166b4183c8aea884d20727f5449e62be69fd398" vscode-uri@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/vscode-uri/-/vscode-uri-1.0.3.tgz#631bdbf716dccab0e65291a8dc25c23232085a52" + +vscode-uri@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/vscode-uri/-/vscode-uri-1.0.5.tgz#3b899a8ef71c37f3054d79bdbdda31c7bf36f20d" diff --git a/extensions/json-language-features/yarn.lock b/extensions/json-language-features/yarn.lock index ccfd30a4ce..a33a4a0810 100644 --- a/extensions/json-language-features/yarn.lock +++ b/extensions/json-language-features/yarn.lock @@ -28,43 +28,36 @@ semver@^5.3.0: version "5.5.0" resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab" -vscode-extension-telemetry@0.0.17: - version "0.0.17" - resolved "https://registry.yarnpkg.com/vscode-extension-telemetry/-/vscode-extension-telemetry-0.0.17.tgz#15123e7edb34e7b9724b6056f54a869bbb922cb7" +vscode-extension-telemetry@0.0.18: + version "0.0.18" + resolved "https://registry.yarnpkg.com/vscode-extension-telemetry/-/vscode-extension-telemetry-0.0.18.tgz#602ba20d8c71453aa34533a291e7638f6e5c0327" dependencies: applicationinsights "1.0.1" -vscode-jsonrpc@^3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/vscode-jsonrpc/-/vscode-jsonrpc-3.6.0.tgz#848d56995d5168950d84feb5d9c237ae5c6a02d4" +vscode-jsonrpc@^3.6.2: + version "3.6.2" + resolved "https://registry.yarnpkg.com/vscode-jsonrpc/-/vscode-jsonrpc-3.6.2.tgz#3b5eef691159a15556ecc500e9a8a0dd143470c8" -vscode-languageclient@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/vscode-languageclient/-/vscode-languageclient-4.0.0.tgz#635f5bfbcfa1385dae489b394857f1db8b459a7d" +vscode-languageclient@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/vscode-languageclient/-/vscode-languageclient-4.4.0.tgz#b05868f6477b6f0c9910b24daae4f3e8c4b65902" dependencies: - vscode-languageserver-protocol "^3.6.0" + vscode-languageserver-protocol "^3.10.0" -vscode-languageserver-protocol-foldingprovider@^2.0.0-next.2: - version "2.0.0-next.2" - resolved "https://registry.yarnpkg.com/vscode-languageserver-protocol-foldingprovider/-/vscode-languageserver-protocol-foldingprovider-2.0.0-next.2.tgz#fbb9cfdf5b8c4ac451826ba6312f1f88379f35b0" +vscode-languageserver-protocol@^3.10.0: + version "3.10.0" + resolved "https://registry.yarnpkg.com/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.10.0.tgz#f8dcdf987687f64a26e7c32d498fc781a0e886dc" dependencies: - vscode-languageserver-protocol "^3.6.0" - vscode-languageserver-types "^3.6.0" + vscode-jsonrpc "^3.6.2" + vscode-languageserver-types "^3.10.0" -vscode-languageserver-protocol@^3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.6.0.tgz#579642cdcccf74b0cd771c33daa3239acb40d040" - dependencies: - vscode-jsonrpc "^3.6.0" - vscode-languageserver-types "^3.6.0" +vscode-languageserver-types@^3.10.0: + version "3.10.0" + resolved "https://registry.yarnpkg.com/vscode-languageserver-types/-/vscode-languageserver-types-3.10.0.tgz#944e5308f3b36a3f372c766f1a344e903ec9c389" -vscode-languageserver-types@^3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/vscode-languageserver-types/-/vscode-languageserver-types-3.6.0.tgz#0bba63b0fa82a714394a4478f55a596ee4ed7d0a" - -vscode-nls@^3.2.2: - version "3.2.2" - resolved "https://registry.yarnpkg.com/vscode-nls/-/vscode-nls-3.2.2.tgz#3817eca5b985c2393de325197cf4e15eb2aa5350" +vscode-nls@^3.2.4: + version "3.2.4" + resolved "https://registry.yarnpkg.com/vscode-nls/-/vscode-nls-3.2.4.tgz#2166b4183c8aea884d20727f5449e62be69fd398" zone.js@0.7.6: version "0.7.6" diff --git a/extensions/json/build/update-grammars.js b/extensions/json/build/update-grammars.js new file mode 100644 index 0000000000..6e650f1f43 --- /dev/null +++ b/extensions/json/build/update-grammars.js @@ -0,0 +1,41 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the Source EULA. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +'use strict'; + +var updateGrammar = require('../../../build/npm/update-grammar'); + +function adaptJSON(grammar, replacementScope) { + grammar.name = 'JSON with comments'; + grammar.scopeName = `source${replacementScope}`; + + var fixScopeNames = function(rule) { + if (typeof rule.name === 'string') { + rule.name = rule.name.replace(/\.json/g, replacementScope); + } + if (typeof rule.contentName === 'string') { + rule.contentName = rule.contentName.replace(/\.json/g, replacementScope); + } + for (var property in rule) { + var value = rule[property]; + if (typeof value === 'object') { + fixScopeNames(value); + } + } + }; + + var repository = grammar.repository; + for (var key in repository) { + fixScopeNames(repository[key]); + } +} + +var tsGrammarRepo = 'Microsoft/vscode-JSON.tmLanguage'; +updateGrammar.update(tsGrammarRepo, 'JSON.tmLanguage', './syntaxes/JSON.tmLanguage.json'); +updateGrammar.update(tsGrammarRepo, 'JSON.tmLanguage', './syntaxes/JSONC.tmLanguage.json', grammar => adaptJSON(grammar, '.json.comments')); + + + + + diff --git a/extensions/json/package.json b/extensions/json/package.json index 2f36b9bfd0..af9024bfde 100644 --- a/extensions/json/package.json +++ b/extensions/json/package.json @@ -8,7 +8,7 @@ "vscode": "0.10.x" }, "scripts": { - "update-grammar": "node ../../build/npm/update-grammar.js Microsoft/vscode-JSON.tmLanguage JSON.tmLanguage ./syntaxes/JSON.tmLanguage.json" + "update-grammar": "node ./build/update-grammars.js" }, "contributes": { "languages": [ @@ -25,7 +25,9 @@ ".jscsrc", ".eslintrc", ".babelrc", - ".webmanifest" + ".webmanifest", + ".js.map", + ".css.map" ], "filenames": [ ".watchmanconfig", @@ -43,19 +45,7 @@ "JSON with Comments" ], "extensions": [ - ".code-workspace", - "language-configuration.json", - "icon-theme.json", - "color-theme.json", - ".code-snippets" - ], - "filenames": [ - "settings.json", - "launch.json", - "tasks.json", - "keybindings.json", - "tsconfig.json", - "jsconfig.json" + ".jsonc" ], "configuration": "./language-configuration.json" } @@ -68,8 +58,8 @@ }, { "language": "jsonc", - "scopeName": "source.json", - "path": "./syntaxes/JSON.tmLanguage.json" + "scopeName": "source.json.comments", + "path": "./syntaxes/JSONC.tmLanguage.json" } ], "jsonValidation": [ diff --git a/extensions/json/syntaxes/JSONC.tmLanguage.json b/extensions/json/syntaxes/JSONC.tmLanguage.json new file mode 100644 index 0000000000..50028ef0f3 --- /dev/null +++ b/extensions/json/syntaxes/JSONC.tmLanguage.json @@ -0,0 +1,213 @@ +{ + "information_for_contributors": [ + "This file has been converted from https://github.com/Microsoft/vscode-JSON.tmLanguage/blob/master/JSON.tmLanguage", + "If you want to provide a fix or improvement, please create a pull request against the original repository.", + "Once accepted there, we are happy to receive an update request." + ], + "version": "https://github.com/Microsoft/vscode-JSON.tmLanguage/commit/9bd83f1c252b375e957203f21793316203f61f70", + "name": "JSON with comments", + "scopeName": "source.json.comments", + "patterns": [ + { + "include": "#value" + } + ], + "repository": { + "array": { + "begin": "\\[", + "beginCaptures": { + "0": { + "name": "punctuation.definition.array.begin.json.comments" + } + }, + "end": "\\]", + "endCaptures": { + "0": { + "name": "punctuation.definition.array.end.json.comments" + } + }, + "name": "meta.structure.array.json.comments", + "patterns": [ + { + "include": "#value" + }, + { + "match": ",", + "name": "punctuation.separator.array.json.comments" + }, + { + "match": "[^\\s\\]]", + "name": "invalid.illegal.expected-array-separator.json.comments" + } + ] + }, + "comments": { + "patterns": [ + { + "begin": "/\\*\\*(?!/)", + "captures": { + "0": { + "name": "punctuation.definition.comment.json.comments" + } + }, + "end": "\\*/", + "name": "comment.block.documentation.json.comments" + }, + { + "begin": "/\\*", + "captures": { + "0": { + "name": "punctuation.definition.comment.json.comments" + } + }, + "end": "\\*/", + "name": "comment.block.json.comments" + }, + { + "captures": { + "1": { + "name": "punctuation.definition.comment.json.comments" + } + }, + "match": "(//).*$\\n?", + "name": "comment.line.double-slash.js" + } + ] + }, + "constant": { + "match": "\\b(?:true|false|null)\\b", + "name": "constant.language.json.comments" + }, + "number": { + "match": "(?x) # turn on extended mode\n -? # an optional minus\n (?:\n 0 # a zero\n | # ...or...\n [1-9] # a 1-9 character\n \\d* # followed by zero or more digits\n )\n (?:\n (?:\n \\. # a period\n \\d+ # followed by one or more digits\n )?\n (?:\n [eE] # an e character\n [+-]? # followed by an option +/-\n \\d+ # followed by one or more digits\n )? # make exponent optional\n )? # make decimal portion optional", + "name": "constant.numeric.json.comments" + }, + "object": { + "begin": "\\{", + "beginCaptures": { + "0": { + "name": "punctuation.definition.dictionary.begin.json.comments" + } + }, + "end": "\\}", + "endCaptures": { + "0": { + "name": "punctuation.definition.dictionary.end.json.comments" + } + }, + "name": "meta.structure.dictionary.json.comments", + "patterns": [ + { + "comment": "the JSON object key", + "include": "#objectkey" + }, + { + "include": "#comments" + }, + { + "begin": ":", + "beginCaptures": { + "0": { + "name": "punctuation.separator.dictionary.key-value.json.comments" + } + }, + "end": "(,)|(?=\\})", + "endCaptures": { + "1": { + "name": "punctuation.separator.dictionary.pair.json.comments" + } + }, + "name": "meta.structure.dictionary.value.json.comments", + "patterns": [ + { + "comment": "the JSON object value", + "include": "#value" + }, + { + "match": "[^\\s,]", + "name": "invalid.illegal.expected-dictionary-separator.json.comments" + } + ] + }, + { + "match": "[^\\s\\}]", + "name": "invalid.illegal.expected-dictionary-separator.json.comments" + } + ] + }, + "string": { + "begin": "\"", + "beginCaptures": { + "0": { + "name": "punctuation.definition.string.begin.json.comments" + } + }, + "end": "\"", + "endCaptures": { + "0": { + "name": "punctuation.definition.string.end.json.comments" + } + }, + "name": "string.quoted.double.json.comments", + "patterns": [ + { + "include": "#stringcontent" + } + ] + }, + "objectkey": { + "begin": "\"", + "beginCaptures": { + "0": { + "name": "punctuation.support.type.property-name.begin.json.comments" + } + }, + "end": "\"", + "endCaptures": { + "0": { + "name": "punctuation.support.type.property-name.end.json.comments" + } + }, + "name": "string.json.comments support.type.property-name.json.comments", + "patterns": [ + { + "include": "#stringcontent" + } + ] + }, + "stringcontent": { + "patterns": [ + { + "match": "(?x) # turn on extended mode\n \\\\ # a literal backslash\n (?: # ...followed by...\n [\"\\\\/bfnrt] # one of these characters\n | # ...or...\n u # a u\n [0-9a-fA-F]{4}) # and four hex digits", + "name": "constant.character.escape.json.comments" + }, + { + "match": "\\\\.", + "name": "invalid.illegal.unrecognized-string-escape.json.comments" + } + ] + }, + "value": { + "patterns": [ + { + "include": "#constant" + }, + { + "include": "#number" + }, + { + "include": "#string" + }, + { + "include": "#array" + }, + { + "include": "#object" + }, + { + "include": "#comments" + } + ] + } + } +} \ No newline at end of file diff --git a/extensions/json/test/colorize-results/test_json.json b/extensions/json/test/colorize-results/test_json.json index f5295bcf70..1d4dbafc38 100644 --- a/extensions/json/test/colorize-results/test_json.json +++ b/extensions/json/test/colorize-results/test_json.json @@ -3,10 +3,10 @@ "c": "{", "t": "source.json meta.structure.dictionary.json punctuation.definition.dictionary.begin.json", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -14,10 +14,10 @@ "c": "\t", "t": "source.json meta.structure.dictionary.json", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -25,10 +25,10 @@ "c": "//", "t": "source.json meta.structure.dictionary.json comment.line.double-slash.js punctuation.definition.comment.json", "r": { - "dark_plus": "comment: #608B4E", - "light_plus": "comment: #008000", - "dark_vs": "comment: #608B4E", - "light_vs": "comment: #008000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "comment: #7CA668" } }, @@ -36,10 +36,10 @@ "c": " a comment", "t": "source.json meta.structure.dictionary.json comment.line.double-slash.js", "r": { - "dark_plus": "comment: #608B4E", - "light_plus": "comment: #008000", - "dark_vs": "comment: #608B4E", - "light_vs": "comment: #008000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "comment: #7CA668" } }, @@ -47,10 +47,10 @@ "c": "\t", "t": "source.json meta.structure.dictionary.json", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -58,10 +58,10 @@ "c": "\"", "t": "source.json meta.structure.dictionary.json string.json support.type.property-name.json punctuation.support.type.property-name.begin.json", "r": { - "dark_plus": "support.type.property-name: #9CDCFE", - "light_plus": "support.type.property-name.json: #0451A5", - "dark_vs": "support.type.property-name: #9CDCFE", - "light_vs": "support.type.property-name.json: #0451A5", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "support.type.property-name: #D4D4D4" } }, @@ -69,10 +69,10 @@ "c": "options", "t": "source.json meta.structure.dictionary.json string.json support.type.property-name.json", "r": { - "dark_plus": "support.type.property-name: #9CDCFE", - "light_plus": "support.type.property-name.json: #0451A5", - "dark_vs": "support.type.property-name: #9CDCFE", - "light_vs": "support.type.property-name.json: #0451A5", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "support.type.property-name: #D4D4D4" } }, @@ -80,10 +80,10 @@ "c": "\"", "t": "source.json meta.structure.dictionary.json string.json support.type.property-name.json punctuation.support.type.property-name.end.json", "r": { - "dark_plus": "support.type.property-name: #9CDCFE", - "light_plus": "support.type.property-name.json: #0451A5", - "dark_vs": "support.type.property-name: #9CDCFE", - "light_vs": "support.type.property-name.json: #0451A5", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "support.type.property-name: #D4D4D4" } }, @@ -91,10 +91,10 @@ "c": ":", "t": "source.json meta.structure.dictionary.json meta.structure.dictionary.value.json punctuation.separator.dictionary.key-value.json", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -102,10 +102,10 @@ "c": " ", "t": "source.json meta.structure.dictionary.json meta.structure.dictionary.value.json", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -113,10 +113,10 @@ "c": "{", "t": "source.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json punctuation.definition.dictionary.begin.json", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -124,10 +124,10 @@ "c": "\t\t", "t": "source.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -135,10 +135,10 @@ "c": "\"", "t": "source.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json string.json support.type.property-name.json punctuation.support.type.property-name.begin.json", "r": { - "dark_plus": "support.type.property-name: #9CDCFE", - "light_plus": "support.type.property-name.json: #0451A5", - "dark_vs": "support.type.property-name: #9CDCFE", - "light_vs": "support.type.property-name.json: #0451A5", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "support.type.property-name: #D4D4D4" } }, @@ -146,10 +146,10 @@ "c": "myBool", "t": "source.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json string.json support.type.property-name.json", "r": { - "dark_plus": "support.type.property-name: #9CDCFE", - "light_plus": "support.type.property-name.json: #0451A5", - "dark_vs": "support.type.property-name: #9CDCFE", - "light_vs": "support.type.property-name.json: #0451A5", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "support.type.property-name: #D4D4D4" } }, @@ -157,10 +157,10 @@ "c": "\"", "t": "source.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json string.json support.type.property-name.json punctuation.support.type.property-name.end.json", "r": { - "dark_plus": "support.type.property-name: #9CDCFE", - "light_plus": "support.type.property-name.json: #0451A5", - "dark_vs": "support.type.property-name: #9CDCFE", - "light_vs": "support.type.property-name.json: #0451A5", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "support.type.property-name: #D4D4D4" } }, @@ -168,10 +168,10 @@ "c": ":", "t": "source.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json punctuation.separator.dictionary.key-value.json", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -179,10 +179,10 @@ "c": " ", "t": "source.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -190,10 +190,10 @@ "c": "true", "t": "source.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json constant.language.json", "r": { - "dark_plus": "constant.language: #569CD6", - "light_plus": "constant.language: #0000FF", - "dark_vs": "constant.language: #569CD6", - "light_vs": "constant.language: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "constant.language: #569CD6" } }, @@ -201,10 +201,10 @@ "c": ",", "t": "source.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json punctuation.separator.dictionary.pair.json", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -212,10 +212,10 @@ "c": "\t\t", "t": "source.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -223,10 +223,10 @@ "c": "\"", "t": "source.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json string.json support.type.property-name.json punctuation.support.type.property-name.begin.json", "r": { - "dark_plus": "support.type.property-name: #9CDCFE", - "light_plus": "support.type.property-name.json: #0451A5", - "dark_vs": "support.type.property-name: #9CDCFE", - "light_vs": "support.type.property-name.json: #0451A5", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "support.type.property-name: #D4D4D4" } }, @@ -234,10 +234,10 @@ "c": "myInteger", "t": "source.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json string.json support.type.property-name.json", "r": { - "dark_plus": "support.type.property-name: #9CDCFE", - "light_plus": "support.type.property-name.json: #0451A5", - "dark_vs": "support.type.property-name: #9CDCFE", - "light_vs": "support.type.property-name.json: #0451A5", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "support.type.property-name: #D4D4D4" } }, @@ -245,10 +245,10 @@ "c": "\"", "t": "source.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json string.json support.type.property-name.json punctuation.support.type.property-name.end.json", "r": { - "dark_plus": "support.type.property-name: #9CDCFE", - "light_plus": "support.type.property-name.json: #0451A5", - "dark_vs": "support.type.property-name: #9CDCFE", - "light_vs": "support.type.property-name.json: #0451A5", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "support.type.property-name: #D4D4D4" } }, @@ -256,10 +256,10 @@ "c": ":", "t": "source.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json punctuation.separator.dictionary.key-value.json", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -267,10 +267,10 @@ "c": " ", "t": "source.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -278,10 +278,10 @@ "c": "1", "t": "source.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json constant.numeric.json", "r": { - "dark_plus": "constant.numeric: #B5CEA8", - "light_plus": "constant.numeric: #09885A", - "dark_vs": "constant.numeric: #B5CEA8", - "light_vs": "constant.numeric: #09885A", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "constant.numeric: #B5CEA8" } }, @@ -289,10 +289,10 @@ "c": ",", "t": "source.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json punctuation.separator.dictionary.pair.json", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -300,10 +300,10 @@ "c": "\t\t", "t": "source.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -311,10 +311,10 @@ "c": "\"", "t": "source.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json string.json support.type.property-name.json punctuation.support.type.property-name.begin.json", "r": { - "dark_plus": "support.type.property-name: #9CDCFE", - "light_plus": "support.type.property-name.json: #0451A5", - "dark_vs": "support.type.property-name: #9CDCFE", - "light_vs": "support.type.property-name.json: #0451A5", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "support.type.property-name: #D4D4D4" } }, @@ -322,10 +322,10 @@ "c": "myString", "t": "source.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json string.json support.type.property-name.json", "r": { - "dark_plus": "support.type.property-name: #9CDCFE", - "light_plus": "support.type.property-name.json: #0451A5", - "dark_vs": "support.type.property-name: #9CDCFE", - "light_vs": "support.type.property-name.json: #0451A5", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "support.type.property-name: #D4D4D4" } }, @@ -333,10 +333,10 @@ "c": "\"", "t": "source.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json string.json support.type.property-name.json punctuation.support.type.property-name.end.json", "r": { - "dark_plus": "support.type.property-name: #9CDCFE", - "light_plus": "support.type.property-name.json: #0451A5", - "dark_vs": "support.type.property-name: #9CDCFE", - "light_vs": "support.type.property-name.json: #0451A5", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "support.type.property-name: #D4D4D4" } }, @@ -344,10 +344,10 @@ "c": ":", "t": "source.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json punctuation.separator.dictionary.key-value.json", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -355,10 +355,10 @@ "c": " ", "t": "source.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -366,10 +366,10 @@ "c": "\"", "t": "source.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json string.quoted.double.json punctuation.definition.string.begin.json", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string: #A31515", - "dark_vs": "string: #CE9178", - "light_vs": "string: #A31515", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -377,10 +377,10 @@ "c": "String", "t": "source.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json string.quoted.double.json", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string: #A31515", - "dark_vs": "string: #CE9178", - "light_vs": "string: #A31515", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -388,10 +388,10 @@ "c": "\\u0056", "t": "source.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json string.quoted.double.json constant.character.escape.json", "r": { - "dark_plus": "constant.character.escape: #D7BA7D", - "light_plus": "constant.character.escape: #A31515", - "dark_vs": "string: #CE9178", - "light_vs": "string: #A31515", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "constant.character: #569CD6" } }, @@ -399,10 +399,10 @@ "c": "\"", "t": "source.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json string.quoted.double.json punctuation.definition.string.end.json", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string: #A31515", - "dark_vs": "string: #CE9178", - "light_vs": "string: #A31515", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -410,10 +410,10 @@ "c": ",", "t": "source.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json punctuation.separator.dictionary.pair.json", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -421,10 +421,10 @@ "c": "\t\t", "t": "source.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -432,10 +432,10 @@ "c": "\"", "t": "source.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json string.json support.type.property-name.json punctuation.support.type.property-name.begin.json", "r": { - "dark_plus": "support.type.property-name: #9CDCFE", - "light_plus": "support.type.property-name.json: #0451A5", - "dark_vs": "support.type.property-name: #9CDCFE", - "light_vs": "support.type.property-name.json: #0451A5", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "support.type.property-name: #D4D4D4" } }, @@ -443,10 +443,10 @@ "c": "myNumber", "t": "source.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json string.json support.type.property-name.json", "r": { - "dark_plus": "support.type.property-name: #9CDCFE", - "light_plus": "support.type.property-name.json: #0451A5", - "dark_vs": "support.type.property-name: #9CDCFE", - "light_vs": "support.type.property-name.json: #0451A5", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "support.type.property-name: #D4D4D4" } }, @@ -454,10 +454,10 @@ "c": "\"", "t": "source.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json string.json support.type.property-name.json punctuation.support.type.property-name.end.json", "r": { - "dark_plus": "support.type.property-name: #9CDCFE", - "light_plus": "support.type.property-name.json: #0451A5", - "dark_vs": "support.type.property-name: #9CDCFE", - "light_vs": "support.type.property-name.json: #0451A5", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "support.type.property-name: #D4D4D4" } }, @@ -465,10 +465,10 @@ "c": ":", "t": "source.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json punctuation.separator.dictionary.key-value.json", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -476,10 +476,10 @@ "c": " ", "t": "source.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -487,10 +487,10 @@ "c": "1.24", "t": "source.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json constant.numeric.json", "r": { - "dark_plus": "constant.numeric: #B5CEA8", - "light_plus": "constant.numeric: #09885A", - "dark_vs": "constant.numeric: #B5CEA8", - "light_vs": "constant.numeric: #09885A", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "constant.numeric: #B5CEA8" } }, @@ -498,10 +498,10 @@ "c": ",", "t": "source.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json punctuation.separator.dictionary.pair.json", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -509,10 +509,10 @@ "c": "\t\t", "t": "source.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -520,10 +520,10 @@ "c": "\"", "t": "source.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json string.json support.type.property-name.json punctuation.support.type.property-name.begin.json", "r": { - "dark_plus": "support.type.property-name: #9CDCFE", - "light_plus": "support.type.property-name.json: #0451A5", - "dark_vs": "support.type.property-name: #9CDCFE", - "light_vs": "support.type.property-name.json: #0451A5", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "support.type.property-name: #D4D4D4" } }, @@ -531,10 +531,10 @@ "c": "myNull", "t": "source.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json string.json support.type.property-name.json", "r": { - "dark_plus": "support.type.property-name: #9CDCFE", - "light_plus": "support.type.property-name.json: #0451A5", - "dark_vs": "support.type.property-name: #9CDCFE", - "light_vs": "support.type.property-name.json: #0451A5", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "support.type.property-name: #D4D4D4" } }, @@ -542,10 +542,10 @@ "c": "\"", "t": "source.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json string.json support.type.property-name.json punctuation.support.type.property-name.end.json", "r": { - "dark_plus": "support.type.property-name: #9CDCFE", - "light_plus": "support.type.property-name.json: #0451A5", - "dark_vs": "support.type.property-name: #9CDCFE", - "light_vs": "support.type.property-name.json: #0451A5", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "support.type.property-name: #D4D4D4" } }, @@ -553,10 +553,10 @@ "c": ":", "t": "source.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json punctuation.separator.dictionary.key-value.json", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -564,10 +564,10 @@ "c": " ", "t": "source.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -575,10 +575,10 @@ "c": "null", "t": "source.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json constant.language.json", "r": { - "dark_plus": "constant.language: #569CD6", - "light_plus": "constant.language: #0000FF", - "dark_vs": "constant.language: #569CD6", - "light_vs": "constant.language: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "constant.language: #569CD6" } }, @@ -586,10 +586,10 @@ "c": ",", "t": "source.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json punctuation.separator.dictionary.pair.json", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -597,10 +597,10 @@ "c": "\t\t", "t": "source.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -608,10 +608,10 @@ "c": "\"", "t": "source.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json string.json support.type.property-name.json punctuation.support.type.property-name.begin.json", "r": { - "dark_plus": "support.type.property-name: #9CDCFE", - "light_plus": "support.type.property-name.json: #0451A5", - "dark_vs": "support.type.property-name: #9CDCFE", - "light_vs": "support.type.property-name.json: #0451A5", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "support.type.property-name: #D4D4D4" } }, @@ -619,10 +619,10 @@ "c": "myArray", "t": "source.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json string.json support.type.property-name.json", "r": { - "dark_plus": "support.type.property-name: #9CDCFE", - "light_plus": "support.type.property-name.json: #0451A5", - "dark_vs": "support.type.property-name: #9CDCFE", - "light_vs": "support.type.property-name.json: #0451A5", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "support.type.property-name: #D4D4D4" } }, @@ -630,10 +630,10 @@ "c": "\"", "t": "source.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json string.json support.type.property-name.json punctuation.support.type.property-name.end.json", "r": { - "dark_plus": "support.type.property-name: #9CDCFE", - "light_plus": "support.type.property-name.json: #0451A5", - "dark_vs": "support.type.property-name: #9CDCFE", - "light_vs": "support.type.property-name.json: #0451A5", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "support.type.property-name: #D4D4D4" } }, @@ -641,10 +641,10 @@ "c": ":", "t": "source.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json punctuation.separator.dictionary.key-value.json", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -652,10 +652,10 @@ "c": " ", "t": "source.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -663,10 +663,10 @@ "c": "[", "t": "source.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.array.json punctuation.definition.array.begin.json", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -674,10 +674,10 @@ "c": " ", "t": "source.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.array.json", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -685,10 +685,10 @@ "c": "1", "t": "source.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.array.json constant.numeric.json", "r": { - "dark_plus": "constant.numeric: #B5CEA8", - "light_plus": "constant.numeric: #09885A", - "dark_vs": "constant.numeric: #B5CEA8", - "light_vs": "constant.numeric: #09885A", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "constant.numeric: #B5CEA8" } }, @@ -696,10 +696,10 @@ "c": ",", "t": "source.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.array.json punctuation.separator.array.json", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -707,10 +707,10 @@ "c": " ", "t": "source.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.array.json", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -718,10 +718,10 @@ "c": "\"", "t": "source.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.array.json string.quoted.double.json punctuation.definition.string.begin.json", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string: #A31515", - "dark_vs": "string: #CE9178", - "light_vs": "string: #A31515", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -729,10 +729,10 @@ "c": "Hello", "t": "source.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.array.json string.quoted.double.json", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string: #A31515", - "dark_vs": "string: #CE9178", - "light_vs": "string: #A31515", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -740,10 +740,10 @@ "c": "\"", "t": "source.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.array.json string.quoted.double.json punctuation.definition.string.end.json", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string: #A31515", - "dark_vs": "string: #CE9178", - "light_vs": "string: #A31515", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -751,10 +751,10 @@ "c": ",", "t": "source.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.array.json punctuation.separator.array.json", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -762,10 +762,10 @@ "c": " ", "t": "source.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.array.json", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -773,10 +773,10 @@ "c": "true", "t": "source.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.array.json constant.language.json", "r": { - "dark_plus": "constant.language: #569CD6", - "light_plus": "constant.language: #0000FF", - "dark_vs": "constant.language: #569CD6", - "light_vs": "constant.language: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "constant.language: #569CD6" } }, @@ -784,10 +784,10 @@ "c": ",", "t": "source.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.array.json punctuation.separator.array.json", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -795,10 +795,10 @@ "c": " ", "t": "source.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.array.json", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -806,10 +806,10 @@ "c": "null", "t": "source.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.array.json constant.language.json", "r": { - "dark_plus": "constant.language: #569CD6", - "light_plus": "constant.language: #0000FF", - "dark_vs": "constant.language: #569CD6", - "light_vs": "constant.language: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "constant.language: #569CD6" } }, @@ -817,10 +817,10 @@ "c": ",", "t": "source.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.array.json punctuation.separator.array.json", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -828,10 +828,10 @@ "c": " ", "t": "source.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.array.json", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -839,10 +839,10 @@ "c": "[", "t": "source.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.array.json meta.structure.array.json punctuation.definition.array.begin.json", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -850,10 +850,10 @@ "c": "]", "t": "source.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.array.json meta.structure.array.json punctuation.definition.array.end.json", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -861,10 +861,10 @@ "c": ",", "t": "source.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.array.json punctuation.separator.array.json", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -872,10 +872,10 @@ "c": " ", "t": "source.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.array.json", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -883,10 +883,10 @@ "c": "{", "t": "source.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.array.json meta.structure.dictionary.json punctuation.definition.dictionary.begin.json", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -894,10 +894,10 @@ "c": "}", "t": "source.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.array.json meta.structure.dictionary.json punctuation.definition.dictionary.end.json", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -905,10 +905,10 @@ "c": "]", "t": "source.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.array.json punctuation.definition.array.end.json", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -916,10 +916,10 @@ "c": ",", "t": "source.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json punctuation.separator.dictionary.pair.json", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -927,10 +927,10 @@ "c": "\t\t", "t": "source.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -938,10 +938,10 @@ "c": "\"", "t": "source.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json string.json support.type.property-name.json punctuation.support.type.property-name.begin.json", "r": { - "dark_plus": "support.type.property-name: #9CDCFE", - "light_plus": "support.type.property-name.json: #0451A5", - "dark_vs": "support.type.property-name: #9CDCFE", - "light_vs": "support.type.property-name.json: #0451A5", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "support.type.property-name: #D4D4D4" } }, @@ -949,10 +949,10 @@ "c": "myObject", "t": "source.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json string.json support.type.property-name.json", "r": { - "dark_plus": "support.type.property-name: #9CDCFE", - "light_plus": "support.type.property-name.json: #0451A5", - "dark_vs": "support.type.property-name: #9CDCFE", - "light_vs": "support.type.property-name.json: #0451A5", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "support.type.property-name: #D4D4D4" } }, @@ -960,10 +960,10 @@ "c": "\"", "t": "source.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json string.json support.type.property-name.json punctuation.support.type.property-name.end.json", "r": { - "dark_plus": "support.type.property-name: #9CDCFE", - "light_plus": "support.type.property-name.json: #0451A5", - "dark_vs": "support.type.property-name: #9CDCFE", - "light_vs": "support.type.property-name.json: #0451A5", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "support.type.property-name: #D4D4D4" } }, @@ -971,10 +971,10 @@ "c": " ", "t": "source.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -982,10 +982,10 @@ "c": ":", "t": "source.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json punctuation.separator.dictionary.key-value.json", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -993,10 +993,10 @@ "c": " ", "t": "source.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1004,10 +1004,10 @@ "c": "{", "t": "source.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json punctuation.definition.dictionary.begin.json", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1015,10 +1015,10 @@ "c": "\t\t\t", "t": "source.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1026,10 +1026,10 @@ "c": "\"", "t": "source.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json string.json support.type.property-name.json punctuation.support.type.property-name.begin.json", "r": { - "dark_plus": "support.type.property-name: #9CDCFE", - "light_plus": "support.type.property-name.json: #0451A5", - "dark_vs": "support.type.property-name: #9CDCFE", - "light_vs": "support.type.property-name.json: #0451A5", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "support.type.property-name: #D4D4D4" } }, @@ -1037,10 +1037,10 @@ "c": "foo", "t": "source.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json string.json support.type.property-name.json", "r": { - "dark_plus": "support.type.property-name: #9CDCFE", - "light_plus": "support.type.property-name.json: #0451A5", - "dark_vs": "support.type.property-name: #9CDCFE", - "light_vs": "support.type.property-name.json: #0451A5", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "support.type.property-name: #D4D4D4" } }, @@ -1048,10 +1048,10 @@ "c": "\"", "t": "source.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json string.json support.type.property-name.json punctuation.support.type.property-name.end.json", "r": { - "dark_plus": "support.type.property-name: #9CDCFE", - "light_plus": "support.type.property-name.json: #0451A5", - "dark_vs": "support.type.property-name: #9CDCFE", - "light_vs": "support.type.property-name.json: #0451A5", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "support.type.property-name: #D4D4D4" } }, @@ -1059,10 +1059,10 @@ "c": ":", "t": "source.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json punctuation.separator.dictionary.key-value.json", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1070,10 +1070,10 @@ "c": " ", "t": "source.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1081,10 +1081,10 @@ "c": "\"", "t": "source.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json string.quoted.double.json punctuation.definition.string.begin.json", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string: #A31515", - "dark_vs": "string: #CE9178", - "light_vs": "string: #A31515", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -1092,10 +1092,10 @@ "c": "bar", "t": "source.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json string.quoted.double.json", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string: #A31515", - "dark_vs": "string: #CE9178", - "light_vs": "string: #A31515", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -1103,10 +1103,10 @@ "c": "\"", "t": "source.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json string.quoted.double.json punctuation.definition.string.end.json", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string: #A31515", - "dark_vs": "string: #CE9178", - "light_vs": "string: #A31515", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -1114,10 +1114,10 @@ "c": "\t\t", "t": "source.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1125,10 +1125,10 @@ "c": "}", "t": "source.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json punctuation.definition.dictionary.end.json", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1136,10 +1136,10 @@ "c": "\t", "t": "source.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1147,10 +1147,10 @@ "c": "}", "t": "source.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json punctuation.definition.dictionary.end.json", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1158,10 +1158,10 @@ "c": "}", "t": "source.json meta.structure.dictionary.json punctuation.definition.dictionary.end.json", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } } diff --git a/extensions/markdown-basics/language-configuration.json b/extensions/markdown-basics/language-configuration.json index 23a25ede9c..ccddf061e7 100644 --- a/extensions/markdown-basics/language-configuration.json +++ b/extensions/markdown-basics/language-configuration.json @@ -36,7 +36,9 @@ "surroundingPairs": [ ["(", ")"], ["[", "]"], - ["`", "`"] + ["`", "`"], + ["_", "_"], + ["*", "*"] ], "folding": { "offSide": true, diff --git a/extensions/markdown-basics/package.json b/extensions/markdown-basics/package.json index 8583ba0c8b..dd0b3f5a87 100644 --- a/extensions/markdown-basics/package.json +++ b/extensions/markdown-basics/package.json @@ -19,7 +19,8 @@ ".md", ".mdown", ".markdown", - ".markdn" + ".markdn", + ".workbook" ], "configuration": "./language-configuration.json" } @@ -57,7 +58,7 @@ "meta.embedded.block.dockerfile": "dockerfile", "meta.embedded.block.go": "go", "meta.embedded.block.groovy": "groovy", - "meta.embedded.block.jade": "jade", + "meta.embedded.block.pug": "jade", "meta.embedded.block.javascript": "javascript", "meta.embedded.block.json": "json", "meta.embedded.block.less": "less", diff --git a/extensions/markdown-basics/syntaxes/markdown.tmLanguage.json b/extensions/markdown-basics/syntaxes/markdown.tmLanguage.json index 820134b366..d49d068846 100644 --- a/extensions/markdown-basics/syntaxes/markdown.tmLanguage.json +++ b/extensions/markdown-basics/syntaxes/markdown.tmLanguage.json @@ -4,7 +4,7 @@ "If you want to provide a fix or improvement, please create a pull request against the original repository.", "Once accepted there, we are happy to receive an update request." ], - "version": "https://github.com/microsoft/vscode-markdown-tm-grammar/commit/e667795f83c83e36dc6f90bde14632a963c52e34", + "version": "https://github.com/microsoft/vscode-markdown-tm-grammar/commit/4504240cdb13a4640f64fc98a0adb858226a879e", "name": "Markdown", "scopeName": "text.html.markdown", "patterns": [ @@ -109,7 +109,7 @@ "include": "#fenced_code_block_groovy" }, { - "include": "#fenced_code_block_jade" + "include": "#fenced_code_block_pug" }, { "include": "#fenced_code_block_js" @@ -162,6 +162,9 @@ { "include": "#fenced_code_block_fsharp" }, + { + "include": "#fenced_code_block_dart" + }, { "include": "#fenced_code_block_unknown" }, @@ -719,7 +722,7 @@ "contentName": "meta.embedded.block.dosbatch", "patterns": [ { - "include": "source.dosbatch" + "include": "source.batchfile" } ] } @@ -1055,7 +1058,7 @@ } ] }, - "fenced_code_block_jade": { + "fenced_code_block_pug": { "begin": "(^|\\G)(\\s*)(`{3,}|~{3,})\\s*(?i:(jade|pug)(\\s+[^`~]*)?$)", "name": "markup.fenced_code.block.markdown", "end": "(^|\\G)(\\2|\\s{0,3})(\\3)\\s*$", @@ -1079,10 +1082,10 @@ { "begin": "(^|\\G)(\\s*)(.*)", "while": "(^|\\G)(?!\\s*([`~]{3,})\\s*$)", - "contentName": "meta.embedded.block.jade", + "contentName": "meta.embedded.block.pug", "patterns": [ { - "include": "text.jade" + "include": "text.pug" } ] } @@ -1649,6 +1652,39 @@ } ] }, + "fenced_code_block_dart": { + "begin": "(^|\\G)(\\s*)(`{3,}|~{3,})\\s*(?i:(dart)(\\s+[^`~]*)?$)", + "name": "markup.fenced_code.block.markdown", + "end": "(^|\\G)(\\2|\\s{0,3})(\\3)\\s*$", + "beginCaptures": { + "3": { + "name": "punctuation.definition.markdown" + }, + "5": { + "name": "fenced_code.block.language" + }, + "6": { + "name": "fenced_code.block.language.attributes" + } + }, + "endCaptures": { + "3": { + "name": "punctuation.definition.markdown" + } + }, + "patterns": [ + { + "begin": "(^|\\G)(\\s*)(.*)", + "while": "(^|\\G)(?!\\s*([`~]{3,})\\s*$)", + "contentName": "meta.embedded.block.dart", + "patterns": [ + { + "include": "source.dart" + } + ] + } + ] + }, "fenced_code_block_unknown": { "begin": "(^|\\G)(\\s*)(`{3,}|~{3,})\\s*(?=([^`~]*)?$)", "beginCaptures": { @@ -1958,7 +1994,7 @@ "while": "(^|\\G)([ ]{4}|\\t)" }, "separator": { - "match": "(^|\\G)[ ]{0,3}([*-_])([ ]{0,2}\\2){2,}[ \\t]*$\\n?", + "match": "(^|\\G)[ ]{0,3}([\\*\\-\\_])([ ]{0,2}\\2){2,}[ \\t]*$\\n?", "name": "meta.separator.markdown" } } diff --git a/extensions/markdown-basics/test/colorize-results/test-33886_md.json b/extensions/markdown-basics/test/colorize-results/test-33886_md.json index 185d172e8a..422f02ed2a 100644 --- a/extensions/markdown-basics/test/colorize-results/test-33886_md.json +++ b/extensions/markdown-basics/test/colorize-results/test-33886_md.json @@ -3,10 +3,10 @@ "c": "#", "t": "text.html.markdown markup.heading.markdown heading.1.markdown punctuation.definition.heading.markdown", "r": { - "dark_plus": "markup.heading: #569CD6", - "light_plus": "markup.heading: #800000", - "dark_vs": "markup.heading: #569CD6", - "light_vs": "markup.heading: #800000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "markup.heading: #6796E6" } }, @@ -14,10 +14,10 @@ "c": " ", "t": "text.html.markdown markup.heading.markdown heading.1.markdown", "r": { - "dark_plus": "markup.heading: #569CD6", - "light_plus": "markup.heading: #800000", - "dark_vs": "markup.heading: #569CD6", - "light_vs": "markup.heading: #800000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "markup.heading: #6796E6" } }, @@ -25,164 +25,32 @@ "c": "h", "t": "text.html.markdown markup.heading.markdown heading.1.markdown entity.name.section.markdown", "r": { - "dark_plus": "markup.heading: #569CD6", - "light_plus": "markup.heading: #800000", - "dark_vs": "markup.heading: #569CD6", - "light_vs": "markup.heading: #800000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "markup.heading: #6796E6" } }, { - "c": "<", - "t": "text.html.markdown meta.tag.block.any.html punctuation.definition.tag.begin.html", + "c": "
",
+		"t": "text.html.markdown meta.paragraph.markdown",
 		"r": {
-			"dark_plus": "punctuation.definition.tag: #808080",
-			"light_plus": "punctuation.definition.tag: #800000",
-			"dark_vs": "punctuation.definition.tag: #808080",
-			"light_vs": "punctuation.definition.tag: #800000",
-			"hc_black": "punctuation.definition.tag: #808080"
-		}
-	},
-	{
-		"c": "pre",
-		"t": "text.html.markdown meta.tag.block.any.html entity.name.tag.block.any.html",
-		"r": {
-			"dark_plus": "entity.name.tag: #569CD6",
-			"light_plus": "entity.name.tag: #800000",
-			"dark_vs": "entity.name.tag: #569CD6",
-			"light_vs": "entity.name.tag: #800000",
-			"hc_black": "entity.name.tag: #569CD6"
-		}
-	},
-	{
-		"c": ">",
-		"t": "text.html.markdown meta.tag.block.any.html punctuation.definition.tag.end.html",
-		"r": {
-			"dark_plus": "punctuation.definition.tag: #808080",
-			"light_plus": "punctuation.definition.tag: #800000",
-			"dark_vs": "punctuation.definition.tag: #808080",
-			"light_vs": "punctuation.definition.tag: #800000",
-			"hc_black": "punctuation.definition.tag: #808080"
-		}
-	},
-	{
-		"c": "<",
-		"t": "text.html.markdown meta.tag.inline.any.html punctuation.definition.tag.begin.html",
-		"r": {
-			"dark_plus": "punctuation.definition.tag: #808080",
-			"light_plus": "punctuation.definition.tag: #800000",
-			"dark_vs": "punctuation.definition.tag: #808080",
-			"light_vs": "punctuation.definition.tag: #800000",
-			"hc_black": "punctuation.definition.tag: #808080"
-		}
-	},
-	{
-		"c": "code",
-		"t": "text.html.markdown meta.tag.inline.any.html entity.name.tag.inline.any.html",
-		"r": {
-			"dark_plus": "entity.name.tag: #569CD6",
-			"light_plus": "entity.name.tag: #800000",
-			"dark_vs": "entity.name.tag: #569CD6",
-			"light_vs": "entity.name.tag: #800000",
-			"hc_black": "entity.name.tag: #569CD6"
-		}
-	},
-	{
-		"c": ">",
-		"t": "text.html.markdown meta.tag.inline.any.html punctuation.definition.tag.end.html",
-		"r": {
-			"dark_plus": "punctuation.definition.tag: #808080",
-			"light_plus": "punctuation.definition.tag: #800000",
-			"dark_vs": "punctuation.definition.tag: #808080",
-			"light_vs": "punctuation.definition.tag: #800000",
-			"hc_black": "punctuation.definition.tag: #808080"
-		}
-	},
-	{
-		"c": "# a",
-		"t": "text.html.markdown",
-		"r": {
-			"dark_plus": "default: #D4D4D4",
-			"light_plus": "default: #000000",
-			"dark_vs": "default: #D4D4D4",
-			"light_vs": "default: #000000",
+			"dark_plus": null,
+			"light_plus": null,
+			"dark_vs": null,
+			"light_vs": null,
 			"hc_black": "default: #FFFFFF"
 		}
 	},
-	{
-		"c": "",
-		"t": "text.html.markdown meta.paragraph.markdown meta.tag.inline.any.html punctuation.definition.tag.end.html",
-		"r": {
-			"dark_plus": "punctuation.definition.tag: #808080",
-			"light_plus": "punctuation.definition.tag: #800000",
-			"dark_vs": "punctuation.definition.tag: #808080",
-			"light_vs": "punctuation.definition.tag: #800000",
-			"hc_black": "punctuation.definition.tag: #808080"
-		}
-	},
-	{
-		"c": "",
-		"t": "text.html.markdown meta.paragraph.markdown meta.tag.block.any.html punctuation.definition.tag.end.html",
-		"r": {
-			"dark_plus": "punctuation.definition.tag: #808080",
-			"light_plus": "punctuation.definition.tag: #800000",
-			"dark_vs": "punctuation.definition.tag: #808080",
-			"light_vs": "punctuation.definition.tag: #800000",
-			"hc_black": "punctuation.definition.tag: #808080"
-		}
-	},
 	{
 		"c": "#",
 		"t": "text.html.markdown markup.heading.markdown heading.1.markdown punctuation.definition.heading.markdown",
 		"r": {
-			"dark_plus": "markup.heading: #569CD6",
-			"light_plus": "markup.heading: #800000",
-			"dark_vs": "markup.heading: #569CD6",
-			"light_vs": "markup.heading: #800000",
+			"dark_plus": null,
+			"light_plus": null,
+			"dark_vs": null,
+			"light_vs": null,
 			"hc_black": "markup.heading: #6796E6"
 		}
 	},
@@ -190,120 +58,43 @@
 		"c": " ",
 		"t": "text.html.markdown markup.heading.markdown heading.1.markdown",
 		"r": {
-			"dark_plus": "markup.heading: #569CD6",
-			"light_plus": "markup.heading: #800000",
-			"dark_vs": "markup.heading: #569CD6",
-			"light_vs": "markup.heading: #800000",
+			"dark_plus": null,
+			"light_plus": null,
+			"dark_vs": null,
+			"light_vs": null,
 			"hc_black": "markup.heading: #6796E6"
 		}
 	},
-	{
-		"c": "h",
-		"t": "text.html.markdown markup.heading.markdown heading.1.markdown entity.name.section.markdown",
-		"r": {
-			"dark_plus": "markup.heading: #569CD6",
-			"light_plus": "markup.heading: #800000",
-			"dark_vs": "markup.heading: #569CD6",
-			"light_vs": "markup.heading: #800000",
-			"hc_black": "markup.heading: #6796E6"
-		}
-	},
-	{
-		"c": "<",
-		"t": "text.html.markdown meta.tag.block.any.html punctuation.definition.tag.begin.html",
-		"r": {
-			"dark_plus": "punctuation.definition.tag: #808080",
-			"light_plus": "punctuation.definition.tag: #800000",
-			"dark_vs": "punctuation.definition.tag: #808080",
-			"light_vs": "punctuation.definition.tag: #800000",
-			"hc_black": "punctuation.definition.tag: #808080"
-		}
-	},
-	{
-		"c": "pre",
-		"t": "text.html.markdown meta.tag.block.any.html entity.name.tag.block.any.html",
-		"r": {
-			"dark_plus": "entity.name.tag: #569CD6",
-			"light_plus": "entity.name.tag: #800000",
-			"dark_vs": "entity.name.tag: #569CD6",
-			"light_vs": "entity.name.tag: #800000",
-			"hc_black": "entity.name.tag: #569CD6"
-		}
-	},
-	{
-		"c": ">",
-		"t": "text.html.markdown meta.tag.block.any.html punctuation.definition.tag.end.html",
-		"r": {
-			"dark_plus": "punctuation.definition.tag: #808080",
-			"light_plus": "punctuation.definition.tag: #800000",
-			"dark_vs": "punctuation.definition.tag: #808080",
-			"light_vs": "punctuation.definition.tag: #800000",
-			"hc_black": "punctuation.definition.tag: #808080"
-		}
-	},
-	{
-		"c": "# a",
-		"t": "text.html.markdown",
-		"r": {
-			"dark_plus": "default: #D4D4D4",
-			"light_plus": "default: #000000",
-			"dark_vs": "default: #D4D4D4",
-			"light_vs": "default: #000000",
-			"hc_black": "default: #FFFFFF"
-		}
-	},
 	{
 		"c": "a",
+		"t": "text.html.markdown markup.heading.markdown heading.1.markdown entity.name.section.markdown",
+		"r": {
+			"dark_plus": null,
+			"light_plus": null,
+			"dark_vs": null,
+			"light_vs": null,
+			"hc_black": "markup.heading: #6796E6"
+		}
+	},
+	{
+		"c": "
", "t": "text.html.markdown meta.paragraph.markdown", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, - { - "c": "", - "t": "text.html.markdown meta.paragraph.markdown meta.tag.block.any.html punctuation.definition.tag.end.html", - "r": { - "dark_plus": "punctuation.definition.tag: #808080", - "light_plus": "punctuation.definition.tag: #800000", - "dark_vs": "punctuation.definition.tag: #808080", - "light_vs": "punctuation.definition.tag: #800000", - "hc_black": "punctuation.definition.tag: #808080" - } - }, { "c": "#", "t": "text.html.markdown markup.heading.markdown heading.1.markdown punctuation.definition.heading.markdown", "r": { - "dark_plus": "markup.heading: #569CD6", - "light_plus": "markup.heading: #800000", - "dark_vs": "markup.heading: #569CD6", - "light_vs": "markup.heading: #800000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "markup.heading: #6796E6" } }, @@ -311,10 +102,10 @@ "c": " ", "t": "text.html.markdown markup.heading.markdown heading.1.markdown", "r": { - "dark_plus": "markup.heading: #569CD6", - "light_plus": "markup.heading: #800000", - "dark_vs": "markup.heading: #569CD6", - "light_vs": "markup.heading: #800000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "markup.heading: #6796E6" } }, @@ -322,10 +113,98 @@ "c": "h", "t": "text.html.markdown markup.heading.markdown heading.1.markdown entity.name.section.markdown", "r": { - "dark_plus": "markup.heading: #569CD6", - "light_plus": "markup.heading: #800000", - "dark_vs": "markup.heading: #569CD6", - "light_vs": "markup.heading: #800000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "markup.heading: #6796E6" + } + }, + { + "c": "
",
+		"t": "text.html.markdown meta.paragraph.markdown",
+		"r": {
+			"dark_plus": null,
+			"light_plus": null,
+			"dark_vs": null,
+			"light_vs": null,
+			"hc_black": "default: #FFFFFF"
+		}
+	},
+	{
+		"c": "#",
+		"t": "text.html.markdown markup.heading.markdown heading.1.markdown punctuation.definition.heading.markdown",
+		"r": {
+			"dark_plus": null,
+			"light_plus": null,
+			"dark_vs": null,
+			"light_vs": null,
+			"hc_black": "markup.heading: #6796E6"
+		}
+	},
+	{
+		"c": " ",
+		"t": "text.html.markdown markup.heading.markdown heading.1.markdown",
+		"r": {
+			"dark_plus": null,
+			"light_plus": null,
+			"dark_vs": null,
+			"light_vs": null,
+			"hc_black": "markup.heading: #6796E6"
+		}
+	},
+	{
+		"c": "a",
+		"t": "text.html.markdown markup.heading.markdown heading.1.markdown entity.name.section.markdown",
+		"r": {
+			"dark_plus": null,
+			"light_plus": null,
+			"dark_vs": null,
+			"light_vs": null,
+			"hc_black": "markup.heading: #6796E6"
+		}
+	},
+	{
+		"c": "a
", + "t": "text.html.markdown meta.paragraph.markdown", + "r": { + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "#", + "t": "text.html.markdown markup.heading.markdown heading.1.markdown punctuation.definition.heading.markdown", + "r": { + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "markup.heading: #6796E6" + } + }, + { + "c": " ", + "t": "text.html.markdown markup.heading.markdown heading.1.markdown", + "r": { + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "markup.heading: #6796E6" + } + }, + { + "c": "h", + "t": "text.html.markdown markup.heading.markdown heading.1.markdown entity.name.section.markdown", + "r": { + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "markup.heading: #6796E6" } } diff --git a/extensions/markdown-basics/test/colorize-results/test_md.json b/extensions/markdown-basics/test/colorize-results/test_md.json index eb09a71c81..739102c00e 100644 --- a/extensions/markdown-basics/test/colorize-results/test_md.json +++ b/extensions/markdown-basics/test/colorize-results/test_md.json @@ -3,10 +3,10 @@ "c": "#", "t": "text.html.markdown markup.heading.markdown heading.1.markdown punctuation.definition.heading.markdown", "r": { - "dark_plus": "markup.heading: #569CD6", - "light_plus": "markup.heading: #800000", - "dark_vs": "markup.heading: #569CD6", - "light_vs": "markup.heading: #800000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "markup.heading: #6796E6" } }, @@ -14,10 +14,10 @@ "c": " ", "t": "text.html.markdown markup.heading.markdown heading.1.markdown", "r": { - "dark_plus": "markup.heading: #569CD6", - "light_plus": "markup.heading: #800000", - "dark_vs": "markup.heading: #569CD6", - "light_vs": "markup.heading: #800000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "markup.heading: #6796E6" } }, @@ -25,10 +25,10 @@ "c": "Header 1", "t": "text.html.markdown markup.heading.markdown heading.1.markdown entity.name.section.markdown", "r": { - "dark_plus": "markup.heading: #569CD6", - "light_plus": "markup.heading: #800000", - "dark_vs": "markup.heading: #569CD6", - "light_vs": "markup.heading: #800000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "markup.heading: #6796E6" } }, @@ -36,10 +36,10 @@ "c": " #", "t": "text.html.markdown markup.heading.markdown heading.1.markdown punctuation.definition.heading.markdown", "r": { - "dark_plus": "markup.heading: #569CD6", - "light_plus": "markup.heading: #800000", - "dark_vs": "markup.heading: #569CD6", - "light_vs": "markup.heading: #800000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "markup.heading: #6796E6" } }, @@ -47,10 +47,10 @@ "c": "##", "t": "text.html.markdown markup.heading.markdown heading.2.markdown punctuation.definition.heading.markdown", "r": { - "dark_plus": "markup.heading: #569CD6", - "light_plus": "markup.heading: #800000", - "dark_vs": "markup.heading: #569CD6", - "light_vs": "markup.heading: #800000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "markup.heading: #6796E6" } }, @@ -58,10 +58,10 @@ "c": " ", "t": "text.html.markdown markup.heading.markdown heading.2.markdown", "r": { - "dark_plus": "markup.heading: #569CD6", - "light_plus": "markup.heading: #800000", - "dark_vs": "markup.heading: #569CD6", - "light_vs": "markup.heading: #800000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "markup.heading: #6796E6" } }, @@ -69,10 +69,10 @@ "c": "Header 2", "t": "text.html.markdown markup.heading.markdown heading.2.markdown entity.name.section.markdown", "r": { - "dark_plus": "markup.heading: #569CD6", - "light_plus": "markup.heading: #800000", - "dark_vs": "markup.heading: #569CD6", - "light_vs": "markup.heading: #800000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "markup.heading: #6796E6" } }, @@ -80,10 +80,10 @@ "c": " ##", "t": "text.html.markdown markup.heading.markdown heading.2.markdown punctuation.definition.heading.markdown", "r": { - "dark_plus": "markup.heading: #569CD6", - "light_plus": "markup.heading: #800000", - "dark_vs": "markup.heading: #569CD6", - "light_vs": "markup.heading: #800000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "markup.heading: #6796E6" } }, @@ -91,10 +91,10 @@ "c": "###", "t": "text.html.markdown markup.heading.markdown heading.3.markdown punctuation.definition.heading.markdown", "r": { - "dark_plus": "markup.heading: #569CD6", - "light_plus": "markup.heading: #800000", - "dark_vs": "markup.heading: #569CD6", - "light_vs": "markup.heading: #800000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "markup.heading: #6796E6" } }, @@ -102,10 +102,10 @@ "c": " ", "t": "text.html.markdown markup.heading.markdown heading.3.markdown", "r": { - "dark_plus": "markup.heading: #569CD6", - "light_plus": "markup.heading: #800000", - "dark_vs": "markup.heading: #569CD6", - "light_vs": "markup.heading: #800000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "markup.heading: #6796E6" } }, @@ -113,10 +113,10 @@ "c": "Header 3 ### (Hashes on right are optional)", "t": "text.html.markdown markup.heading.markdown heading.3.markdown entity.name.section.markdown", "r": { - "dark_plus": "markup.heading: #569CD6", - "light_plus": "markup.heading: #800000", - "dark_vs": "markup.heading: #569CD6", - "light_vs": "markup.heading: #800000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "markup.heading: #6796E6" } }, @@ -124,10 +124,10 @@ "c": "##", "t": "text.html.markdown markup.heading.markdown heading.2.markdown punctuation.definition.heading.markdown", "r": { - "dark_plus": "markup.heading: #569CD6", - "light_plus": "markup.heading: #800000", - "dark_vs": "markup.heading: #569CD6", - "light_vs": "markup.heading: #800000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "markup.heading: #6796E6" } }, @@ -135,10 +135,10 @@ "c": " ", "t": "text.html.markdown markup.heading.markdown heading.2.markdown", "r": { - "dark_plus": "markup.heading: #569CD6", - "light_plus": "markup.heading: #800000", - "dark_vs": "markup.heading: #569CD6", - "light_vs": "markup.heading: #800000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "markup.heading: #6796E6" } }, @@ -146,10 +146,10 @@ "c": "Markdown plus h2 with a custom ID ## {#id-goes-here}", "t": "text.html.markdown markup.heading.markdown heading.2.markdown entity.name.section.markdown", "r": { - "dark_plus": "markup.heading: #569CD6", - "light_plus": "markup.heading: #800000", - "dark_vs": "markup.heading: #569CD6", - "light_vs": "markup.heading: #800000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "markup.heading: #6796E6" } }, @@ -157,10 +157,10 @@ "c": "[", "t": "text.html.markdown meta.paragraph.markdown meta.link.inline.markdown punctuation.definition.string.begin.markdown", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -168,10 +168,10 @@ "c": "Link back to H2", "t": "text.html.markdown meta.paragraph.markdown meta.link.inline.markdown string.other.link.title.markdown", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string: #A31515", - "dark_vs": "string: #CE9178", - "light_vs": "string: #A31515", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -179,10 +179,10 @@ "c": "]", "t": "text.html.markdown meta.paragraph.markdown meta.link.inline.markdown punctuation.definition.string.end.markdown", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -190,10 +190,10 @@ "c": "(", "t": "text.html.markdown meta.paragraph.markdown meta.link.inline.markdown punctuation.definition.metadata.markdown", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -201,10 +201,10 @@ "c": "#id-goes-here", "t": "text.html.markdown meta.paragraph.markdown meta.link.inline.markdown markup.underline.link.markdown", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -212,10 +212,10 @@ "c": ")", "t": "text.html.markdown meta.paragraph.markdown meta.link.inline.markdown punctuation.definition.metadata.markdown", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -223,10 +223,10 @@ "c": "###", "t": "text.html.markdown markup.heading.markdown heading.3.markdown punctuation.definition.heading.markdown", "r": { - "dark_plus": "markup.heading: #569CD6", - "light_plus": "markup.heading: #800000", - "dark_vs": "markup.heading: #569CD6", - "light_vs": "markup.heading: #800000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "markup.heading: #6796E6" } }, @@ -234,10 +234,10 @@ "c": " ", "t": "text.html.markdown markup.heading.markdown heading.3.markdown", "r": { - "dark_plus": "markup.heading: #569CD6", - "light_plus": "markup.heading: #800000", - "dark_vs": "markup.heading: #569CD6", - "light_vs": "markup.heading: #800000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "markup.heading: #6796E6" } }, @@ -245,10 +245,10 @@ "c": "Alternate heading styles:", "t": "text.html.markdown markup.heading.markdown heading.3.markdown entity.name.section.markdown", "r": { - "dark_plus": "markup.heading: #569CD6", - "light_plus": "markup.heading: #800000", - "dark_vs": "markup.heading: #569CD6", - "light_vs": "markup.heading: #800000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "markup.heading: #6796E6" } }, @@ -256,10 +256,10 @@ "c": "Alternate Header 1", "t": "text.html.markdown meta.paragraph.markdown", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -267,10 +267,10 @@ "c": "==================", "t": "text.html.markdown meta.paragraph.markdown markup.heading.setext.1.markdown", "r": { - "dark_plus": "markup.heading: #569CD6", - "light_plus": "markup.heading: #800000", - "dark_vs": "markup.heading: #569CD6", - "light_vs": "markup.heading: #800000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "markup.heading: #6796E6" } }, @@ -278,10 +278,10 @@ "c": "Alternate Header 2", "t": "text.html.markdown meta.paragraph.markdown", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -289,10 +289,10 @@ "c": "------------------", "t": "text.html.markdown meta.paragraph.markdown markup.heading.setext.2.markdown", "r": { - "dark_plus": "markup.heading: #569CD6", - "light_plus": "markup.heading: #800000", - "dark_vs": "markup.heading: #569CD6", - "light_vs": "markup.heading: #800000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "markup.heading: #6796E6" } }, @@ -300,10 +300,10 @@ "c": "", "t": "text.html.markdown comment.block.html punctuation.definition.comment.html", "r": { - "dark_plus": "comment: #608B4E", - "light_plus": "comment: #008000", - "dark_vs": "comment: #608B4E", - "light_vs": "comment: #008000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "comment: #7CA668" } }, { - "c": "<", - "t": "text.html.markdown meta.tag.block.any.html punctuation.definition.tag.begin.html", + "c": "
", + "t": "text.html.markdown meta.paragraph.markdown", "r": { - "dark_plus": "punctuation.definition.tag: #808080", - "light_plus": "punctuation.definition.tag: #800000", - "dark_vs": "punctuation.definition.tag: #808080", - "light_vs": "punctuation.definition.tag: #800000", - "hc_black": "punctuation.definition.tag: #808080" - } - }, - { - "c": "div", - "t": "text.html.markdown meta.tag.block.any.html entity.name.tag.block.any.html", - "r": { - "dark_plus": "entity.name.tag: #569CD6", - "light_plus": "entity.name.tag: #800000", - "dark_vs": "entity.name.tag: #569CD6", - "light_vs": "entity.name.tag: #800000", - "hc_black": "entity.name.tag: #569CD6" - } - }, - { - "c": " ", - "t": "text.html.markdown meta.tag.block.any.html", - "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, { - "c": "class", - "t": "text.html.markdown meta.tag.block.any.html entity.other.attribute-name.html", + "c": "
", + "t": "text.html.markdown meta.paragraph.markdown", "r": { - "dark_plus": "entity.other.attribute-name: #9CDCFE", - "light_plus": "entity.other.attribute-name: #FF0000", - "dark_vs": "entity.other.attribute-name: #9CDCFE", - "light_vs": "entity.other.attribute-name: #FF0000", - "hc_black": "entity.other.attribute-name: #9CDCFE" - } - }, - { - "c": "=", - "t": "text.html.markdown meta.tag.block.any.html", - "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, - { - "c": "\"", - "t": "text.html.markdown meta.tag.block.any.html string.quoted.double.html punctuation.definition.string.begin.html", - "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string.quoted.double.html: #0000FF", - "dark_vs": "string: #CE9178", - "light_vs": "string.quoted.double.html: #0000FF", - "hc_black": "string: #CE9178" - } - }, - { - "c": "custom-class", - "t": "text.html.markdown meta.tag.block.any.html string.quoted.double.html", - "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string.quoted.double.html: #0000FF", - "dark_vs": "string: #CE9178", - "light_vs": "string.quoted.double.html: #0000FF", - "hc_black": "string: #CE9178" - } - }, - { - "c": "\"", - "t": "text.html.markdown meta.tag.block.any.html string.quoted.double.html punctuation.definition.string.end.html", - "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string.quoted.double.html: #0000FF", - "dark_vs": "string: #CE9178", - "light_vs": "string.quoted.double.html: #0000FF", - "hc_black": "string: #CE9178" - } - }, - { - "c": " ", - "t": "text.html.markdown meta.tag.block.any.html", - "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" - } - }, - { - "c": "markdown", - "t": "text.html.markdown meta.tag.block.any.html entity.other.attribute-name.html", - "r": { - "dark_plus": "entity.other.attribute-name: #9CDCFE", - "light_plus": "entity.other.attribute-name: #FF0000", - "dark_vs": "entity.other.attribute-name: #9CDCFE", - "light_vs": "entity.other.attribute-name: #FF0000", - "hc_black": "entity.other.attribute-name: #9CDCFE" - } - }, - { - "c": "=", - "t": "text.html.markdown meta.tag.block.any.html", - "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" - } - }, - { - "c": "\"", - "t": "text.html.markdown meta.tag.block.any.html string.quoted.double.html punctuation.definition.string.begin.html", - "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string.quoted.double.html: #0000FF", - "dark_vs": "string: #CE9178", - "light_vs": "string.quoted.double.html: #0000FF", - "hc_black": "string: #CE9178" - } - }, - { - "c": "1", - "t": "text.html.markdown meta.tag.block.any.html string.quoted.double.html", - "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string.quoted.double.html: #0000FF", - "dark_vs": "string: #CE9178", - "light_vs": "string.quoted.double.html: #0000FF", - "hc_black": "string: #CE9178" - } - }, - { - "c": "\"", - "t": "text.html.markdown meta.tag.block.any.html string.quoted.double.html punctuation.definition.string.end.html", - "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string.quoted.double.html: #0000FF", - "dark_vs": "string: #CE9178", - "light_vs": "string.quoted.double.html: #0000FF", - "hc_black": "string: #CE9178" - } - }, - { - "c": ">", - "t": "text.html.markdown meta.tag.block.any.html punctuation.definition.tag.end.html", - "r": { - "dark_plus": "punctuation.definition.tag: #808080", - "light_plus": "punctuation.definition.tag: #800000", - "dark_vs": "punctuation.definition.tag: #808080", - "light_vs": "punctuation.definition.tag: #800000", - "hc_black": "punctuation.definition.tag: #808080" - } - }, - { - "c": " ", - "t": "text.html.markdown", - "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" - } - }, - { - "c": "<", - "t": "text.html.markdown meta.tag.block.any.html punctuation.definition.tag.begin.html", - "r": { - "dark_plus": "punctuation.definition.tag: #808080", - "light_plus": "punctuation.definition.tag: #800000", - "dark_vs": "punctuation.definition.tag: #808080", - "light_vs": "punctuation.definition.tag: #800000", - "hc_black": "punctuation.definition.tag: #808080" - } - }, - { - "c": "div", - "t": "text.html.markdown meta.tag.block.any.html entity.name.tag.block.any.html", - "r": { - "dark_plus": "entity.name.tag: #569CD6", - "light_plus": "entity.name.tag: #800000", - "dark_vs": "entity.name.tag: #569CD6", - "light_vs": "entity.name.tag: #800000", - "hc_black": "entity.name.tag: #569CD6" - } - }, - { - "c": ">", - "t": "text.html.markdown meta.tag.block.any.html punctuation.definition.tag.end.html", - "r": { - "dark_plus": "punctuation.definition.tag: #808080", - "light_plus": "punctuation.definition.tag: #800000", - "dark_vs": "punctuation.definition.tag: #808080", - "light_vs": "punctuation.definition.tag: #800000", - "hc_black": "punctuation.definition.tag: #808080" - } - }, { "c": " nested div", - "t": "text.html.markdown", + "t": "text.html.markdown meta.paragraph.markdown", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, { - "c": " ", - "t": "text.html.markdown", + "c": "
", + "t": "text.html.markdown meta.paragraph.markdown", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, { - "c": "", + "t": "text.html.markdown meta.paragraph.markdown", "r": { - "dark_plus": "punctuation.definition.tag: #808080", - "light_plus": "punctuation.definition.tag: #800000", - "dark_vs": "punctuation.definition.tag: #808080", - "light_vs": "punctuation.definition.tag: #800000", - "hc_black": "punctuation.definition.tag: #808080" - } - }, - { - "c": "div", - "t": "text.html.markdown meta.tag.block.any.html entity.name.tag.block.any.html", - "r": { - "dark_plus": "entity.name.tag: #569CD6", - "light_plus": "entity.name.tag: #800000", - "dark_vs": "entity.name.tag: #569CD6", - "light_vs": "entity.name.tag: #800000", - "hc_black": "entity.name.tag: #569CD6" - } - }, - { - "c": ">", - "t": "text.html.markdown meta.tag.block.any.html punctuation.definition.tag.end.html", - "r": { - "dark_plus": "punctuation.definition.tag: #808080", - "light_plus": "punctuation.definition.tag: #800000", - "dark_vs": "punctuation.definition.tag: #808080", - "light_vs": "punctuation.definition.tag: #800000", - "hc_black": "punctuation.definition.tag: #808080" - } - }, - { - "c": " ", - "t": "text.html.markdown punctuation.whitespace.embedded.leading.html", - "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, - { - "c": "<", - "t": "text.html.markdown meta.embedded.block.html meta.tag.metadata.script.html punctuation.definition.tag.begin.html", - "r": { - "dark_plus": "punctuation.definition.tag: #808080", - "light_plus": "punctuation.definition.tag: #800000", - "dark_vs": "punctuation.definition.tag: #808080", - "light_vs": "punctuation.definition.tag: #800000", - "hc_black": "punctuation.definition.tag: #808080" - } - }, - { - "c": "script", - "t": "text.html.markdown meta.embedded.block.html meta.tag.metadata.script.html entity.name.tag.html", - "r": { - "dark_plus": "entity.name.tag: #569CD6", - "light_plus": "entity.name.tag: #800000", - "dark_vs": "entity.name.tag: #569CD6", - "light_vs": "entity.name.tag: #800000", - "hc_black": "entity.name.tag: #569CD6" - } - }, - { - "c": " ", - "t": "text.html.markdown meta.embedded.block.html meta.tag.metadata.script.html", - "r": { - "dark_plus": "meta.embedded: #D4D4D4", - "light_plus": "meta.embedded: #000000", - "dark_vs": "meta.embedded: #D4D4D4", - "light_vs": "meta.embedded: #000000", - "hc_black": "meta.embedded: #FFFFFF" - } - }, - { - "c": "type", - "t": "text.html.markdown meta.embedded.block.html meta.tag.metadata.script.html entity.other.attribute-name.html", - "r": { - "dark_plus": "entity.other.attribute-name: #9CDCFE", - "light_plus": "entity.other.attribute-name: #FF0000", - "dark_vs": "entity.other.attribute-name: #9CDCFE", - "light_vs": "entity.other.attribute-name: #FF0000", - "hc_black": "entity.other.attribute-name: #9CDCFE" - } - }, - { - "c": "=", - "t": "text.html.markdown meta.embedded.block.html meta.tag.metadata.script.html", - "r": { - "dark_plus": "meta.embedded: #D4D4D4", - "light_plus": "meta.embedded: #000000", - "dark_vs": "meta.embedded: #D4D4D4", - "light_vs": "meta.embedded: #000000", - "hc_black": "meta.embedded: #FFFFFF" - } - }, - { - "c": "'", - "t": "text.html.markdown meta.embedded.block.html meta.tag.metadata.script.html string.quoted.single.html punctuation.definition.string.begin.html", - "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string.quoted.single.html: #0000FF", - "dark_vs": "string: #CE9178", - "light_vs": "string.quoted.single.html: #0000FF", - "hc_black": "string: #CE9178" - } - }, - { - "c": "text/x-koka", - "t": "text.html.markdown meta.embedded.block.html meta.tag.metadata.script.html string.quoted.single.html", - "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string.quoted.single.html: #0000FF", - "dark_vs": "string: #CE9178", - "light_vs": "string.quoted.single.html: #0000FF", - "hc_black": "string: #CE9178" - } - }, - { - "c": "'", - "t": "text.html.markdown meta.embedded.block.html meta.tag.metadata.script.html string.quoted.single.html punctuation.definition.string.end.html", - "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string.quoted.single.html: #0000FF", - "dark_vs": "string: #CE9178", - "light_vs": "string.quoted.single.html: #0000FF", - "hc_black": "string: #CE9178" - } - }, - { - "c": ">", - "t": "text.html.markdown meta.embedded.block.html meta.tag.metadata.script.html punctuation.definition.tag.end.html", - "r": { - "dark_plus": "punctuation.definition.tag: #808080", - "light_plus": "punctuation.definition.tag: #800000", - "dark_vs": "punctuation.definition.tag: #808080", - "light_vs": "punctuation.definition.tag: #800000", - "hc_black": "punctuation.definition.tag: #808080" - } - }, { "c": " function( x: int ) { return x*x; }", - "t": "text.html.markdown meta.embedded.block.html source.unknown", + "t": "text.html.markdown meta.paragraph.markdown", "r": { - "dark_plus": "meta.embedded: #D4D4D4", - "light_plus": "meta.embedded: #000000", - "dark_vs": "meta.embedded: #D4D4D4", - "light_vs": "meta.embedded: #000000", - "hc_black": "meta.embedded: #FFFFFF" + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "default: #FFFFFF" } }, { - "c": " ", - "t": "text.html.markdown meta.embedded.block.html source.unknown", + "c": " ", + "t": "text.html.markdown meta.paragraph.markdown", "r": { - "dark_plus": "meta.embedded: #D4D4D4", - "light_plus": "meta.embedded: #000000", - "dark_vs": "meta.embedded: #D4D4D4", - "light_vs": "meta.embedded: #000000", - "hc_black": "meta.embedded: #FFFFFF" + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "default: #FFFFFF" } }, { - "c": "", - "t": "text.html.markdown meta.embedded.block.html meta.tag.metadata.script.html punctuation.definition.tag.end.html", + "c": "with", + "t": "text.html.markdown meta.paragraph.markdown markup.italic.markdown", "r": { - "dark_plus": "punctuation.definition.tag: #808080", - "light_plus": "punctuation.definition.tag: #800000", - "dark_vs": "punctuation.definition.tag: #808080", - "light_vs": "punctuation.definition.tag: #800000", - "hc_black": "punctuation.definition.tag: #808080" + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "default: #FFFFFF" } }, { - "c": " This is a div _with_ underscores", - "t": "text.html.markdown", + "c": "_", + "t": "text.html.markdown meta.paragraph.markdown markup.italic.markdown punctuation.definition.italic.markdown", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "default: #FFFFFF" + } + }, + { + "c": " underscores", + "t": "text.html.markdown meta.paragraph.markdown", + "r": { + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, { "c": " and a ", - "t": "text.html.markdown", + "t": "text.html.markdown meta.paragraph.markdown", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, { "c": "&", - "t": "text.html.markdown invalid.illegal.bad-ampersand.html", + "t": "text.html.markdown meta.paragraph.markdown meta.other.valid-ampersand.markdown", "r": { - "dark_plus": "invalid: #F44747", - "light_plus": "invalid: #CD3131", - "dark_vs": "invalid: #F44747", - "light_vs": "invalid: #CD3131", - "hc_black": "invalid: #F44747" - } - }, - { - "c": " ", - "t": "text.html.markdown", - "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, { - "c": "<", - "t": "text.html.markdown meta.tag.inline.any.html punctuation.definition.tag.begin.html", + "c": " bold element.", + "t": "text.html.markdown meta.paragraph.markdown", "r": { - "dark_plus": "punctuation.definition.tag: #808080", - "light_plus": "punctuation.definition.tag: #800000", - "dark_vs": "punctuation.definition.tag: #808080", - "light_vs": "punctuation.definition.tag: #800000", - "hc_black": "punctuation.definition.tag: #808080" - } - }, - { - "c": "b", - "t": "text.html.markdown meta.tag.inline.any.html entity.name.tag.inline.any.html", - "r": { - "dark_plus": "entity.name.tag: #569CD6", - "light_plus": "entity.name.tag: #800000", - "dark_vs": "entity.name.tag: #569CD6", - "light_vs": "entity.name.tag: #800000", - "hc_black": "entity.name.tag: #569CD6" - } - }, - { - "c": " ", - "t": "text.html.markdown meta.tag.inline.any.html", - "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, { - "c": "class", - "t": "text.html.markdown meta.tag.inline.any.html entity.other.attribute-name.html", + "c": " ", + "t": "text.html.markdown meta.paragraph.markdown", "r": { - "dark_plus": "punctuation.definition.tag: #808080", - "light_plus": "punctuation.definition.tag: #800000", - "dark_vs": "punctuation.definition.tag: #808080", - "light_vs": "punctuation.definition.tag: #800000", - "hc_black": "punctuation.definition.tag: #808080" - } - }, - { - "c": "b", - "t": "text.html.markdown meta.tag.inline.any.html entity.name.tag.inline.any.html", - "r": { - "dark_plus": "entity.name.tag: #569CD6", - "light_plus": "entity.name.tag: #800000", - "dark_vs": "entity.name.tag: #569CD6", - "light_vs": "entity.name.tag: #800000", - "hc_black": "entity.name.tag: #569CD6" - } - }, - { - "c": ">", - "t": "text.html.markdown meta.tag.inline.any.html punctuation.definition.tag.end.html", - "r": { - "dark_plus": "punctuation.definition.tag: #808080", - "light_plus": "punctuation.definition.tag: #800000", - "dark_vs": "punctuation.definition.tag: #808080", - "light_vs": "punctuation.definition.tag: #800000", - "hc_black": "punctuation.definition.tag: #808080" - } - }, - { - "c": " element.", - "t": "text.html.markdown", - "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, { - "c": " ", - "t": "text.html.markdown punctuation.whitespace.embedded.leading.html", + "c": "
", + "t": "text.html.markdown meta.paragraph.markdown", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, - { - "c": "<", - "t": "text.html.markdown meta.embedded.block.html meta.tag.metadata.style.html punctuation.definition.tag.begin.html", - "r": { - "dark_plus": "punctuation.definition.tag: #808080", - "light_plus": "punctuation.definition.tag: #800000", - "dark_vs": "punctuation.definition.tag: #808080", - "light_vs": "punctuation.definition.tag: #800000", - "hc_black": "punctuation.definition.tag: #808080" - } - }, - { - "c": "style", - "t": "text.html.markdown meta.embedded.block.html meta.tag.metadata.style.html entity.name.tag.html", - "r": { - "dark_plus": "entity.name.tag: #569CD6", - "light_plus": "entity.name.tag: #800000", - "dark_vs": "entity.name.tag: #569CD6", - "light_vs": "entity.name.tag: #800000", - "hc_black": "entity.name.tag: #569CD6" - } - }, - { - "c": ">", - "t": "text.html.markdown meta.embedded.block.html meta.tag.metadata.style.html punctuation.definition.tag.end.html", - "r": { - "dark_plus": "punctuation.definition.tag: #808080", - "light_plus": "punctuation.definition.tag: #800000", - "dark_vs": "punctuation.definition.tag: #808080", - "light_vs": "punctuation.definition.tag: #800000", - "hc_black": "punctuation.definition.tag: #808080" - } - }, - { - "c": " ", - "t": "text.html.markdown meta.embedded.block.html source.css", - "r": { - "dark_plus": "meta.embedded: #D4D4D4", - "light_plus": "meta.embedded: #000000", - "dark_vs": "meta.embedded: #D4D4D4", - "light_vs": "meta.embedded: #000000", - "hc_black": "meta.embedded: #FFFFFF" - } - }, - { - "c": "body", - "t": "text.html.markdown meta.embedded.block.html source.css meta.selector.css entity.name.tag.css", - "r": { - "dark_plus": "entity.name.tag.css: #D7BA7D", - "light_plus": "entity.name.tag: #800000", - "dark_vs": "entity.name.tag.css: #D7BA7D", - "light_vs": "entity.name.tag: #800000", - "hc_black": "entity.name.tag.css: #D7BA7D" - } - }, - { - "c": " ", - "t": "text.html.markdown meta.embedded.block.html source.css", - "r": { - "dark_plus": "meta.embedded: #D4D4D4", - "light_plus": "meta.embedded: #000000", - "dark_vs": "meta.embedded: #D4D4D4", - "light_vs": "meta.embedded: #000000", - "hc_black": "meta.embedded: #FFFFFF" - } - }, - { - "c": "{", - "t": "text.html.markdown meta.embedded.block.html source.css meta.property-list.css punctuation.section.property-list.begin.bracket.curly.css", - "r": { - "dark_plus": "meta.embedded: #D4D4D4", - "light_plus": "meta.embedded: #000000", - "dark_vs": "meta.embedded: #D4D4D4", - "light_vs": "meta.embedded: #000000", - "hc_black": "meta.embedded: #FFFFFF" - } - }, - { - "c": " ", - "t": "text.html.markdown meta.embedded.block.html source.css meta.property-list.css", - "r": { - "dark_plus": "meta.embedded: #D4D4D4", - "light_plus": "meta.embedded: #000000", - "dark_vs": "meta.embedded: #D4D4D4", - "light_vs": "meta.embedded: #000000", - "hc_black": "meta.embedded: #FFFFFF" - } - }, - { - "c": "font", - "t": "text.html.markdown meta.embedded.block.html source.css meta.property-list.css meta.property-name.css support.type.property-name.css", - "r": { - "dark_plus": "support.type.property-name: #9CDCFE", - "light_plus": "support.type.property-name: #FF0000", - "dark_vs": "support.type.property-name: #9CDCFE", - "light_vs": "support.type.property-name: #FF0000", - "hc_black": "support.type.property-name: #D4D4D4" - } - }, - { - "c": ":", - "t": "text.html.markdown meta.embedded.block.html source.css meta.property-list.css punctuation.separator.key-value.css", - "r": { - "dark_plus": "meta.embedded: #D4D4D4", - "light_plus": "meta.embedded: #000000", - "dark_vs": "meta.embedded: #D4D4D4", - "light_vs": "meta.embedded: #000000", - "hc_black": "meta.embedded: #FFFFFF" - } - }, - { - "c": " ", - "t": "text.html.markdown meta.embedded.block.html source.css meta.property-list.css", - "r": { - "dark_plus": "meta.embedded: #D4D4D4", - "light_plus": "meta.embedded: #000000", - "dark_vs": "meta.embedded: #D4D4D4", - "light_vs": "meta.embedded: #000000", - "hc_black": "meta.embedded: #FFFFFF" - } - }, - { - "c": "\"", - "t": "text.html.markdown meta.embedded.block.html source.css meta.property-list.css meta.property-value.css string.quoted.double.css punctuation.definition.string.begin.css", - "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string: #A31515", - "dark_vs": "string: #CE9178", - "light_vs": "string: #A31515", - "hc_black": "string: #CE9178" - } - }, - { - "c": "Consolas", - "t": "text.html.markdown meta.embedded.block.html source.css meta.property-list.css meta.property-value.css string.quoted.double.css", - "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string: #A31515", - "dark_vs": "string: #CE9178", - "light_vs": "string: #A31515", - "hc_black": "string: #CE9178" - } - }, - { - "c": "\"", - "t": "text.html.markdown meta.embedded.block.html source.css meta.property-list.css meta.property-value.css string.quoted.double.css punctuation.definition.string.end.css", - "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string: #A31515", - "dark_vs": "string: #CE9178", - "light_vs": "string: #A31515", - "hc_black": "string: #CE9178" - } - }, - { - "c": " ", - "t": "text.html.markdown meta.embedded.block.html source.css meta.property-list.css", - "r": { - "dark_plus": "meta.embedded: #D4D4D4", - "light_plus": "meta.embedded: #000000", - "dark_vs": "meta.embedded: #D4D4D4", - "light_vs": "meta.embedded: #000000", - "hc_black": "meta.embedded: #FFFFFF" - } - }, - { - "c": "}", - "t": "text.html.markdown meta.embedded.block.html source.css meta.property-list.css punctuation.section.property-list.end.bracket.curly.css", - "r": { - "dark_plus": "meta.embedded: #D4D4D4", - "light_plus": "meta.embedded: #000000", - "dark_vs": "meta.embedded: #D4D4D4", - "light_vs": "meta.embedded: #000000", - "hc_black": "meta.embedded: #FFFFFF" - } - }, - { - "c": " ", - "t": "text.html.markdown meta.embedded.block.html source.css", - "r": { - "dark_plus": "meta.embedded: #D4D4D4", - "light_plus": "meta.embedded: #000000", - "dark_vs": "meta.embedded: #D4D4D4", - "light_vs": "meta.embedded: #000000", - "hc_black": "meta.embedded: #FFFFFF" - } - }, - { - "c": "<", - "t": "text.html.markdown meta.embedded.block.html meta.tag.metadata.style.html punctuation.definition.tag.begin.html source.css", - "r": { - "dark_plus": "punctuation.definition.tag: #808080", - "light_plus": "punctuation.definition.tag: #800000", - "dark_vs": "punctuation.definition.tag: #808080", - "light_vs": "punctuation.definition.tag: #800000", - "hc_black": "punctuation.definition.tag: #808080" - } - }, - { - "c": "/", - "t": "text.html.markdown meta.embedded.block.html meta.tag.metadata.style.html punctuation.definition.tag.begin.html", - "r": { - "dark_plus": "punctuation.definition.tag: #808080", - "light_plus": "punctuation.definition.tag: #800000", - "dark_vs": "punctuation.definition.tag: #808080", - "light_vs": "punctuation.definition.tag: #800000", - "hc_black": "punctuation.definition.tag: #808080" - } - }, - { - "c": "style", - "t": "text.html.markdown meta.embedded.block.html meta.tag.metadata.style.html entity.name.tag.html", - "r": { - "dark_plus": "entity.name.tag: #569CD6", - "light_plus": "entity.name.tag: #800000", - "dark_vs": "entity.name.tag: #569CD6", - "light_vs": "entity.name.tag: #800000", - "hc_black": "entity.name.tag: #569CD6" - } - }, - { - "c": ">", - "t": "text.html.markdown meta.embedded.block.html meta.tag.metadata.style.html punctuation.definition.tag.end.html", - "r": { - "dark_plus": "punctuation.definition.tag: #808080", - "light_plus": "punctuation.definition.tag: #800000", - "dark_vs": "punctuation.definition.tag: #808080", - "light_vs": "punctuation.definition.tag: #800000", - "hc_black": "punctuation.definition.tag: #808080" - } - }, - { - "c": "", - "t": "text.html.markdown meta.tag.block.any.html punctuation.definition.tag.end.html", - "r": { - "dark_plus": "punctuation.definition.tag: #808080", - "light_plus": "punctuation.definition.tag: #800000", - "dark_vs": "punctuation.definition.tag: #808080", - "light_vs": "punctuation.definition.tag: #800000", - "hc_black": "punctuation.definition.tag: #808080" - } - }, { "c": "*", "t": "text.html.markdown markup.list.unnumbered.markdown beginning.punctuation.definition.list.markdown", "r": { - "dark_plus": "beginning.punctuation.definition.list.markdown: #6796E6", - "light_plus": "beginning.punctuation.definition.list.markdown: #0451A5", - "dark_vs": "beginning.punctuation.definition.list.markdown: #6796E6", - "light_vs": "beginning.punctuation.definition.list.markdown: #0451A5", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1246,10 +553,10 @@ "c": " ", "t": "text.html.markdown markup.list.unnumbered.markdown", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1257,10 +564,10 @@ "c": "Bullet lists are easy too", "t": "text.html.markdown markup.list.unnumbered.markdown meta.paragraph.markdown", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1268,10 +575,10 @@ "c": "-", "t": "text.html.markdown markup.list.unnumbered.markdown beginning.punctuation.definition.list.markdown", "r": { - "dark_plus": "beginning.punctuation.definition.list.markdown: #6796E6", - "light_plus": "beginning.punctuation.definition.list.markdown: #0451A5", - "dark_vs": "beginning.punctuation.definition.list.markdown: #6796E6", - "light_vs": "beginning.punctuation.definition.list.markdown: #0451A5", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1279,10 +586,10 @@ "c": " ", "t": "text.html.markdown markup.list.unnumbered.markdown", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1290,10 +597,10 @@ "c": "Another one", "t": "text.html.markdown markup.list.unnumbered.markdown meta.paragraph.markdown", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1301,10 +608,10 @@ "c": "+", "t": "text.html.markdown markup.list.unnumbered.markdown beginning.punctuation.definition.list.markdown", "r": { - "dark_plus": "beginning.punctuation.definition.list.markdown: #6796E6", - "light_plus": "beginning.punctuation.definition.list.markdown: #0451A5", - "dark_vs": "beginning.punctuation.definition.list.markdown: #6796E6", - "light_vs": "beginning.punctuation.definition.list.markdown: #0451A5", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1312,10 +619,10 @@ "c": " ", "t": "text.html.markdown markup.list.unnumbered.markdown", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1323,10 +630,10 @@ "c": "Another one", "t": "text.html.markdown markup.list.unnumbered.markdown meta.paragraph.markdown", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1334,10 +641,10 @@ "c": " ", "t": "text.html.markdown markup.list.unnumbered.markdown", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1345,10 +652,10 @@ "c": "+", "t": "text.html.markdown markup.list.unnumbered.markdown markup.list.unnumbered.markdown beginning.punctuation.definition.list.markdown", "r": { - "dark_plus": "beginning.punctuation.definition.list.markdown: #6796E6", - "light_plus": "beginning.punctuation.definition.list.markdown: #0451A5", - "dark_vs": "beginning.punctuation.definition.list.markdown: #6796E6", - "light_vs": "beginning.punctuation.definition.list.markdown: #0451A5", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1356,10 +663,10 @@ "c": " ", "t": "text.html.markdown markup.list.unnumbered.markdown markup.list.unnumbered.markdown", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1367,10 +674,10 @@ "c": "nested list", "t": "text.html.markdown markup.list.unnumbered.markdown markup.list.unnumbered.markdown meta.paragraph.markdown", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1378,10 +685,10 @@ "c": "This is a paragraph, which is text surrounded by", "t": "text.html.markdown meta.paragraph.markdown", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1389,10 +696,10 @@ "c": "whitespace. Paragraphs can be on one", "t": "text.html.markdown meta.paragraph.markdown", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1400,10 +707,10 @@ "c": "line (or many), and can drone on for hours.", "t": "text.html.markdown meta.paragraph.markdown", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1411,10 +718,10 @@ "c": "Now some inline markup like ", "t": "text.html.markdown meta.paragraph.markdown", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1422,10 +729,10 @@ "c": "_", "t": "text.html.markdown meta.paragraph.markdown markup.italic.markdown punctuation.definition.italic.markdown", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1433,10 +740,10 @@ "c": "italics", "t": "text.html.markdown meta.paragraph.markdown markup.italic.markdown", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1444,10 +751,10 @@ "c": "_", "t": "text.html.markdown meta.paragraph.markdown markup.italic.markdown punctuation.definition.italic.markdown", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1455,10 +762,10 @@ "c": ", ", "t": "text.html.markdown meta.paragraph.markdown", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1466,10 +773,10 @@ "c": "**", "t": "text.html.markdown meta.paragraph.markdown markup.bold.markdown punctuation.definition.bold.markdown", "r": { - "dark_plus": "markup.bold: #569CD6", - "light_plus": "markup.bold: #000080", - "dark_vs": "markup.bold: #569CD6", - "light_vs": "markup.bold: #000080", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1477,10 +784,10 @@ "c": "bold", "t": "text.html.markdown meta.paragraph.markdown markup.bold.markdown", "r": { - "dark_plus": "markup.bold: #569CD6", - "light_plus": "markup.bold: #000080", - "dark_vs": "markup.bold: #569CD6", - "light_vs": "markup.bold: #000080", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1488,10 +795,10 @@ "c": "**", "t": "text.html.markdown meta.paragraph.markdown markup.bold.markdown punctuation.definition.bold.markdown", "r": { - "dark_plus": "markup.bold: #569CD6", - "light_plus": "markup.bold: #000080", - "dark_vs": "markup.bold: #569CD6", - "light_vs": "markup.bold: #000080", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1499,10 +806,10 @@ "c": ",", "t": "text.html.markdown meta.paragraph.markdown", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1510,10 +817,10 @@ "c": "and ", "t": "text.html.markdown meta.paragraph.markdown", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1521,10 +828,10 @@ "c": "`", "t": "text.html.markdown meta.paragraph.markdown markup.inline.raw.string.markdown punctuation.definition.raw.markdown", "r": { - "dark_plus": "markup.inline.raw: #CE9178", - "light_plus": "markup.inline.raw: #800000", - "dark_vs": "markup.inline.raw: #CE9178", - "light_vs": "markup.inline.raw: #800000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1532,10 +839,10 @@ "c": "code()", "t": "text.html.markdown meta.paragraph.markdown markup.inline.raw.string.markdown", "r": { - "dark_plus": "markup.inline.raw: #CE9178", - "light_plus": "markup.inline.raw: #800000", - "dark_vs": "markup.inline.raw: #CE9178", - "light_vs": "markup.inline.raw: #800000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1543,10 +850,10 @@ "c": "`", "t": "text.html.markdown meta.paragraph.markdown markup.inline.raw.string.markdown punctuation.definition.raw.markdown", "r": { - "dark_plus": "markup.inline.raw: #CE9178", - "light_plus": "markup.inline.raw: #800000", - "dark_vs": "markup.inline.raw: #CE9178", - "light_vs": "markup.inline.raw: #800000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1554,10 +861,10 @@ "c": ". Note that underscores", "t": "text.html.markdown meta.paragraph.markdown", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1565,10 +872,10 @@ "c": "in_words_are ignored.", "t": "text.html.markdown meta.paragraph.markdown", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1576,10 +883,10 @@ "c": "````", "t": "text.html.markdown markup.fenced_code.block.markdown punctuation.definition.markdown", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1587,10 +894,10 @@ "c": "application/json", "t": "text.html.markdown markup.fenced_code.block.markdown fenced_code.block.language", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1598,10 +905,10 @@ "c": " { value: [\"or with a mime type\"] }", "t": "text.html.markdown markup.fenced_code.block.markdown", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1609,10 +916,10 @@ "c": "````", "t": "text.html.markdown markup.fenced_code.block.markdown punctuation.definition.markdown", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1620,10 +927,10 @@ "c": ">", "t": "text.html.markdown markup.quote.markdown beginning.punctuation.definition.quote.markdown", "r": { - "dark_plus": "beginning.punctuation.definition.quote.markdown: #608B4E", - "light_plus": "beginning.punctuation.definition.quote.markdown: #0451A5", - "dark_vs": "beginning.punctuation.definition.quote.markdown: #608B4E", - "light_vs": "beginning.punctuation.definition.quote.markdown: #0451A5", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1631,10 +938,10 @@ "c": " ", "t": "text.html.markdown markup.quote.markdown", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1642,10 +949,10 @@ "c": "Blockquotes are like quoted text in email replies", "t": "text.html.markdown markup.quote.markdown meta.paragraph.markdown", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1653,10 +960,10 @@ "c": ">", "t": "text.html.markdown markup.quote.markdown beginning.punctuation.definition.quote.markdown", "r": { - "dark_plus": "beginning.punctuation.definition.quote.markdown: #608B4E", - "light_plus": "beginning.punctuation.definition.quote.markdown: #0451A5", - "dark_vs": "beginning.punctuation.definition.quote.markdown: #608B4E", - "light_vs": "beginning.punctuation.definition.quote.markdown: #0451A5", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1664,10 +971,10 @@ "c": ">", "t": "text.html.markdown markup.quote.markdown markup.quote.markdown beginning.punctuation.definition.quote.markdown", "r": { - "dark_plus": "beginning.punctuation.definition.quote.markdown: #608B4E", - "light_plus": "beginning.punctuation.definition.quote.markdown: #0451A5", - "dark_vs": "beginning.punctuation.definition.quote.markdown: #608B4E", - "light_vs": "beginning.punctuation.definition.quote.markdown: #0451A5", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1675,10 +982,10 @@ "c": " ", "t": "text.html.markdown markup.quote.markdown markup.quote.markdown", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1686,10 +993,10 @@ "c": "And, they can be nested", "t": "text.html.markdown markup.quote.markdown markup.quote.markdown meta.paragraph.markdown", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1697,10 +1004,10 @@ "c": "1.", "t": "text.html.markdown markup.list.numbered.markdown beginning.punctuation.definition.list.markdown", "r": { - "dark_plus": "beginning.punctuation.definition.list.markdown: #6796E6", - "light_plus": "beginning.punctuation.definition.list.markdown: #0451A5", - "dark_vs": "beginning.punctuation.definition.list.markdown: #6796E6", - "light_vs": "beginning.punctuation.definition.list.markdown: #0451A5", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1708,10 +1015,10 @@ "c": " ", "t": "text.html.markdown markup.list.numbered.markdown", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1719,10 +1026,10 @@ "c": "A numbered list", "t": "text.html.markdown markup.list.numbered.markdown meta.paragraph.markdown", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1730,10 +1037,10 @@ "c": " ", "t": "text.html.markdown markup.list.numbered.markdown", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1741,10 +1048,10 @@ "c": ">", "t": "text.html.markdown markup.list.numbered.markdown markup.quote.markdown beginning.punctuation.definition.quote.markdown", "r": { - "dark_plus": "beginning.punctuation.definition.quote.markdown: #608B4E", - "light_plus": "beginning.punctuation.definition.quote.markdown: #0451A5", - "dark_vs": "beginning.punctuation.definition.quote.markdown: #608B4E", - "light_vs": "beginning.punctuation.definition.quote.markdown: #0451A5", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1752,10 +1059,10 @@ "c": " ", "t": "text.html.markdown markup.list.numbered.markdown markup.quote.markdown", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1763,10 +1070,10 @@ "c": "Block quotes in list", "t": "text.html.markdown markup.list.numbered.markdown markup.quote.markdown meta.paragraph.markdown", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1774,10 +1081,10 @@ "c": "2.", "t": "text.html.markdown markup.list.numbered.markdown beginning.punctuation.definition.list.markdown", "r": { - "dark_plus": "beginning.punctuation.definition.list.markdown: #6796E6", - "light_plus": "beginning.punctuation.definition.list.markdown: #0451A5", - "dark_vs": "beginning.punctuation.definition.list.markdown: #6796E6", - "light_vs": "beginning.punctuation.definition.list.markdown: #0451A5", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1785,10 +1092,10 @@ "c": " ", "t": "text.html.markdown markup.list.numbered.markdown", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1796,10 +1103,10 @@ "c": "Which is numbered", "t": "text.html.markdown markup.list.numbered.markdown meta.paragraph.markdown", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1807,10 +1114,10 @@ "c": "3.", "t": "text.html.markdown markup.list.numbered.markdown beginning.punctuation.definition.list.markdown", "r": { - "dark_plus": "beginning.punctuation.definition.list.markdown: #6796E6", - "light_plus": "beginning.punctuation.definition.list.markdown: #0451A5", - "dark_vs": "beginning.punctuation.definition.list.markdown: #6796E6", - "light_vs": "beginning.punctuation.definition.list.markdown: #0451A5", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1818,10 +1125,10 @@ "c": " ", "t": "text.html.markdown markup.list.numbered.markdown", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1829,10 +1136,10 @@ "c": "With periods and a space", "t": "text.html.markdown markup.list.numbered.markdown meta.paragraph.markdown", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1840,10 +1147,10 @@ "c": "And now some code:", "t": "text.html.markdown meta.paragraph.markdown", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1851,10 +1158,10 @@ "c": " // Code is just text indented a bit", "t": "text.html.markdown markup.raw.block.markdown", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1862,10 +1169,10 @@ "c": " which(is_easy) to_remember();", "t": "text.html.markdown markup.raw.block.markdown", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1873,10 +1180,10 @@ "c": "And a block", "t": "text.html.markdown meta.paragraph.markdown", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1884,10 +1191,10 @@ "c": "~~~", "t": "text.html.markdown markup.fenced_code.block.markdown punctuation.definition.markdown", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1895,10 +1202,10 @@ "c": "// Markdown extra adds un-indented code blocks too", "t": "text.html.markdown markup.fenced_code.block.markdown", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1906,10 +1213,10 @@ "c": "if (this_is_more_code == true && !indented) {", "t": "text.html.markdown markup.fenced_code.block.markdown", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1917,10 +1224,10 @@ "c": " // tild wrapped code blocks, also not indented", "t": "text.html.markdown markup.fenced_code.block.markdown", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1928,10 +1235,10 @@ "c": "}", "t": "text.html.markdown markup.fenced_code.block.markdown", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1939,10 +1246,10 @@ "c": "~~~", "t": "text.html.markdown markup.fenced_code.block.markdown punctuation.definition.markdown", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1950,10 +1257,10 @@ "c": "Text with", "t": "text.html.markdown meta.paragraph.markdown", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1961,10 +1268,10 @@ "c": "two trailing spaces", "t": "text.html.markdown meta.paragraph.markdown", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1972,10 +1279,10 @@ "c": "(on the right)", "t": "text.html.markdown meta.paragraph.markdown", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1983,10 +1290,10 @@ "c": "can be used", "t": "text.html.markdown meta.paragraph.markdown", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1994,10 +1301,10 @@ "c": "for things like poems", "t": "text.html.markdown meta.paragraph.markdown", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -2005,10 +1312,10 @@ "c": "###", "t": "text.html.markdown markup.heading.markdown heading.3.markdown punctuation.definition.heading.markdown", "r": { - "dark_plus": "markup.heading: #569CD6", - "light_plus": "markup.heading: #800000", - "dark_vs": "markup.heading: #569CD6", - "light_vs": "markup.heading: #800000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "markup.heading: #6796E6" } }, @@ -2016,10 +1323,10 @@ "c": " ", "t": "text.html.markdown markup.heading.markdown heading.3.markdown", "r": { - "dark_plus": "markup.heading: #569CD6", - "light_plus": "markup.heading: #800000", - "dark_vs": "markup.heading: #569CD6", - "light_vs": "markup.heading: #800000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "markup.heading: #6796E6" } }, @@ -2027,10 +1334,10 @@ "c": "Horizontal rules", "t": "text.html.markdown markup.heading.markdown heading.3.markdown entity.name.section.markdown", "r": { - "dark_plus": "markup.heading: #569CD6", - "light_plus": "markup.heading: #800000", - "dark_vs": "markup.heading: #569CD6", - "light_vs": "markup.heading: #800000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "markup.heading: #6796E6" } }, @@ -2038,10 +1345,10 @@ "c": "* * * *", "t": "text.html.markdown meta.separator.markdown", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -2049,10 +1356,10 @@ "c": "****", "t": "text.html.markdown meta.separator.markdown", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -2060,10 +1367,10 @@ "c": "--------------------------", "t": "text.html.markdown meta.separator.markdown", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -2071,10 +1378,10 @@ "c": "![", "t": "text.html.markdown meta.paragraph.markdown meta.image.inline.markdown punctuation.definition.string.begin.markdown", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -2082,10 +1389,10 @@ "c": "picture alt", "t": "text.html.markdown meta.paragraph.markdown meta.image.inline.markdown string.other.link.description.markdown", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string: #A31515", - "dark_vs": "string: #CE9178", - "light_vs": "string: #A31515", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -2093,10 +1400,10 @@ "c": "]", "t": "text.html.markdown meta.paragraph.markdown meta.image.inline.markdown punctuation.definition.string.end.markdown", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -2104,10 +1411,10 @@ "c": "(", "t": "text.html.markdown meta.paragraph.markdown meta.image.inline.markdown punctuation.definition.metadata.markdown", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -2115,10 +1422,10 @@ "c": "/images/photo.jpeg", "t": "text.html.markdown meta.paragraph.markdown meta.image.inline.markdown markup.underline.link.image.markdown", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -2126,10 +1433,10 @@ "c": " ", "t": "text.html.markdown meta.paragraph.markdown meta.image.inline.markdown", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -2137,10 +1444,10 @@ "c": "\"", "t": "text.html.markdown meta.paragraph.markdown meta.image.inline.markdown string.other.link.description.title.markdown punctuation.definition.string.markdown", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string: #A31515", - "dark_vs": "string: #CE9178", - "light_vs": "string: #A31515", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -2148,10 +1455,10 @@ "c": "Title is optional", "t": "text.html.markdown meta.paragraph.markdown meta.image.inline.markdown string.other.link.description.title.markdown", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string: #A31515", - "dark_vs": "string: #CE9178", - "light_vs": "string: #A31515", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -2159,10 +1466,10 @@ "c": "\"", "t": "text.html.markdown meta.paragraph.markdown meta.image.inline.markdown string.other.link.description.title.markdown punctuation.definition.string.markdown", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string: #A31515", - "dark_vs": "string: #CE9178", - "light_vs": "string: #A31515", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -2170,10 +1477,10 @@ "c": ")", "t": "text.html.markdown meta.paragraph.markdown meta.image.inline.markdown punctuation.definition.metadata.markdown", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -2181,10 +1488,10 @@ "c": "##", "t": "text.html.markdown markup.heading.markdown heading.2.markdown punctuation.definition.heading.markdown", "r": { - "dark_plus": "markup.heading: #569CD6", - "light_plus": "markup.heading: #800000", - "dark_vs": "markup.heading: #569CD6", - "light_vs": "markup.heading: #800000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "markup.heading: #6796E6" } }, @@ -2192,10 +1499,10 @@ "c": " ", "t": "text.html.markdown markup.heading.markdown heading.2.markdown", "r": { - "dark_plus": "markup.heading: #569CD6", - "light_plus": "markup.heading: #800000", - "dark_vs": "markup.heading: #569CD6", - "light_vs": "markup.heading: #800000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "markup.heading: #6796E6" } }, @@ -2203,10 +1510,10 @@ "c": "Markdown plus tables", "t": "text.html.markdown markup.heading.markdown heading.2.markdown entity.name.section.markdown", "r": { - "dark_plus": "markup.heading: #569CD6", - "light_plus": "markup.heading: #800000", - "dark_vs": "markup.heading: #569CD6", - "light_vs": "markup.heading: #800000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "markup.heading: #6796E6" } }, @@ -2214,10 +1521,10 @@ "c": " ##", "t": "text.html.markdown markup.heading.markdown heading.2.markdown punctuation.definition.heading.markdown", "r": { - "dark_plus": "markup.heading: #569CD6", - "light_plus": "markup.heading: #800000", - "dark_vs": "markup.heading: #569CD6", - "light_vs": "markup.heading: #800000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "markup.heading: #6796E6" } }, @@ -2225,10 +1532,10 @@ "c": "| Header | Header | Right |", "t": "text.html.markdown meta.paragraph.markdown", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -2236,10 +1543,10 @@ "c": "| ------ | ------ | -----: |", "t": "text.html.markdown meta.paragraph.markdown", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -2247,10 +1554,10 @@ "c": "| Cell | Cell | $10 |", "t": "text.html.markdown meta.paragraph.markdown", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -2258,10 +1565,10 @@ "c": "| Cell | Cell | $20 |", "t": "text.html.markdown meta.paragraph.markdown", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -2269,10 +1576,10 @@ "c": "*", "t": "text.html.markdown markup.list.unnumbered.markdown beginning.punctuation.definition.list.markdown", "r": { - "dark_plus": "beginning.punctuation.definition.list.markdown: #6796E6", - "light_plus": "beginning.punctuation.definition.list.markdown: #0451A5", - "dark_vs": "beginning.punctuation.definition.list.markdown: #6796E6", - "light_vs": "beginning.punctuation.definition.list.markdown: #0451A5", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -2280,10 +1587,10 @@ "c": " ", "t": "text.html.markdown markup.list.unnumbered.markdown", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -2291,10 +1598,10 @@ "c": "Outer pipes on tables are optional", "t": "text.html.markdown markup.list.unnumbered.markdown meta.paragraph.markdown", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -2302,10 +1609,10 @@ "c": "*", "t": "text.html.markdown markup.list.unnumbered.markdown beginning.punctuation.definition.list.markdown", "r": { - "dark_plus": "beginning.punctuation.definition.list.markdown: #6796E6", - "light_plus": "beginning.punctuation.definition.list.markdown: #0451A5", - "dark_vs": "beginning.punctuation.definition.list.markdown: #6796E6", - "light_vs": "beginning.punctuation.definition.list.markdown: #0451A5", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -2313,10 +1620,10 @@ "c": " ", "t": "text.html.markdown markup.list.unnumbered.markdown", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -2324,10 +1631,10 @@ "c": "Colon used for alignment (right versus left)", "t": "text.html.markdown markup.list.unnumbered.markdown meta.paragraph.markdown", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -2335,10 +1642,10 @@ "c": "##", "t": "text.html.markdown markup.heading.markdown heading.2.markdown punctuation.definition.heading.markdown", "r": { - "dark_plus": "markup.heading: #569CD6", - "light_plus": "markup.heading: #800000", - "dark_vs": "markup.heading: #569CD6", - "light_vs": "markup.heading: #800000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "markup.heading: #6796E6" } }, @@ -2346,10 +1653,10 @@ "c": " ", "t": "text.html.markdown markup.heading.markdown heading.2.markdown", "r": { - "dark_plus": "markup.heading: #569CD6", - "light_plus": "markup.heading: #800000", - "dark_vs": "markup.heading: #569CD6", - "light_vs": "markup.heading: #800000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "markup.heading: #6796E6" } }, @@ -2357,10 +1664,10 @@ "c": "Markdown plus definition lists", "t": "text.html.markdown markup.heading.markdown heading.2.markdown entity.name.section.markdown", "r": { - "dark_plus": "markup.heading: #569CD6", - "light_plus": "markup.heading: #800000", - "dark_vs": "markup.heading: #569CD6", - "light_vs": "markup.heading: #800000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "markup.heading: #6796E6" } }, @@ -2368,10 +1675,10 @@ "c": " ##", "t": "text.html.markdown markup.heading.markdown heading.2.markdown punctuation.definition.heading.markdown", "r": { - "dark_plus": "markup.heading: #569CD6", - "light_plus": "markup.heading: #800000", - "dark_vs": "markup.heading: #569CD6", - "light_vs": "markup.heading: #800000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "markup.heading: #6796E6" } }, @@ -2379,10 +1686,10 @@ "c": "Bottled water", "t": "text.html.markdown meta.paragraph.markdown", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -2390,10 +1697,10 @@ "c": ": $ 1.25", "t": "text.html.markdown meta.paragraph.markdown", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -2401,10 +1708,10 @@ "c": ": $ 1.55 (Large)", "t": "text.html.markdown meta.paragraph.markdown", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -2412,10 +1719,10 @@ "c": "Milk", "t": "text.html.markdown meta.paragraph.markdown", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -2423,10 +1730,10 @@ "c": "Pop", "t": "text.html.markdown meta.paragraph.markdown", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -2434,10 +1741,10 @@ "c": ": $ 1.75", "t": "text.html.markdown meta.paragraph.markdown", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -2445,10 +1752,10 @@ "c": "*", "t": "text.html.markdown markup.list.unnumbered.markdown beginning.punctuation.definition.list.markdown", "r": { - "dark_plus": "beginning.punctuation.definition.list.markdown: #6796E6", - "light_plus": "beginning.punctuation.definition.list.markdown: #0451A5", - "dark_vs": "beginning.punctuation.definition.list.markdown: #6796E6", - "light_vs": "beginning.punctuation.definition.list.markdown: #0451A5", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -2456,10 +1763,10 @@ "c": " ", "t": "text.html.markdown markup.list.unnumbered.markdown", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -2467,10 +1774,10 @@ "c": "Multiple definitions and terms are possible", "t": "text.html.markdown markup.list.unnumbered.markdown meta.paragraph.markdown", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -2478,10 +1785,10 @@ "c": "*", "t": "text.html.markdown markup.list.unnumbered.markdown beginning.punctuation.definition.list.markdown", "r": { - "dark_plus": "beginning.punctuation.definition.list.markdown: #6796E6", - "light_plus": "beginning.punctuation.definition.list.markdown: #0451A5", - "dark_vs": "beginning.punctuation.definition.list.markdown: #6796E6", - "light_vs": "beginning.punctuation.definition.list.markdown: #0451A5", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -2489,10 +1796,10 @@ "c": " ", "t": "text.html.markdown markup.list.unnumbered.markdown", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -2500,65 +1807,21 @@ "c": "Definitions can include multiple paragraphs too", "t": "text.html.markdown markup.list.unnumbered.markdown meta.paragraph.markdown", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, { - "c": "*[ABBR]: Markdown plus abbreviations (produces an ", + "c": "*[ABBR]: Markdown plus abbreviations (produces an tag)", "t": "text.html.markdown meta.paragraph.markdown", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" - } - }, - { - "c": "<", - "t": "text.html.markdown meta.paragraph.markdown meta.tag.inline.any.html punctuation.definition.tag.begin.html", - "r": { - "dark_plus": "punctuation.definition.tag: #808080", - "light_plus": "punctuation.definition.tag: #800000", - "dark_vs": "punctuation.definition.tag: #808080", - "light_vs": "punctuation.definition.tag: #800000", - "hc_black": "punctuation.definition.tag: #808080" - } - }, - { - "c": "abbr", - "t": "text.html.markdown meta.paragraph.markdown meta.tag.inline.any.html entity.name.tag.inline.any.html", - "r": { - "dark_plus": "entity.name.tag: #569CD6", - "light_plus": "entity.name.tag: #800000", - "dark_vs": "entity.name.tag: #569CD6", - "light_vs": "entity.name.tag: #800000", - "hc_black": "entity.name.tag: #569CD6" - } - }, - { - "c": ">", - "t": "text.html.markdown meta.paragraph.markdown meta.tag.inline.any.html punctuation.definition.tag.end.html", - "r": { - "dark_plus": "punctuation.definition.tag: #808080", - "light_plus": "punctuation.definition.tag: #800000", - "dark_vs": "punctuation.definition.tag: #808080", - "light_vs": "punctuation.definition.tag: #800000", - "hc_black": "punctuation.definition.tag: #808080" - } - }, - { - "c": " tag)", - "t": "text.html.markdown meta.paragraph.markdown", - "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } } diff --git a/extensions/markdown-basics/yarn.lock b/extensions/markdown-basics/yarn.lock deleted file mode 100644 index fb57ccd13a..0000000000 --- a/extensions/markdown-basics/yarn.lock +++ /dev/null @@ -1,4 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - diff --git a/extensions/markdown-language-features/README.md b/extensions/markdown-language-features/README.md new file mode 100644 index 0000000000..e80e9e886b --- /dev/null +++ b/extensions/markdown-language-features/README.md @@ -0,0 +1,7 @@ +# Language Features for Markdown files + +**Notice:** This extension is bundled with Visual Studio Code. It can be disabled but not uninstalled. + +## Features + +See [Markdown in Visual Studio Code](https://code.visualstudio.com/docs/languages/markdown) to learn about the features of this extension. \ No newline at end of file diff --git a/extensions/markdown-language-features/media/Preview.svg b/extensions/markdown-language-features/media/Preview.svg index c60599eda4..860ba09394 100644 --- a/extensions/markdown-language-features/media/Preview.svg +++ b/extensions/markdown-language-features/media/Preview.svg @@ -1 +1 @@ - \ No newline at end of file +SwitchToPreview_16x \ No newline at end of file diff --git a/extensions/markdown-language-features/media/PreviewOnRightPane_16x.svg b/extensions/markdown-language-features/media/PreviewOnRightPane_16x.svg index eefaadfcc7..5433796f50 100644 --- a/extensions/markdown-language-features/media/PreviewOnRightPane_16x.svg +++ b/extensions/markdown-language-features/media/PreviewOnRightPane_16x.svg @@ -1,19 +1 @@ - - - - - - - - - - - - - - +PreviewInRightPanel_16x diff --git a/extensions/markdown-language-features/media/PreviewOnRightPane_16x_dark.svg b/extensions/markdown-language-features/media/PreviewOnRightPane_16x_dark.svg index c18634bbaf..390b2658bb 100644 --- a/extensions/markdown-language-features/media/PreviewOnRightPane_16x_dark.svg +++ b/extensions/markdown-language-features/media/PreviewOnRightPane_16x_dark.svg @@ -1,19 +1 @@ - - - - - - - - - - - - - - +PreviewInRightPanel_16x \ No newline at end of file diff --git a/extensions/markdown-language-features/media/Preview_inverse.svg b/extensions/markdown-language-features/media/Preview_inverse.svg index 87700309c0..e61e16690a 100644 --- a/extensions/markdown-language-features/media/Preview_inverse.svg +++ b/extensions/markdown-language-features/media/Preview_inverse.svg @@ -1 +1 @@ - \ No newline at end of file +SwitchToPreview_16x diff --git a/extensions/markdown-language-features/media/highlight.css b/extensions/markdown-language-features/media/highlight.css new file mode 100644 index 0000000000..3b748b1c4f --- /dev/null +++ b/extensions/markdown-language-features/media/highlight.css @@ -0,0 +1,182 @@ +/* +https://raw.githubusercontent.com/isagalaev/highlight.js/master/src/styles/vs2015.css +*/ +/* + * Visual Studio 2015 dark style + * Author: Nicolas LLOBERA + */ + + +.hljs-keyword, +.hljs-literal, +.hljs-symbol, +.hljs-name { + color: #569CD6; +} +.hljs-link { + color: #569CD6; + text-decoration: underline; +} + +.hljs-built_in, +.hljs-type { + color: #4EC9B0; +} + +.hljs-number, +.hljs-class { + color: #B8D7A3; +} + +.hljs-string, +.hljs-meta-string { + color: #D69D85; +} + +.hljs-regexp, +.hljs-template-tag { + color: #9A5334; +} + +.hljs-subst, +.hljs-function, +.hljs-title, +.hljs-params, +.hljs-formula { + color: #DCDCDC; +} + +.hljs-comment, +.hljs-quote { + color: #57A64A; + font-style: italic; +} + +.hljs-doctag { + color: #608B4E; +} + +.hljs-meta, +.hljs-meta-keyword, +.hljs-tag { + color: #9B9B9B; +} + +.hljs-variable, +.hljs-template-variable { + color: #BD63C5; +} + +.hljs-attr, +.hljs-attribute, +.hljs-builtin-name { + color: #9CDCFE; +} + +.hljs-section { + color: gold; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} + +/*.hljs-code { + font-family:'Monospace'; +}*/ + +.hljs-bullet, +.hljs-selector-tag, +.hljs-selector-id, +.hljs-selector-class, +.hljs-selector-attr, +.hljs-selector-pseudo { + color: #D7BA7D; +} + +.hljs-addition { + background-color: #144212; + display: inline-block; + width: 100%; +} + +.hljs-deletion { + background-color: #600; + display: inline-block; + width: 100%; +} + + +/* +From https://raw.githubusercontent.com/isagalaev/highlight.js/master/src/styles/vs.css +*/ +/* + +Visual Studio-like style based on original C# coloring by Jason Diamond + +*/ + +.vscode-light .hljs-function, +.vscode-light .hljs-params { + color: inherit; +} + +.vscode-light .hljs-comment, +.vscode-light .hljs-quote, +.vscode-light .hljs-variable { + color: #008000; +} + +.vscode-light .hljs-keyword, +.vscode-light .hljs-selector-tag, +.vscode-light .hljs-built_in, +.vscode-light .hljs-name, +.vscode-light .hljs-tag { + color: #00f; +} + +.vscode-light .hljs-string, +.vscode-light .hljs-title, +.vscode-light .hljs-section, +.vscode-light .hljs-attribute, +.vscode-light .hljs-literal, +.vscode-light .hljs-template-tag, +.vscode-light .hljs-template-variable, +.vscode-light .hljs-type, +.vscode-light .hljs-addition { + color: #a31515; +} + +.vscode-light .hljs-deletion, +.vscode-light .hljs-selector-attr, +.vscode-light .hljs-selector-pseudo, +.vscode-light .hljs-meta { + color: #2b91af; +} + +.vscode-light .hljs-doctag { + color: #808080; +} + +.vscode-light .hljs-attr { + color: #f00; +} + +.vscode-light .hljs-symbol, +.vscode-light .hljs-bullet, +.vscode-light .hljs-link { + color: #00b0e8; +} + + +.vscode-light .hljs-emphasis { + font-style: italic; +} + +.vscode-light .hljs-strong { + font-weight: bold; +} \ No newline at end of file diff --git a/extensions/markdown-language-features/media/index.js b/extensions/markdown-language-features/media/index.js index 1b0c48d596..0fd0f1212b 100644 --- a/extensions/markdown-language-features/media/index.js +++ b/extensions/markdown-language-features/media/index.js @@ -82,7 +82,7 @@ * lodash (Custom Build) * Build: `lodash modularize exports="npm" -o ./` * Copyright jQuery Foundation and other contributors - * Released under MIT license + * Released under Source EULA * Based on Underscore.js 1.8.3 * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors */ @@ -565,7 +565,7 @@ module.exports = g; Object.defineProperty(exports, "__esModule", { value: true }); /*--------------------------------------------------------------------------------------------- * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. + * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ const scroll_sync_1 = __webpack_require__(/*! ./scroll-sync */ "./preview-src/scroll-sync.ts"); class ActiveLineMarker { @@ -607,7 +607,7 @@ exports.ActiveLineMarker = ActiveLineMarker; /*--------------------------------------------------------------------------------------------- * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. + * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ Object.defineProperty(exports, "__esModule", { value: true }); function onceDocumentLoaded(f) { @@ -634,7 +634,7 @@ exports.onceDocumentLoaded = onceDocumentLoaded; /*--------------------------------------------------------------------------------------------- * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. + * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ Object.defineProperty(exports, "__esModule", { value: true }); const activeLineMarker_1 = __webpack_require__(/*! ./activeLineMarker */ "./preview-src/activeLineMarker.ts"); @@ -647,6 +647,9 @@ var scrollDisabled = true; const marker = new activeLineMarker_1.ActiveLineMarker(); const settings = settings_1.getSettings(); const vscode = acquireVsCodeApi(); +// Set VS Code state +const state = settings_1.getData('data-state'); +vscode.setState(state); const messaging = messaging_1.createPosterForVsCode(vscode); window.cspAlerter.setPoster(messaging); window.styleLoadingMonitor.setPoster(messaging); @@ -755,7 +758,7 @@ if (settings.scrollEditorWithPreview) { /*--------------------------------------------------------------------------------------------- * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. + * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ Object.defineProperty(exports, "__esModule", { value: true }); const settings_1 = __webpack_require__(/*! ./settings */ "./preview-src/settings.ts"); @@ -788,7 +791,7 @@ exports.createPosterForVsCode = (vscode) => { /*--------------------------------------------------------------------------------------------- * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. + * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ Object.defineProperty(exports, "__esModule", { value: true }); const settings_1 = __webpack_require__(/*! ./settings */ "./preview-src/settings.ts"); @@ -916,21 +919,28 @@ exports.getEditorLineNumberForPageOffset = getEditorLineNumberForPageOffset; /*--------------------------------------------------------------------------------------------- * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. + * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ Object.defineProperty(exports, "__esModule", { value: true }); let cachedSettings = undefined; +function getData(key) { + const element = document.getElementById('vscode-markdown-preview-data'); + if (element) { + const data = element.getAttribute(key); + if (data) { + return JSON.parse(data); + } + } + throw new Error(`Could not load data for ${key}`); +} +exports.getData = getData; function getSettings() { if (cachedSettings) { return cachedSettings; } - const element = document.getElementById('vscode-markdown-preview-data'); - if (element) { - const data = element.getAttribute('data-settings'); - if (data) { - cachedSettings = JSON.parse(data); - return cachedSettings; - } + cachedSettings = getData('data-settings'); + if (cachedSettings) { + return cachedSettings; } throw new Error('Could not load settings'); } @@ -940,4 +950,4 @@ exports.getSettings = getSettings; /***/ }) /******/ }); -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC50aHJvdHRsZS9pbmRleC5qcyIsIndlYnBhY2s6Ly8vKHdlYnBhY2spL2J1aWxkaW4vZ2xvYmFsLmpzIiwid2VicGFjazovLy8uL3ByZXZpZXctc3JjL2FjdGl2ZUxpbmVNYXJrZXIudHMiLCJ3ZWJwYWNrOi8vLy4vcHJldmlldy1zcmMvZXZlbnRzLnRzIiwid2VicGFjazovLy8uL3ByZXZpZXctc3JjL2luZGV4LnRzIiwid2VicGFjazovLy8uL3ByZXZpZXctc3JjL21lc3NhZ2luZy50cyIsIndlYnBhY2s6Ly8vLi9wcmV2aWV3LXNyYy9zY3JvbGwtc3luYy50cyIsIndlYnBhY2s6Ly8vLi9wcmV2aWV3LXNyYy9zZXR0aW5ncy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQSx5REFBaUQsY0FBYztBQUMvRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxtQ0FBMkIsMEJBQTBCLEVBQUU7QUFDdkQseUNBQWlDLGVBQWU7QUFDaEQ7QUFDQTtBQUNBOztBQUVBO0FBQ0EsOERBQXNELCtEQUErRDs7QUFFckg7QUFDQTs7O0FBR0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDbkVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxPQUFPO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFNBQVM7QUFDcEIsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsT0FBTyxZQUFZO0FBQzlCLFdBQVcsUUFBUTtBQUNuQjtBQUNBLFdBQVcsT0FBTztBQUNsQjtBQUNBLFdBQVcsUUFBUTtBQUNuQjtBQUNBLGFBQWEsU0FBUztBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBLDhDQUE4QyxrQkFBa0I7QUFDaEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFNBQVM7QUFDcEIsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsT0FBTyxZQUFZO0FBQzlCLFdBQVcsUUFBUTtBQUNuQjtBQUNBLFdBQVcsUUFBUTtBQUNuQjtBQUNBLGFBQWEsU0FBUztBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtREFBbUQsb0JBQW9CO0FBQ3ZFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEVBQUU7QUFDYixhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBLGdCQUFnQjtBQUNoQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsRUFBRTtBQUNiLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0Esb0JBQW9CO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEVBQUU7QUFDYixhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxFQUFFO0FBQ2IsYUFBYSxPQUFPO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOzs7Ozs7Ozs7Ozs7O0FDdGJBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsNENBQTRDOztBQUU1Qzs7Ozs7Ozs7Ozs7Ozs7O0FDbkJBOzs7Z0dBR2dHO0FBQ2hHLCtGQUF5RDtBQUV6RDtJQUdDLDhCQUE4QixDQUFDLElBQVk7UUFDMUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxHQUFHLHNDQUF3QixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3BELElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxJQUFJLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBRUQsT0FBTyxDQUFDLE1BQStCO1FBQ3RDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDekMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2hDLElBQUksQ0FBQyxRQUFRLEdBQUcsTUFBTSxDQUFDO0lBQ3hCLENBQUM7SUFFRCxvQkFBb0IsQ0FBQyxPQUFnQztRQUNwRCxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7WUFDZCxNQUFNLENBQUM7UUFDUixDQUFDO1FBQ0QsT0FBTyxDQUFDLFNBQVMsR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyx1QkFBdUIsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUM1RSxDQUFDO0lBRUQsa0JBQWtCLENBQUMsT0FBZ0M7UUFDbEQsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1lBQ2QsTUFBTSxDQUFDO1FBQ1IsQ0FBQztRQUNELE9BQU8sQ0FBQyxTQUFTLElBQUksbUJBQW1CLENBQUM7SUFDMUMsQ0FBQztDQUNEO0FBM0JELDRDQTJCQzs7Ozs7Ozs7Ozs7Ozs7QUNqQ0Q7OztnR0FHZ0c7O0FBRWhHLDRCQUFtQyxDQUFhO0lBQy9DLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxVQUFVLEtBQUssU0FBUyxJQUFJLFFBQVEsQ0FBQyxVQUFVLEtBQUssZUFBZSxDQUFDLENBQUMsQ0FBQztRQUNsRixRQUFRLENBQUMsZ0JBQWdCLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUFDLElBQUksQ0FBQyxDQUFDO1FBQ1AsQ0FBQyxFQUFFLENBQUM7SUFDTCxDQUFDO0FBQ0YsQ0FBQztBQU5ELGdEQU1DOzs7Ozs7Ozs7Ozs7OztBQ1hEOzs7Z0dBR2dHOztBQUVoRyw4R0FBc0Q7QUFDdEQsZ0ZBQThDO0FBQzlDLHlGQUFvRDtBQUNwRCwrRkFBMkY7QUFDM0Ysc0ZBQXlDO0FBQ3pDLHVHQUE2QztBQUk3QyxJQUFJLGNBQWMsR0FBRyxJQUFJLENBQUM7QUFDMUIsTUFBTSxNQUFNLEdBQUcsSUFBSSxtQ0FBZ0IsRUFBRSxDQUFDO0FBQ3RDLE1BQU0sUUFBUSxHQUFHLHNCQUFXLEVBQUUsQ0FBQztBQUUvQixNQUFNLE1BQU0sR0FBRyxnQkFBZ0IsRUFBRSxDQUFDO0FBQ2xDLE1BQU0sU0FBUyxHQUFHLGlDQUFxQixDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBRWhELE1BQU0sQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0FBQ3ZDLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUM7QUFFaEQsMkJBQWtCLENBQUMsR0FBRyxFQUFFO0lBQ3ZCLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLENBQUM7UUFDdEMsVUFBVSxDQUFDLEdBQUcsRUFBRTtZQUNmLE1BQU0sV0FBVyxHQUFHLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQztZQUNuQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3pCLGNBQWMsR0FBRyxJQUFJLENBQUM7Z0JBQ3RCLHNDQUF3QixDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQ3ZDLENBQUM7UUFDRixDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0FBQ0YsQ0FBQyxDQUFDLENBQUM7QUFFSCxNQUFNLFlBQVksR0FBRyxDQUFDLEdBQUcsRUFBRTtJQUMxQixNQUFNLFFBQVEsR0FBRyxRQUFRLENBQUMsQ0FBQyxJQUFZLEVBQUUsRUFBRTtRQUMxQyxjQUFjLEdBQUcsSUFBSSxDQUFDO1FBQ3RCLHNDQUF3QixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2hDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUVQLE1BQU0sQ0FBQyxDQUFDLElBQVksRUFBRSxRQUFhLEVBQUUsRUFBRTtRQUN0QyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDbEIsUUFBUSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7WUFDckIsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2hCLENBQUM7SUFDRixDQUFDLENBQUM7QUFDSCxDQUFDLENBQUMsRUFBRSxDQUFDO0FBRUwsTUFBTSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsRUFBRSxHQUFHLEVBQUU7SUFDdEMsY0FBYyxHQUFHLElBQUksQ0FBQztBQUN2QixDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFFVCxNQUFNLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxFQUFFO0lBQzFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxLQUFLLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBQzNDLE1BQU0sQ0FBQztJQUNSLENBQUM7SUFFRCxNQUFNLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDekIsS0FBSyxnQ0FBZ0M7WUFDcEMsTUFBTSxDQUFDLDhCQUE4QixDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDdkQsS0FBSyxDQUFDO1FBRVAsS0FBSyxZQUFZO1lBQ2hCLFlBQVksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQztZQUN4QyxLQUFLLENBQUM7SUFDUixDQUFDO0FBQ0YsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBRVYsUUFBUSxDQUFDLGdCQUFnQixDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUMsRUFBRTtJQUM3QyxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQywyQkFBMkIsQ0FBQyxDQUFDLENBQUM7UUFDM0MsTUFBTSxDQUFDO0lBQ1IsQ0FBQztJQUVELHlCQUF5QjtJQUN6QixHQUFHLENBQUMsQ0FBQyxJQUFJLElBQUksR0FBRyxLQUFLLENBQUMsTUFBcUIsRUFBRSxJQUFJLEVBQUUsSUFBSSxHQUFHLElBQUksQ0FBQyxVQUF5QixFQUFFLENBQUM7UUFDMUYsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQzFCLE1BQU0sQ0FBQztRQUNSLENBQUM7SUFDRixDQUFDO0lBRUQsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQztJQUMzQixNQUFNLElBQUksR0FBRyw4Q0FBZ0MsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN0RCxFQUFFLENBQUMsQ0FBQyxPQUFPLElBQUksS0FBSyxRQUFRLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzlDLFNBQVMsQ0FBQyxXQUFXLENBQUMsVUFBVSxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQy9ELENBQUM7QUFDRixDQUFDLENBQUMsQ0FBQztBQUVILFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLEVBQUU7SUFDMUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ1osTUFBTSxDQUFDO0lBQ1IsQ0FBQztJQUVELElBQUksSUFBSSxHQUFRLEtBQUssQ0FBQyxNQUFNLENBQUM7SUFDN0IsT0FBTyxJQUFJLEVBQUUsQ0FBQztRQUNiLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLE9BQU8sS0FBSyxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDdkQsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUMvQyxLQUFLLENBQUM7WUFDUCxDQUFDO1lBQ0QsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ2pGLE1BQU0sQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsZ0NBQWdDLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUM1RixTQUFTLENBQUMsV0FBVyxDQUFDLDRCQUE0QixFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUMxRSxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7Z0JBQ3ZCLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztnQkFDeEIsS0FBSyxDQUFDO1lBQ1AsQ0FBQztZQUNELEtBQUssQ0FBQztRQUNQLENBQUM7UUFDRCxJQUFJLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQztJQUN4QixDQUFDO0FBQ0YsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO0FBRVQsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLHVCQUF1QixDQUFDLENBQUMsQ0FBQztJQUN0QyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxHQUFHLEVBQUU7UUFDL0MsRUFBRSxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQztZQUNwQixjQUFjLEdBQUcsS0FBSyxDQUFDO1FBQ3hCLENBQUM7UUFBQyxJQUFJLENBQUMsQ0FBQztZQUNQLE1BQU0sSUFBSSxHQUFHLDhDQUFnQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUM5RCxFQUFFLENBQUMsQ0FBQyxPQUFPLElBQUksS0FBSyxRQUFRLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUM5QyxTQUFTLENBQUMsV0FBVyxDQUFDLFlBQVksRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7WUFDL0MsQ0FBQztRQUNGLENBQUM7SUFDRixDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUNULENBQUM7Ozs7Ozs7Ozs7Ozs7O0FDNUhEOzs7Z0dBR2dHOztBQUVoRyxzRkFBeUM7QUFlNUIsNkJBQXFCLEdBQUcsQ0FBQyxNQUFXLEVBQUUsRUFBRTtJQUNwRCxNQUFNLENBQUMsSUFBSTtRQUNWLFdBQVcsQ0FBQyxJQUFZLEVBQUUsSUFBWTtZQUNyQyxNQUFNLENBQUMsV0FBVyxDQUFDO2dCQUNsQixJQUFJO2dCQUNKLE1BQU0sRUFBRSxzQkFBVyxFQUFFLENBQUMsTUFBTTtnQkFDNUIsSUFBSTthQUNKLENBQUMsQ0FBQztRQUNKLENBQUM7UUFDRCxXQUFXLENBQUMsT0FBZSxFQUFFLElBQVc7WUFDdkMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLEVBQUUsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUNoRCxDQUFDO0tBQ0QsQ0FBQztBQUNILENBQUMsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7QUNqQ0Y7OztnR0FHZ0c7O0FBRWhHLHNGQUF5QztBQUd6QyxlQUFlLEdBQVcsRUFBRSxHQUFXLEVBQUUsS0FBYTtJQUNyRCxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUM1QyxDQUFDO0FBRUQsbUJBQW1CLElBQVk7SUFDOUIsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsc0JBQVcsRUFBRSxDQUFDLFNBQVMsR0FBRyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDcEQsQ0FBQztBQVFELE1BQU0sbUJBQW1CLEdBQUcsQ0FBQyxHQUFHLEVBQUU7SUFDakMsSUFBSSxRQUEyQixDQUFDO0lBQ2hDLE1BQU0sQ0FBQyxHQUFHLEVBQUU7UUFDWCxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7WUFDZixRQUFRLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUNsQyxRQUFRLENBQUMsc0JBQXNCLENBQUMsV0FBVyxDQUFDLEVBQzVDLENBQUMsT0FBWSxFQUFFLEVBQUU7Z0JBQ2hCLE1BQU0sSUFBSSxHQUFHLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsQ0FBQztnQkFDaEQsTUFBTSxDQUFDLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDO1lBQzFCLENBQUMsQ0FBQztpQkFDRCxNQUFNLENBQUMsQ0FBQyxDQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ3RDLENBQUM7UUFDRCxNQUFNLENBQUMsUUFBUSxDQUFDO0lBQ2pCLENBQUMsQ0FBQztBQUNILENBQUMsQ0FBQyxFQUFFLENBQUM7QUFFTDs7Ozs7R0FLRztBQUNILGtDQUF5QyxVQUFrQjtJQUMxRCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQzFDLE1BQU0sS0FBSyxHQUFHLG1CQUFtQixFQUFFLENBQUM7SUFDcEMsSUFBSSxRQUFRLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQztJQUNoQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEtBQUssSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQzNCLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssVUFBVSxDQUFDLENBQUMsQ0FBQztZQUMvQixNQUFNLENBQUMsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQztRQUM3QyxDQUFDO1FBQ0QsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQztZQUNsQyxNQUFNLENBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDO1FBQ2xDLENBQUM7UUFDRCxRQUFRLEdBQUcsS0FBSyxDQUFDO0lBQ2xCLENBQUM7SUFDRCxNQUFNLENBQUMsRUFBRSxRQUFRLEVBQUUsQ0FBQztBQUNyQixDQUFDO0FBZEQsNERBY0M7QUFFRDs7R0FFRztBQUNILHFDQUE0QyxNQUFjO0lBQ3pELE1BQU0sS0FBSyxHQUFHLG1CQUFtQixFQUFFLENBQUM7SUFDcEMsTUFBTSxRQUFRLEdBQUcsTUFBTSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUM7SUFDekMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDWixJQUFJLEVBQUUsR0FBRyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztJQUMxQixPQUFPLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUM7UUFDcEIsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUN0QyxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLHFCQUFxQixFQUFFLENBQUM7UUFDMUQsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsR0FBRyxNQUFNLENBQUMsTUFBTSxJQUFJLFFBQVEsQ0FBQyxDQUFDLENBQUM7WUFDNUMsRUFBRSxHQUFHLEdBQUcsQ0FBQztRQUNWLENBQUM7UUFDRCxJQUFJLENBQUMsQ0FBQztZQUNMLEVBQUUsR0FBRyxHQUFHLENBQUM7UUFDVixDQUFDO0lBQ0YsQ0FBQztJQUNELE1BQU0sU0FBUyxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUM1QixNQUFNLFFBQVEsR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLHFCQUFxQixFQUFFLENBQUM7SUFDM0QsRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxRQUFRLENBQUMsR0FBRyxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUM7UUFDeEMsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzVCLE1BQU0sQ0FBQyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDO0lBQ2pELENBQUM7SUFDRCxNQUFNLENBQUMsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLENBQUM7QUFDaEMsQ0FBQztBQXRCRCxrRUFzQkM7QUFFRDs7R0FFRztBQUNILGtDQUF5QyxJQUFZO0lBQ3BELE1BQU0sRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLEdBQUcsd0JBQXdCLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDMUQsRUFBRSxDQUFDLENBQUMsUUFBUSxJQUFJLHNCQUFXLEVBQUUsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLENBQUM7UUFDdkQsSUFBSSxRQUFRLEdBQUcsQ0FBQyxDQUFDO1FBQ2pCLE1BQU0sSUFBSSxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUN0RCxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDO1FBQzdCLEVBQUUsQ0FBQyxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQ3pDLDhEQUE4RDtZQUM5RCxNQUFNLGVBQWUsR0FBRyxDQUFDLElBQUksR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM3RSxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLHFCQUFxQixFQUFFLENBQUMsR0FBRyxHQUFHLFdBQVcsQ0FBQztZQUM3RSxRQUFRLEdBQUcsV0FBVyxHQUFHLGVBQWUsR0FBRyxhQUFhLENBQUM7UUFDMUQsQ0FBQztRQUNELElBQUksQ0FBQyxDQUFDO1lBQ0wsUUFBUSxHQUFHLFdBQVcsQ0FBQztRQUN4QixDQUFDO1FBQ0QsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLE9BQU8sR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDO0lBQzFELENBQUM7QUFDRixDQUFDO0FBakJELDREQWlCQztBQUVELDBDQUFpRCxNQUFjO0lBQzlELE1BQU0sRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLEdBQUcsMkJBQTJCLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDL0QsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztRQUNkLE1BQU0sY0FBYyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUNoRSxNQUFNLGtCQUFrQixHQUFHLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxPQUFPLEdBQUcsY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDVixNQUFNLHVCQUF1QixHQUFHLGtCQUFrQixHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxxQkFBcUIsRUFBRSxDQUFDLEdBQUcsR0FBRyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDckgsTUFBTSxJQUFJLEdBQUcsUUFBUSxDQUFDLElBQUksR0FBRyx1QkFBdUIsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ25GLE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDeEIsQ0FBQztRQUNELElBQUksQ0FBQyxDQUFDO1lBQ0wsTUFBTSxxQkFBcUIsR0FBRyxrQkFBa0IsR0FBRyxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUMzRSxNQUFNLElBQUksR0FBRyxRQUFRLENBQUMsSUFBSSxHQUFHLHFCQUFxQixDQUFDO1lBQ25ELE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDeEIsQ0FBQztJQUNGLENBQUM7SUFDRCxNQUFNLENBQUMsSUFBSSxDQUFDO0FBQ2IsQ0FBQztBQWpCRCw0RUFpQkM7Ozs7Ozs7Ozs7Ozs7O0FDOUhEOzs7Z0dBR2dHOztBQVloRyxJQUFJLGNBQWMsR0FBZ0MsU0FBUyxDQUFDO0FBRTVEO0lBQ0MsRUFBRSxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQztRQUNwQixNQUFNLENBQUMsY0FBYyxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxNQUFNLE9BQU8sR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDLDhCQUE4QixDQUFDLENBQUM7SUFDeEUsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUNiLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxZQUFZLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDbkQsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUNWLGNBQWMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2xDLE1BQU0sQ0FBQyxjQUFlLENBQUM7UUFDeEIsQ0FBQztJQUNGLENBQUM7SUFFRCxNQUFNLElBQUksS0FBSyxDQUFDLHlCQUF5QixDQUFDLENBQUM7QUFDNUMsQ0FBQztBQWZELGtDQWVDIiwiZmlsZSI6ImluZGV4LmpzIiwic291cmNlc0NvbnRlbnQiOlsiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbiBcdFx0fVxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0aTogbW9kdWxlSWQsXG4gXHRcdFx0bDogZmFsc2UsXG4gXHRcdFx0ZXhwb3J0czoge31cbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbiBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7XG4gXHRcdFx0XHRjb25maWd1cmFibGU6IGZhbHNlLFxuIFx0XHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcbiBcdFx0XHRcdGdldDogZ2V0dGVyXG4gXHRcdFx0fSk7XG4gXHRcdH1cbiBcdH07XG5cbiBcdC8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uciA9IGZ1bmN0aW9uKGV4cG9ydHMpIHtcbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbiBcdH07XG5cbiBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbiBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbiBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4gXHRcdHJldHVybiBnZXR0ZXI7XG4gXHR9O1xuXG4gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcblxuIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbiBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG5cblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSBcIi4vcHJldmlldy1zcmMvaW5kZXgudHNcIik7XG4iLCIvKipcbiAqIGxvZGFzaCAoQ3VzdG9tIEJ1aWxkKSA8aHR0cHM6Ly9sb2Rhc2guY29tLz5cbiAqIEJ1aWxkOiBgbG9kYXNoIG1vZHVsYXJpemUgZXhwb3J0cz1cIm5wbVwiIC1vIC4vYFxuICogQ29weXJpZ2h0IGpRdWVyeSBGb3VuZGF0aW9uIGFuZCBvdGhlciBjb250cmlidXRvcnMgPGh0dHBzOi8vanF1ZXJ5Lm9yZy8+XG4gKiBSZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZSA8aHR0cHM6Ly9sb2Rhc2guY29tL2xpY2Vuc2U+XG4gKiBCYXNlZCBvbiBVbmRlcnNjb3JlLmpzIDEuOC4zIDxodHRwOi8vdW5kZXJzY29yZWpzLm9yZy9MSUNFTlNFPlxuICogQ29weXJpZ2h0IEplcmVteSBBc2hrZW5hcywgRG9jdW1lbnRDbG91ZCBhbmQgSW52ZXN0aWdhdGl2ZSBSZXBvcnRlcnMgJiBFZGl0b3JzXG4gKi9cblxuLyoqIFVzZWQgYXMgdGhlIGBUeXBlRXJyb3JgIG1lc3NhZ2UgZm9yIFwiRnVuY3Rpb25zXCIgbWV0aG9kcy4gKi9cbnZhciBGVU5DX0VSUk9SX1RFWFQgPSAnRXhwZWN0ZWQgYSBmdW5jdGlvbic7XG5cbi8qKiBVc2VkIGFzIHJlZmVyZW5jZXMgZm9yIHZhcmlvdXMgYE51bWJlcmAgY29uc3RhbnRzLiAqL1xudmFyIE5BTiA9IDAgLyAwO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgc3ltYm9sVGFnID0gJ1tvYmplY3QgU3ltYm9sXSc7XG5cbi8qKiBVc2VkIHRvIG1hdGNoIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2UuICovXG52YXIgcmVUcmltID0gL15cXHMrfFxccyskL2c7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCBiYWQgc2lnbmVkIGhleGFkZWNpbWFsIHN0cmluZyB2YWx1ZXMuICovXG52YXIgcmVJc0JhZEhleCA9IC9eWy0rXTB4WzAtOWEtZl0rJC9pO1xuXG4vKiogVXNlZCB0byBkZXRlY3QgYmluYXJ5IHN0cmluZyB2YWx1ZXMuICovXG52YXIgcmVJc0JpbmFyeSA9IC9eMGJbMDFdKyQvaTtcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IG9jdGFsIHN0cmluZyB2YWx1ZXMuICovXG52YXIgcmVJc09jdGFsID0gL14wb1swLTddKyQvaTtcblxuLyoqIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIHdpdGhvdXQgYSBkZXBlbmRlbmN5IG9uIGByb290YC4gKi9cbnZhciBmcmVlUGFyc2VJbnQgPSBwYXJzZUludDtcblxuLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBnbG9iYWxgIGZyb20gTm9kZS5qcy4gKi9cbnZhciBmcmVlR2xvYmFsID0gdHlwZW9mIGdsb2JhbCA9PSAnb2JqZWN0JyAmJiBnbG9iYWwgJiYgZ2xvYmFsLk9iamVjdCA9PT0gT2JqZWN0ICYmIGdsb2JhbDtcblxuLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBzZWxmYC4gKi9cbnZhciBmcmVlU2VsZiA9IHR5cGVvZiBzZWxmID09ICdvYmplY3QnICYmIHNlbGYgJiYgc2VsZi5PYmplY3QgPT09IE9iamVjdCAmJiBzZWxmO1xuXG4vKiogVXNlZCBhcyBhIHJlZmVyZW5jZSB0byB0aGUgZ2xvYmFsIG9iamVjdC4gKi9cbnZhciByb290ID0gZnJlZUdsb2JhbCB8fCBmcmVlU2VsZiB8fCBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKipcbiAqIFVzZWQgdG8gcmVzb2x2ZSB0aGVcbiAqIFtgdG9TdHJpbmdUYWdgXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1vYmplY3QucHJvdG90eXBlLnRvc3RyaW5nKVxuICogb2YgdmFsdWVzLlxuICovXG52YXIgb2JqZWN0VG9TdHJpbmcgPSBvYmplY3RQcm90by50b1N0cmluZztcblxuLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgZm9yIHRob3NlIHdpdGggdGhlIHNhbWUgbmFtZSBhcyBvdGhlciBgbG9kYXNoYCBtZXRob2RzLiAqL1xudmFyIG5hdGl2ZU1heCA9IE1hdGgubWF4LFxuICAgIG5hdGl2ZU1pbiA9IE1hdGgubWluO1xuXG4vKipcbiAqIEdldHMgdGhlIHRpbWVzdGFtcCBvZiB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0aGF0IGhhdmUgZWxhcHNlZCBzaW5jZVxuICogdGhlIFVuaXggZXBvY2ggKDEgSmFudWFyeSAxOTcwIDAwOjAwOjAwIFVUQykuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAyLjQuMFxuICogQGNhdGVnb3J5IERhdGVcbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHRpbWVzdGFtcC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5kZWZlcihmdW5jdGlvbihzdGFtcCkge1xuICogICBjb25zb2xlLmxvZyhfLm5vdygpIC0gc3RhbXApO1xuICogfSwgXy5ub3coKSk7XG4gKiAvLyA9PiBMb2dzIHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIGl0IHRvb2sgZm9yIHRoZSBkZWZlcnJlZCBpbnZvY2F0aW9uLlxuICovXG52YXIgbm93ID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiByb290LkRhdGUubm93KCk7XG59O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBkZWJvdW5jZWQgZnVuY3Rpb24gdGhhdCBkZWxheXMgaW52b2tpbmcgYGZ1bmNgIHVudGlsIGFmdGVyIGB3YWl0YFxuICogbWlsbGlzZWNvbmRzIGhhdmUgZWxhcHNlZCBzaW5jZSB0aGUgbGFzdCB0aW1lIHRoZSBkZWJvdW5jZWQgZnVuY3Rpb24gd2FzXG4gKiBpbnZva2VkLiBUaGUgZGVib3VuY2VkIGZ1bmN0aW9uIGNvbWVzIHdpdGggYSBgY2FuY2VsYCBtZXRob2QgdG8gY2FuY2VsXG4gKiBkZWxheWVkIGBmdW5jYCBpbnZvY2F0aW9ucyBhbmQgYSBgZmx1c2hgIG1ldGhvZCB0byBpbW1lZGlhdGVseSBpbnZva2UgdGhlbS5cbiAqIFByb3ZpZGUgYG9wdGlvbnNgIHRvIGluZGljYXRlIHdoZXRoZXIgYGZ1bmNgIHNob3VsZCBiZSBpbnZva2VkIG9uIHRoZVxuICogbGVhZGluZyBhbmQvb3IgdHJhaWxpbmcgZWRnZSBvZiB0aGUgYHdhaXRgIHRpbWVvdXQuIFRoZSBgZnVuY2AgaXMgaW52b2tlZFxuICogd2l0aCB0aGUgbGFzdCBhcmd1bWVudHMgcHJvdmlkZWQgdG8gdGhlIGRlYm91bmNlZCBmdW5jdGlvbi4gU3Vic2VxdWVudFxuICogY2FsbHMgdG8gdGhlIGRlYm91bmNlZCBmdW5jdGlvbiByZXR1cm4gdGhlIHJlc3VsdCBvZiB0aGUgbGFzdCBgZnVuY2BcbiAqIGludm9jYXRpb24uXG4gKlxuICogKipOb3RlOioqIElmIGBsZWFkaW5nYCBhbmQgYHRyYWlsaW5nYCBvcHRpb25zIGFyZSBgdHJ1ZWAsIGBmdW5jYCBpc1xuICogaW52b2tlZCBvbiB0aGUgdHJhaWxpbmcgZWRnZSBvZiB0aGUgdGltZW91dCBvbmx5IGlmIHRoZSBkZWJvdW5jZWQgZnVuY3Rpb25cbiAqIGlzIGludm9rZWQgbW9yZSB0aGFuIG9uY2UgZHVyaW5nIHRoZSBgd2FpdGAgdGltZW91dC5cbiAqXG4gKiBJZiBgd2FpdGAgaXMgYDBgIGFuZCBgbGVhZGluZ2AgaXMgYGZhbHNlYCwgYGZ1bmNgIGludm9jYXRpb24gaXMgZGVmZXJyZWRcbiAqIHVudGlsIHRvIHRoZSBuZXh0IHRpY2ssIHNpbWlsYXIgdG8gYHNldFRpbWVvdXRgIHdpdGggYSB0aW1lb3V0IG9mIGAwYC5cbiAqXG4gKiBTZWUgW0RhdmlkIENvcmJhY2hvJ3MgYXJ0aWNsZV0oaHR0cHM6Ly9jc3MtdHJpY2tzLmNvbS9kZWJvdW5jaW5nLXRocm90dGxpbmctZXhwbGFpbmVkLWV4YW1wbGVzLylcbiAqIGZvciBkZXRhaWxzIG92ZXIgdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gYF8uZGVib3VuY2VgIGFuZCBgXy50aHJvdHRsZWAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBkZWJvdW5jZS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbd2FpdD0wXSBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byBkZWxheS5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucz17fV0gVGhlIG9wdGlvbnMgb2JqZWN0LlxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5sZWFkaW5nPWZhbHNlXVxuICogIFNwZWNpZnkgaW52b2tpbmcgb24gdGhlIGxlYWRpbmcgZWRnZSBvZiB0aGUgdGltZW91dC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5tYXhXYWl0XVxuICogIFRoZSBtYXhpbXVtIHRpbWUgYGZ1bmNgIGlzIGFsbG93ZWQgdG8gYmUgZGVsYXllZCBiZWZvcmUgaXQncyBpbnZva2VkLlxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy50cmFpbGluZz10cnVlXVxuICogIFNwZWNpZnkgaW52b2tpbmcgb24gdGhlIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlIHRpbWVvdXQuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBkZWJvdW5jZWQgZnVuY3Rpb24uXG4gKiBAZXhhbXBsZVxuICpcbiAqIC8vIEF2b2lkIGNvc3RseSBjYWxjdWxhdGlvbnMgd2hpbGUgdGhlIHdpbmRvdyBzaXplIGlzIGluIGZsdXguXG4gKiBqUXVlcnkod2luZG93KS5vbigncmVzaXplJywgXy5kZWJvdW5jZShjYWxjdWxhdGVMYXlvdXQsIDE1MCkpO1xuICpcbiAqIC8vIEludm9rZSBgc2VuZE1haWxgIHdoZW4gY2xpY2tlZCwgZGVib3VuY2luZyBzdWJzZXF1ZW50IGNhbGxzLlxuICogalF1ZXJ5KGVsZW1lbnQpLm9uKCdjbGljaycsIF8uZGVib3VuY2Uoc2VuZE1haWwsIDMwMCwge1xuICogICAnbGVhZGluZyc6IHRydWUsXG4gKiAgICd0cmFpbGluZyc6IGZhbHNlXG4gKiB9KSk7XG4gKlxuICogLy8gRW5zdXJlIGBiYXRjaExvZ2AgaXMgaW52b2tlZCBvbmNlIGFmdGVyIDEgc2Vjb25kIG9mIGRlYm91bmNlZCBjYWxscy5cbiAqIHZhciBkZWJvdW5jZWQgPSBfLmRlYm91bmNlKGJhdGNoTG9nLCAyNTAsIHsgJ21heFdhaXQnOiAxMDAwIH0pO1xuICogdmFyIHNvdXJjZSA9IG5ldyBFdmVudFNvdXJjZSgnL3N0cmVhbScpO1xuICogalF1ZXJ5KHNvdXJjZSkub24oJ21lc3NhZ2UnLCBkZWJvdW5jZWQpO1xuICpcbiAqIC8vIENhbmNlbCB0aGUgdHJhaWxpbmcgZGVib3VuY2VkIGludm9jYXRpb24uXG4gKiBqUXVlcnkod2luZG93KS5vbigncG9wc3RhdGUnLCBkZWJvdW5jZWQuY2FuY2VsKTtcbiAqL1xuZnVuY3Rpb24gZGVib3VuY2UoZnVuYywgd2FpdCwgb3B0aW9ucykge1xuICB2YXIgbGFzdEFyZ3MsXG4gICAgICBsYXN0VGhpcyxcbiAgICAgIG1heFdhaXQsXG4gICAgICByZXN1bHQsXG4gICAgICB0aW1lcklkLFxuICAgICAgbGFzdENhbGxUaW1lLFxuICAgICAgbGFzdEludm9rZVRpbWUgPSAwLFxuICAgICAgbGVhZGluZyA9IGZhbHNlLFxuICAgICAgbWF4aW5nID0gZmFsc2UsXG4gICAgICB0cmFpbGluZyA9IHRydWU7XG5cbiAgaWYgKHR5cGVvZiBmdW5jICE9ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKEZVTkNfRVJST1JfVEVYVCk7XG4gIH1cbiAgd2FpdCA9IHRvTnVtYmVyKHdhaXQpIHx8IDA7XG4gIGlmIChpc09iamVjdChvcHRpb25zKSkge1xuICAgIGxlYWRpbmcgPSAhIW9wdGlvbnMubGVhZGluZztcbiAgICBtYXhpbmcgPSAnbWF4V2FpdCcgaW4gb3B0aW9ucztcbiAgICBtYXhXYWl0ID0gbWF4aW5nID8gbmF0aXZlTWF4KHRvTnVtYmVyKG9wdGlvbnMubWF4V2FpdCkgfHwgMCwgd2FpdCkgOiBtYXhXYWl0O1xuICAgIHRyYWlsaW5nID0gJ3RyYWlsaW5nJyBpbiBvcHRpb25zID8gISFvcHRpb25zLnRyYWlsaW5nIDogdHJhaWxpbmc7XG4gIH1cblxuICBmdW5jdGlvbiBpbnZva2VGdW5jKHRpbWUpIHtcbiAgICB2YXIgYXJncyA9IGxhc3RBcmdzLFxuICAgICAgICB0aGlzQXJnID0gbGFzdFRoaXM7XG5cbiAgICBsYXN0QXJncyA9IGxhc3RUaGlzID0gdW5kZWZpbmVkO1xuICAgIGxhc3RJbnZva2VUaW1lID0gdGltZTtcbiAgICByZXN1bHQgPSBmdW5jLmFwcGx5KHRoaXNBcmcsIGFyZ3MpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBmdW5jdGlvbiBsZWFkaW5nRWRnZSh0aW1lKSB7XG4gICAgLy8gUmVzZXQgYW55IGBtYXhXYWl0YCB0aW1lci5cbiAgICBsYXN0SW52b2tlVGltZSA9IHRpbWU7XG4gICAgLy8gU3RhcnQgdGhlIHRpbWVyIGZvciB0aGUgdHJhaWxpbmcgZWRnZS5cbiAgICB0aW1lcklkID0gc2V0VGltZW91dCh0aW1lckV4cGlyZWQsIHdhaXQpO1xuICAgIC8vIEludm9rZSB0aGUgbGVhZGluZyBlZGdlLlxuICAgIHJldHVybiBsZWFkaW5nID8gaW52b2tlRnVuYyh0aW1lKSA6IHJlc3VsdDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlbWFpbmluZ1dhaXQodGltZSkge1xuICAgIHZhciB0aW1lU2luY2VMYXN0Q2FsbCA9IHRpbWUgLSBsYXN0Q2FsbFRpbWUsXG4gICAgICAgIHRpbWVTaW5jZUxhc3RJbnZva2UgPSB0aW1lIC0gbGFzdEludm9rZVRpbWUsXG4gICAgICAgIHJlc3VsdCA9IHdhaXQgLSB0aW1lU2luY2VMYXN0Q2FsbDtcblxuICAgIHJldHVybiBtYXhpbmcgPyBuYXRpdmVNaW4ocmVzdWx0LCBtYXhXYWl0IC0gdGltZVNpbmNlTGFzdEludm9rZSkgOiByZXN1bHQ7XG4gIH1cblxuICBmdW5jdGlvbiBzaG91bGRJbnZva2UodGltZSkge1xuICAgIHZhciB0aW1lU2luY2VMYXN0Q2FsbCA9IHRpbWUgLSBsYXN0Q2FsbFRpbWUsXG4gICAgICAgIHRpbWVTaW5jZUxhc3RJbnZva2UgPSB0aW1lIC0gbGFzdEludm9rZVRpbWU7XG5cbiAgICAvLyBFaXRoZXIgdGhpcyBpcyB0aGUgZmlyc3QgY2FsbCwgYWN0aXZpdHkgaGFzIHN0b3BwZWQgYW5kIHdlJ3JlIGF0IHRoZVxuICAgIC8vIHRyYWlsaW5nIGVkZ2UsIHRoZSBzeXN0ZW0gdGltZSBoYXMgZ29uZSBiYWNrd2FyZHMgYW5kIHdlJ3JlIHRyZWF0aW5nXG4gICAgLy8gaXQgYXMgdGhlIHRyYWlsaW5nIGVkZ2UsIG9yIHdlJ3ZlIGhpdCB0aGUgYG1heFdhaXRgIGxpbWl0LlxuICAgIHJldHVybiAobGFzdENhbGxUaW1lID09PSB1bmRlZmluZWQgfHwgKHRpbWVTaW5jZUxhc3RDYWxsID49IHdhaXQpIHx8XG4gICAgICAodGltZVNpbmNlTGFzdENhbGwgPCAwKSB8fCAobWF4aW5nICYmIHRpbWVTaW5jZUxhc3RJbnZva2UgPj0gbWF4V2FpdCkpO1xuICB9XG5cbiAgZnVuY3Rpb24gdGltZXJFeHBpcmVkKCkge1xuICAgIHZhciB0aW1lID0gbm93KCk7XG4gICAgaWYgKHNob3VsZEludm9rZSh0aW1lKSkge1xuICAgICAgcmV0dXJuIHRyYWlsaW5nRWRnZSh0aW1lKTtcbiAgICB9XG4gICAgLy8gUmVzdGFydCB0aGUgdGltZXIuXG4gICAgdGltZXJJZCA9IHNldFRpbWVvdXQodGltZXJFeHBpcmVkLCByZW1haW5pbmdXYWl0KHRpbWUpKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRyYWlsaW5nRWRnZSh0aW1lKSB7XG4gICAgdGltZXJJZCA9IHVuZGVmaW5lZDtcblxuICAgIC8vIE9ubHkgaW52b2tlIGlmIHdlIGhhdmUgYGxhc3RBcmdzYCB3aGljaCBtZWFucyBgZnVuY2AgaGFzIGJlZW5cbiAgICAvLyBkZWJvdW5jZWQgYXQgbGVhc3Qgb25jZS5cbiAgICBpZiAodHJhaWxpbmcgJiYgbGFzdEFyZ3MpIHtcbiAgICAgIHJldHVybiBpbnZva2VGdW5jKHRpbWUpO1xuICAgIH1cbiAgICBsYXN0QXJncyA9IGxhc3RUaGlzID0gdW5kZWZpbmVkO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBmdW5jdGlvbiBjYW5jZWwoKSB7XG4gICAgaWYgKHRpbWVySWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRpbWVySWQpO1xuICAgIH1cbiAgICBsYXN0SW52b2tlVGltZSA9IDA7XG4gICAgbGFzdEFyZ3MgPSBsYXN0Q2FsbFRpbWUgPSBsYXN0VGhpcyA9IHRpbWVySWQgPSB1bmRlZmluZWQ7XG4gIH1cblxuICBmdW5jdGlvbiBmbHVzaCgpIHtcbiAgICByZXR1cm4gdGltZXJJZCA9PT0gdW5kZWZpbmVkID8gcmVzdWx0IDogdHJhaWxpbmdFZGdlKG5vdygpKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGRlYm91bmNlZCgpIHtcbiAgICB2YXIgdGltZSA9IG5vdygpLFxuICAgICAgICBpc0ludm9raW5nID0gc2hvdWxkSW52b2tlKHRpbWUpO1xuXG4gICAgbGFzdEFyZ3MgPSBhcmd1bWVudHM7XG4gICAgbGFzdFRoaXMgPSB0aGlzO1xuICAgIGxhc3RDYWxsVGltZSA9IHRpbWU7XG5cbiAgICBpZiAoaXNJbnZva2luZykge1xuICAgICAgaWYgKHRpbWVySWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gbGVhZGluZ0VkZ2UobGFzdENhbGxUaW1lKTtcbiAgICAgIH1cbiAgICAgIGlmIChtYXhpbmcpIHtcbiAgICAgICAgLy8gSGFuZGxlIGludm9jYXRpb25zIGluIGEgdGlnaHQgbG9vcC5cbiAgICAgICAgdGltZXJJZCA9IHNldFRpbWVvdXQodGltZXJFeHBpcmVkLCB3YWl0KTtcbiAgICAgICAgcmV0dXJuIGludm9rZUZ1bmMobGFzdENhbGxUaW1lKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRpbWVySWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGltZXJJZCA9IHNldFRpbWVvdXQodGltZXJFeHBpcmVkLCB3YWl0KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICBkZWJvdW5jZWQuY2FuY2VsID0gY2FuY2VsO1xuICBkZWJvdW5jZWQuZmx1c2ggPSBmbHVzaDtcbiAgcmV0dXJuIGRlYm91bmNlZDtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgdGhyb3R0bGVkIGZ1bmN0aW9uIHRoYXQgb25seSBpbnZva2VzIGBmdW5jYCBhdCBtb3N0IG9uY2UgcGVyXG4gKiBldmVyeSBgd2FpdGAgbWlsbGlzZWNvbmRzLiBUaGUgdGhyb3R0bGVkIGZ1bmN0aW9uIGNvbWVzIHdpdGggYSBgY2FuY2VsYFxuICogbWV0aG9kIHRvIGNhbmNlbCBkZWxheWVkIGBmdW5jYCBpbnZvY2F0aW9ucyBhbmQgYSBgZmx1c2hgIG1ldGhvZCB0b1xuICogaW1tZWRpYXRlbHkgaW52b2tlIHRoZW0uIFByb3ZpZGUgYG9wdGlvbnNgIHRvIGluZGljYXRlIHdoZXRoZXIgYGZ1bmNgXG4gKiBzaG91bGQgYmUgaW52b2tlZCBvbiB0aGUgbGVhZGluZyBhbmQvb3IgdHJhaWxpbmcgZWRnZSBvZiB0aGUgYHdhaXRgXG4gKiB0aW1lb3V0LiBUaGUgYGZ1bmNgIGlzIGludm9rZWQgd2l0aCB0aGUgbGFzdCBhcmd1bWVudHMgcHJvdmlkZWQgdG8gdGhlXG4gKiB0aHJvdHRsZWQgZnVuY3Rpb24uIFN1YnNlcXVlbnQgY2FsbHMgdG8gdGhlIHRocm90dGxlZCBmdW5jdGlvbiByZXR1cm4gdGhlXG4gKiByZXN1bHQgb2YgdGhlIGxhc3QgYGZ1bmNgIGludm9jYXRpb24uXG4gKlxuICogKipOb3RlOioqIElmIGBsZWFkaW5nYCBhbmQgYHRyYWlsaW5nYCBvcHRpb25zIGFyZSBgdHJ1ZWAsIGBmdW5jYCBpc1xuICogaW52b2tlZCBvbiB0aGUgdHJhaWxpbmcgZWRnZSBvZiB0aGUgdGltZW91dCBvbmx5IGlmIHRoZSB0aHJvdHRsZWQgZnVuY3Rpb25cbiAqIGlzIGludm9rZWQgbW9yZSB0aGFuIG9uY2UgZHVyaW5nIHRoZSBgd2FpdGAgdGltZW91dC5cbiAqXG4gKiBJZiBgd2FpdGAgaXMgYDBgIGFuZCBgbGVhZGluZ2AgaXMgYGZhbHNlYCwgYGZ1bmNgIGludm9jYXRpb24gaXMgZGVmZXJyZWRcbiAqIHVudGlsIHRvIHRoZSBuZXh0IHRpY2ssIHNpbWlsYXIgdG8gYHNldFRpbWVvdXRgIHdpdGggYSB0aW1lb3V0IG9mIGAwYC5cbiAqXG4gKiBTZWUgW0RhdmlkIENvcmJhY2hvJ3MgYXJ0aWNsZV0oaHR0cHM6Ly9jc3MtdHJpY2tzLmNvbS9kZWJvdW5jaW5nLXRocm90dGxpbmctZXhwbGFpbmVkLWV4YW1wbGVzLylcbiAqIGZvciBkZXRhaWxzIG92ZXIgdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gYF8udGhyb3R0bGVgIGFuZCBgXy5kZWJvdW5jZWAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byB0aHJvdHRsZS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbd2FpdD0wXSBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byB0aHJvdHRsZSBpbnZvY2F0aW9ucyB0by5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucz17fV0gVGhlIG9wdGlvbnMgb2JqZWN0LlxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5sZWFkaW5nPXRydWVdXG4gKiAgU3BlY2lmeSBpbnZva2luZyBvbiB0aGUgbGVhZGluZyBlZGdlIG9mIHRoZSB0aW1lb3V0LlxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy50cmFpbGluZz10cnVlXVxuICogIFNwZWNpZnkgaW52b2tpbmcgb24gdGhlIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlIHRpbWVvdXQuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyB0aHJvdHRsZWQgZnVuY3Rpb24uXG4gKiBAZXhhbXBsZVxuICpcbiAqIC8vIEF2b2lkIGV4Y2Vzc2l2ZWx5IHVwZGF0aW5nIHRoZSBwb3NpdGlvbiB3aGlsZSBzY3JvbGxpbmcuXG4gKiBqUXVlcnkod2luZG93KS5vbignc2Nyb2xsJywgXy50aHJvdHRsZSh1cGRhdGVQb3NpdGlvbiwgMTAwKSk7XG4gKlxuICogLy8gSW52b2tlIGByZW5ld1Rva2VuYCB3aGVuIHRoZSBjbGljayBldmVudCBpcyBmaXJlZCwgYnV0IG5vdCBtb3JlIHRoYW4gb25jZSBldmVyeSA1IG1pbnV0ZXMuXG4gKiB2YXIgdGhyb3R0bGVkID0gXy50aHJvdHRsZShyZW5ld1Rva2VuLCAzMDAwMDAsIHsgJ3RyYWlsaW5nJzogZmFsc2UgfSk7XG4gKiBqUXVlcnkoZWxlbWVudCkub24oJ2NsaWNrJywgdGhyb3R0bGVkKTtcbiAqXG4gKiAvLyBDYW5jZWwgdGhlIHRyYWlsaW5nIHRocm90dGxlZCBpbnZvY2F0aW9uLlxuICogalF1ZXJ5KHdpbmRvdykub24oJ3BvcHN0YXRlJywgdGhyb3R0bGVkLmNhbmNlbCk7XG4gKi9cbmZ1bmN0aW9uIHRocm90dGxlKGZ1bmMsIHdhaXQsIG9wdGlvbnMpIHtcbiAgdmFyIGxlYWRpbmcgPSB0cnVlLFxuICAgICAgdHJhaWxpbmcgPSB0cnVlO1xuXG4gIGlmICh0eXBlb2YgZnVuYyAhPSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO1xuICB9XG4gIGlmIChpc09iamVjdChvcHRpb25zKSkge1xuICAgIGxlYWRpbmcgPSAnbGVhZGluZycgaW4gb3B0aW9ucyA/ICEhb3B0aW9ucy5sZWFkaW5nIDogbGVhZGluZztcbiAgICB0cmFpbGluZyA9ICd0cmFpbGluZycgaW4gb3B0aW9ucyA/ICEhb3B0aW9ucy50cmFpbGluZyA6IHRyYWlsaW5nO1xuICB9XG4gIHJldHVybiBkZWJvdW5jZShmdW5jLCB3YWl0LCB7XG4gICAgJ2xlYWRpbmcnOiBsZWFkaW5nLFxuICAgICdtYXhXYWl0Jzogd2FpdCxcbiAgICAndHJhaWxpbmcnOiB0cmFpbGluZ1xuICB9KTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyB0aGVcbiAqIFtsYW5ndWFnZSB0eXBlXShodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtZWNtYXNjcmlwdC1sYW5ndWFnZS10eXBlcylcbiAqIG9mIGBPYmplY3RgLiAoZS5nLiBhcnJheXMsIGZ1bmN0aW9ucywgb2JqZWN0cywgcmVnZXhlcywgYG5ldyBOdW1iZXIoMClgLCBhbmQgYG5ldyBTdHJpbmcoJycpYClcbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBvYmplY3QsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc09iamVjdCh7fSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdChbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3QoXy5ub29wKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0KG51bGwpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNPYmplY3QodmFsdWUpIHtcbiAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsdWU7XG4gIHJldHVybiAhIXZhbHVlICYmICh0eXBlID09ICdvYmplY3QnIHx8IHR5cGUgPT0gJ2Z1bmN0aW9uJyk7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UuIEEgdmFsdWUgaXMgb2JqZWN0LWxpa2UgaWYgaXQncyBub3QgYG51bGxgXG4gKiBhbmQgaGFzIGEgYHR5cGVvZmAgcmVzdWx0IG9mIFwib2JqZWN0XCIuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc09iamVjdExpa2Uoe30pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdExpa2UoXy5ub29wKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc09iamVjdExpa2UobnVsbCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc09iamVjdExpa2UodmFsdWUpIHtcbiAgcmV0dXJuICEhdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09ICdvYmplY3QnO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgU3ltYm9sYCBwcmltaXRpdmUgb3Igb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgc3ltYm9sLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNTeW1ib2woU3ltYm9sLml0ZXJhdG9yKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzU3ltYm9sKCdhYmMnKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzU3ltYm9sKHZhbHVlKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ3N5bWJvbCcgfHxcbiAgICAoaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBvYmplY3RUb1N0cmluZy5jYWxsKHZhbHVlKSA9PSBzeW1ib2xUYWcpO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBudW1iZXIuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHByb2Nlc3MuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBudW1iZXIuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8udG9OdW1iZXIoMy4yKTtcbiAqIC8vID0+IDMuMlxuICpcbiAqIF8udG9OdW1iZXIoTnVtYmVyLk1JTl9WQUxVRSk7XG4gKiAvLyA9PiA1ZS0zMjRcbiAqXG4gKiBfLnRvTnVtYmVyKEluZmluaXR5KTtcbiAqIC8vID0+IEluZmluaXR5XG4gKlxuICogXy50b051bWJlcignMy4yJyk7XG4gKiAvLyA9PiAzLjJcbiAqL1xuZnVuY3Rpb24gdG9OdW1iZXIodmFsdWUpIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnbnVtYmVyJykge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICBpZiAoaXNTeW1ib2wodmFsdWUpKSB7XG4gICAgcmV0dXJuIE5BTjtcbiAgfVxuICBpZiAoaXNPYmplY3QodmFsdWUpKSB7XG4gICAgdmFyIG90aGVyID0gdHlwZW9mIHZhbHVlLnZhbHVlT2YgPT0gJ2Z1bmN0aW9uJyA/IHZhbHVlLnZhbHVlT2YoKSA6IHZhbHVlO1xuICAgIHZhbHVlID0gaXNPYmplY3Qob3RoZXIpID8gKG90aGVyICsgJycpIDogb3RoZXI7XG4gIH1cbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykge1xuICAgIHJldHVybiB2YWx1ZSA9PT0gMCA/IHZhbHVlIDogK3ZhbHVlO1xuICB9XG4gIHZhbHVlID0gdmFsdWUucmVwbGFjZShyZVRyaW0sICcnKTtcbiAgdmFyIGlzQmluYXJ5ID0gcmVJc0JpbmFyeS50ZXN0KHZhbHVlKTtcbiAgcmV0dXJuIChpc0JpbmFyeSB8fCByZUlzT2N0YWwudGVzdCh2YWx1ZSkpXG4gICAgPyBmcmVlUGFyc2VJbnQodmFsdWUuc2xpY2UoMiksIGlzQmluYXJ5ID8gMiA6IDgpXG4gICAgOiAocmVJc0JhZEhleC50ZXN0KHZhbHVlKSA/IE5BTiA6ICt2YWx1ZSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gdGhyb3R0bGU7XG4iLCJ2YXIgZztcclxuXHJcbi8vIFRoaXMgd29ya3MgaW4gbm9uLXN0cmljdCBtb2RlXHJcbmcgPSAoZnVuY3Rpb24oKSB7XHJcblx0cmV0dXJuIHRoaXM7XHJcbn0pKCk7XHJcblxyXG50cnkge1xyXG5cdC8vIFRoaXMgd29ya3MgaWYgZXZhbCBpcyBhbGxvd2VkIChzZWUgQ1NQKVxyXG5cdGcgPSBnIHx8IEZ1bmN0aW9uKFwicmV0dXJuIHRoaXNcIikoKSB8fCAoMSwgZXZhbCkoXCJ0aGlzXCIpO1xyXG59IGNhdGNoIChlKSB7XHJcblx0Ly8gVGhpcyB3b3JrcyBpZiB0aGUgd2luZG93IHJlZmVyZW5jZSBpcyBhdmFpbGFibGVcclxuXHRpZiAodHlwZW9mIHdpbmRvdyA9PT0gXCJvYmplY3RcIikgZyA9IHdpbmRvdztcclxufVxyXG5cclxuLy8gZyBjYW4gc3RpbGwgYmUgdW5kZWZpbmVkLCBidXQgbm90aGluZyB0byBkbyBhYm91dCBpdC4uLlxyXG4vLyBXZSByZXR1cm4gdW5kZWZpbmVkLCBpbnN0ZWFkIG9mIG5vdGhpbmcgaGVyZSwgc28gaXQnc1xyXG4vLyBlYXNpZXIgdG8gaGFuZGxlIHRoaXMgY2FzZS4gaWYoIWdsb2JhbCkgeyAuLi59XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IGc7XHJcbiIsIi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuaW1wb3J0IHsgZ2V0RWxlbWVudHNGb3JTb3VyY2VMaW5lIH0gZnJvbSAnLi9zY3JvbGwtc3luYyc7XG5cbmV4cG9ydCBjbGFzcyBBY3RpdmVMaW5lTWFya2VyIHtcblx0cHJpdmF0ZSBfY3VycmVudDogYW55O1xuXG5cdG9uRGlkQ2hhbmdlVGV4dEVkaXRvclNlbGVjdGlvbihsaW5lOiBudW1iZXIpIHtcblx0XHRjb25zdCB7IHByZXZpb3VzIH0gPSBnZXRFbGVtZW50c0ZvclNvdXJjZUxpbmUobGluZSk7XG5cdFx0dGhpcy5fdXBkYXRlKHByZXZpb3VzICYmIHByZXZpb3VzLmVsZW1lbnQpO1xuXHR9XG5cblx0X3VwZGF0ZShiZWZvcmU6IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkKSB7XG5cdFx0dGhpcy5fdW5tYXJrQWN0aXZlRWxlbWVudCh0aGlzLl9jdXJyZW50KTtcblx0XHR0aGlzLl9tYXJrQWN0aXZlRWxlbWVudChiZWZvcmUpO1xuXHRcdHRoaXMuX2N1cnJlbnQgPSBiZWZvcmU7XG5cdH1cblxuXHRfdW5tYXJrQWN0aXZlRWxlbWVudChlbGVtZW50OiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZCkge1xuXHRcdGlmICghZWxlbWVudCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRlbGVtZW50LmNsYXNzTmFtZSA9IGVsZW1lbnQuY2xhc3NOYW1lLnJlcGxhY2UoL1xcYmNvZGUtYWN0aXZlLWxpbmVcXGIvZywgJycpO1xuXHR9XG5cblx0X21hcmtBY3RpdmVFbGVtZW50KGVsZW1lbnQ6IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkKSB7XG5cdFx0aWYgKCFlbGVtZW50KSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGVsZW1lbnQuY2xhc3NOYW1lICs9ICcgY29kZS1hY3RpdmUtbGluZSc7XG5cdH1cbn0iLCIvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuZXhwb3J0IGZ1bmN0aW9uIG9uY2VEb2N1bWVudExvYWRlZChmOiAoKSA9PiB2b2lkKSB7XG5cdGlmIChkb2N1bWVudC5yZWFkeVN0YXRlID09PSAnbG9hZGluZycgfHwgZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gJ3VuaW5pdGlhbGl6ZWQnKSB7XG5cdFx0ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsIGYpO1xuXHR9IGVsc2Uge1xuXHRcdGYoKTtcblx0fVxufSIsIi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG5pbXBvcnQgeyBBY3RpdmVMaW5lTWFya2VyIH0gZnJvbSAnLi9hY3RpdmVMaW5lTWFya2VyJztcbmltcG9ydCB7IG9uY2VEb2N1bWVudExvYWRlZCB9IGZyb20gJy4vZXZlbnRzJztcbmltcG9ydCB7IGNyZWF0ZVBvc3RlckZvclZzQ29kZSB9IGZyb20gJy4vbWVzc2FnaW5nJztcbmltcG9ydCB7IGdldEVkaXRvckxpbmVOdW1iZXJGb3JQYWdlT2Zmc2V0LCBzY3JvbGxUb1JldmVhbFNvdXJjZUxpbmUgfSBmcm9tICcuL3Njcm9sbC1zeW5jJztcbmltcG9ydCB7IGdldFNldHRpbmdzIH0gZnJvbSAnLi9zZXR0aW5ncyc7XG5pbXBvcnQgdGhyb3R0bGUgPSByZXF1aXJlKCdsb2Rhc2gudGhyb3R0bGUnKTtcblxuZGVjbGFyZSB2YXIgYWNxdWlyZVZzQ29kZUFwaTogYW55O1xuXG52YXIgc2Nyb2xsRGlzYWJsZWQgPSB0cnVlO1xuY29uc3QgbWFya2VyID0gbmV3IEFjdGl2ZUxpbmVNYXJrZXIoKTtcbmNvbnN0IHNldHRpbmdzID0gZ2V0U2V0dGluZ3MoKTtcblxuY29uc3QgdnNjb2RlID0gYWNxdWlyZVZzQ29kZUFwaSgpO1xuY29uc3QgbWVzc2FnaW5nID0gY3JlYXRlUG9zdGVyRm9yVnNDb2RlKHZzY29kZSk7XG5cbndpbmRvdy5jc3BBbGVydGVyLnNldFBvc3RlcihtZXNzYWdpbmcpO1xud2luZG93LnN0eWxlTG9hZGluZ01vbml0b3Iuc2V0UG9zdGVyKG1lc3NhZ2luZyk7XG5cbm9uY2VEb2N1bWVudExvYWRlZCgoKSA9PiB7XG5cdGlmIChzZXR0aW5ncy5zY3JvbGxQcmV2aWV3V2l0aEVkaXRvcikge1xuXHRcdHNldFRpbWVvdXQoKCkgPT4ge1xuXHRcdFx0Y29uc3QgaW5pdGlhbExpbmUgPSArc2V0dGluZ3MubGluZTtcblx0XHRcdGlmICghaXNOYU4oaW5pdGlhbExpbmUpKSB7XG5cdFx0XHRcdHNjcm9sbERpc2FibGVkID0gdHJ1ZTtcblx0XHRcdFx0c2Nyb2xsVG9SZXZlYWxTb3VyY2VMaW5lKGluaXRpYWxMaW5lKTtcblx0XHRcdH1cblx0XHR9LCAwKTtcblx0fVxufSk7XG5cbmNvbnN0IG9uVXBkYXRlVmlldyA9ICgoKSA9PiB7XG5cdGNvbnN0IGRvU2Nyb2xsID0gdGhyb3R0bGUoKGxpbmU6IG51bWJlcikgPT4ge1xuXHRcdHNjcm9sbERpc2FibGVkID0gdHJ1ZTtcblx0XHRzY3JvbGxUb1JldmVhbFNvdXJjZUxpbmUobGluZSk7XG5cdH0sIDUwKTtcblxuXHRyZXR1cm4gKGxpbmU6IG51bWJlciwgc2V0dGluZ3M6IGFueSkgPT4ge1xuXHRcdGlmICghaXNOYU4obGluZSkpIHtcblx0XHRcdHNldHRpbmdzLmxpbmUgPSBsaW5lO1xuXHRcdFx0ZG9TY3JvbGwobGluZSk7XG5cdFx0fVxuXHR9O1xufSkoKTtcblxud2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsICgpID0+IHtcblx0c2Nyb2xsRGlzYWJsZWQgPSB0cnVlO1xufSwgdHJ1ZSk7XG5cbndpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgZXZlbnQgPT4ge1xuXHRpZiAoZXZlbnQuZGF0YS5zb3VyY2UgIT09IHNldHRpbmdzLnNvdXJjZSkge1xuXHRcdHJldHVybjtcblx0fVxuXG5cdHN3aXRjaCAoZXZlbnQuZGF0YS50eXBlKSB7XG5cdFx0Y2FzZSAnb25EaWRDaGFuZ2VUZXh0RWRpdG9yU2VsZWN0aW9uJzpcblx0XHRcdG1hcmtlci5vbkRpZENoYW5nZVRleHRFZGl0b3JTZWxlY3Rpb24oZXZlbnQuZGF0YS5saW5lKTtcblx0XHRcdGJyZWFrO1xuXG5cdFx0Y2FzZSAndXBkYXRlVmlldyc6XG5cdFx0XHRvblVwZGF0ZVZpZXcoZXZlbnQuZGF0YS5saW5lLCBzZXR0aW5ncyk7XG5cdFx0XHRicmVhaztcblx0fVxufSwgZmFsc2UpO1xuXG5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdkYmxjbGljaycsIGV2ZW50ID0+IHtcblx0aWYgKCFzZXR0aW5ncy5kb3VibGVDbGlja1RvU3dpdGNoVG9FZGl0b3IpIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHQvLyBJZ25vcmUgY2xpY2tzIG9uIGxpbmtzXG5cdGZvciAobGV0IG5vZGUgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7IG5vZGU7IG5vZGUgPSBub2RlLnBhcmVudE5vZGUgYXMgSFRNTEVsZW1lbnQpIHtcblx0XHRpZiAobm9kZS50YWdOYW1lID09PSAnQScpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdH1cblxuXHRjb25zdCBvZmZzZXQgPSBldmVudC5wYWdlWTtcblx0Y29uc3QgbGluZSA9IGdldEVkaXRvckxpbmVOdW1iZXJGb3JQYWdlT2Zmc2V0KG9mZnNldCk7XG5cdGlmICh0eXBlb2YgbGluZSA9PT0gJ251bWJlcicgJiYgIWlzTmFOKGxpbmUpKSB7XG5cdFx0bWVzc2FnaW5nLnBvc3RNZXNzYWdlKCdkaWRDbGljaycsIHsgbGluZTogTWF0aC5mbG9vcihsaW5lKSB9KTtcblx0fVxufSk7XG5cbmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZXZlbnQgPT4ge1xuXHRpZiAoIWV2ZW50KSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0bGV0IG5vZGU6IGFueSA9IGV2ZW50LnRhcmdldDtcblx0d2hpbGUgKG5vZGUpIHtcblx0XHRpZiAobm9kZS50YWdOYW1lICYmIG5vZGUudGFnTmFtZSA9PT0gJ0EnICYmIG5vZGUuaHJlZikge1xuXHRcdFx0aWYgKG5vZGUuZ2V0QXR0cmlidXRlKCdocmVmJykuc3RhcnRzV2l0aCgnIycpKSB7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdFx0aWYgKG5vZGUuaHJlZi5zdGFydHNXaXRoKCdmaWxlOi8vJykgfHwgbm9kZS5ocmVmLnN0YXJ0c1dpdGgoJ3ZzY29kZS1yZXNvdXJjZTonKSkge1xuXHRcdFx0XHRjb25zdCBbcGF0aCwgZnJhZ21lbnRdID0gbm9kZS5ocmVmLnJlcGxhY2UoL14oZmlsZTpcXC9cXC98dnNjb2RlLXJlc291cmNlOikvaSwgJycpLnNwbGl0KCcjJyk7XG5cdFx0XHRcdG1lc3NhZ2luZy5wb3N0Q29tbWFuZCgnX21hcmtkb3duLm9wZW5Eb2N1bWVudExpbmsnLCBbeyBwYXRoLCBmcmFnbWVudCB9XSk7XG5cdFx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cdFx0XHRcdGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHRcdGJyZWFrO1xuXHRcdH1cblx0XHRub2RlID0gbm9kZS5wYXJlbnROb2RlO1xuXHR9XG59LCB0cnVlKTtcblxuaWYgKHNldHRpbmdzLnNjcm9sbEVkaXRvcldpdGhQcmV2aWV3KSB7XG5cdHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCB0aHJvdHRsZSgoKSA9PiB7XG5cdFx0aWYgKHNjcm9sbERpc2FibGVkKSB7XG5cdFx0XHRzY3JvbGxEaXNhYmxlZCA9IGZhbHNlO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRjb25zdCBsaW5lID0gZ2V0RWRpdG9yTGluZU51bWJlckZvclBhZ2VPZmZzZXQod2luZG93LnNjcm9sbFkpO1xuXHRcdFx0aWYgKHR5cGVvZiBsaW5lID09PSAnbnVtYmVyJyAmJiAhaXNOYU4obGluZSkpIHtcblx0XHRcdFx0bWVzc2FnaW5nLnBvc3RNZXNzYWdlKCdyZXZlYWxMaW5lJywgeyBsaW5lIH0pO1xuXHRcdFx0fVxuXHRcdH1cblx0fSwgNTApKTtcbn0iLCIvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuaW1wb3J0IHsgZ2V0U2V0dGluZ3MgfSBmcm9tICcuL3NldHRpbmdzJztcblxuZXhwb3J0IGludGVyZmFjZSBNZXNzYWdlUG9zdGVyIHtcblx0LyoqXG5cdCAqIFBvc3QgYSBtZXNzYWdlIHRvIHRoZSBtYXJrZG93biBleHRlbnNpb25cblx0ICovXG5cdHBvc3RNZXNzYWdlKHR5cGU6IHN0cmluZywgYm9keTogb2JqZWN0KTogdm9pZDtcblxuXG5cdC8qKlxuXHQgKiBQb3N0IGEgY29tbWFuZCB0byBiZSBleGVjdXRlZCB0byB0aGUgbWFya2Rvd24gZXh0ZW5zaW9uXG5cdCAqL1xuXHRwb3N0Q29tbWFuZChjb21tYW5kOiBzdHJpbmcsIGFyZ3M6IGFueVtdKTogdm9pZDtcbn1cblxuZXhwb3J0IGNvbnN0IGNyZWF0ZVBvc3RlckZvclZzQ29kZSA9ICh2c2NvZGU6IGFueSkgPT4ge1xuXHRyZXR1cm4gbmV3IGNsYXNzIGltcGxlbWVudHMgTWVzc2FnZVBvc3RlciB7XG5cdFx0cG9zdE1lc3NhZ2UodHlwZTogc3RyaW5nLCBib2R5OiBvYmplY3QpOiB2b2lkIHtcblx0XHRcdHZzY29kZS5wb3N0TWVzc2FnZSh7XG5cdFx0XHRcdHR5cGUsXG5cdFx0XHRcdHNvdXJjZTogZ2V0U2V0dGluZ3MoKS5zb3VyY2UsXG5cdFx0XHRcdGJvZHlcblx0XHRcdH0pO1xuXHRcdH1cblx0XHRwb3N0Q29tbWFuZChjb21tYW5kOiBzdHJpbmcsIGFyZ3M6IGFueVtdKSB7XG5cdFx0XHR0aGlzLnBvc3RNZXNzYWdlKCdjb21tYW5kJywgeyBjb21tYW5kLCBhcmdzIH0pO1xuXHRcdH1cblx0fTtcbn07XG5cbiIsIi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG5pbXBvcnQgeyBnZXRTZXR0aW5ncyB9IGZyb20gJy4vc2V0dGluZ3MnO1xuXG5cbmZ1bmN0aW9uIGNsYW1wKG1pbjogbnVtYmVyLCBtYXg6IG51bWJlciwgdmFsdWU6IG51bWJlcikge1xuXHRyZXR1cm4gTWF0aC5taW4obWF4LCBNYXRoLm1heChtaW4sIHZhbHVlKSk7XG59XG5cbmZ1bmN0aW9uIGNsYW1wTGluZShsaW5lOiBudW1iZXIpIHtcblx0cmV0dXJuIGNsYW1wKDAsIGdldFNldHRpbmdzKCkubGluZUNvdW50IC0gMSwgbGluZSk7XG59XG5cblxuZXhwb3J0IGludGVyZmFjZSBDb2RlTGluZUVsZW1lbnQge1xuXHRlbGVtZW50OiBIVE1MRWxlbWVudDtcblx0bGluZTogbnVtYmVyO1xufVxuXG5jb25zdCBnZXRDb2RlTGluZUVsZW1lbnRzID0gKCgpID0+IHtcblx0bGV0IGVsZW1lbnRzOiBDb2RlTGluZUVsZW1lbnRbXTtcblx0cmV0dXJuICgpID0+IHtcblx0XHRpZiAoIWVsZW1lbnRzKSB7XG5cdFx0XHRlbGVtZW50cyA9IEFycmF5LnByb3RvdHlwZS5tYXAuY2FsbChcblx0XHRcdFx0ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnY29kZS1saW5lJyksXG5cdFx0XHRcdChlbGVtZW50OiBhbnkpID0+IHtcblx0XHRcdFx0XHRjb25zdCBsaW5lID0gK2VsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLWxpbmUnKTtcblx0XHRcdFx0XHRyZXR1cm4geyBlbGVtZW50LCBsaW5lIH07XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC5maWx0ZXIoKHg6IGFueSkgPT4gIWlzTmFOKHgubGluZSkpO1xuXHRcdH1cblx0XHRyZXR1cm4gZWxlbWVudHM7XG5cdH07XG59KSgpO1xuXG4vKipcbiAqIEZpbmQgdGhlIGh0bWwgZWxlbWVudHMgdGhhdCBtYXAgdG8gYSBzcGVjaWZpYyB0YXJnZXQgbGluZSBpbiB0aGUgZWRpdG9yLlxuICpcbiAqIElmIGFuIGV4YWN0IG1hdGNoLCByZXR1cm5zIGEgc2luZ2xlIGVsZW1lbnQuIElmIHRoZSBsaW5lIGlzIGJldHdlZW4gZWxlbWVudHMsXG4gKiByZXR1cm5zIHRoZSBlbGVtZW50IHByaW9yIHRvIGFuZCB0aGUgZWxlbWVudCBhZnRlciB0aGUgZ2l2ZW4gbGluZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEVsZW1lbnRzRm9yU291cmNlTGluZSh0YXJnZXRMaW5lOiBudW1iZXIpOiB7IHByZXZpb3VzOiBDb2RlTGluZUVsZW1lbnQ7IG5leHQ/OiBDb2RlTGluZUVsZW1lbnQ7IH0ge1xuXHRjb25zdCBsaW5lTnVtYmVyID0gTWF0aC5mbG9vcih0YXJnZXRMaW5lKTtcblx0Y29uc3QgbGluZXMgPSBnZXRDb2RlTGluZUVsZW1lbnRzKCk7XG5cdGxldCBwcmV2aW91cyA9IGxpbmVzWzBdIHx8IG51bGw7XG5cdGZvciAoY29uc3QgZW50cnkgb2YgbGluZXMpIHtcblx0XHRpZiAoZW50cnkubGluZSA9PT0gbGluZU51bWJlcikge1xuXHRcdFx0cmV0dXJuIHsgcHJldmlvdXM6IGVudHJ5LCBuZXh0OiB1bmRlZmluZWQgfTtcblx0XHR9XG5cdFx0ZWxzZSBpZiAoZW50cnkubGluZSA+IGxpbmVOdW1iZXIpIHtcblx0XHRcdHJldHVybiB7IHByZXZpb3VzLCBuZXh0OiBlbnRyeSB9O1xuXHRcdH1cblx0XHRwcmV2aW91cyA9IGVudHJ5O1xuXHR9XG5cdHJldHVybiB7IHByZXZpb3VzIH07XG59XG5cbi8qKlxuICogRmluZCB0aGUgaHRtbCBlbGVtZW50cyB0aGF0IGFyZSBhdCBhIHNwZWNpZmljIHBpeGVsIG9mZnNldCBvbiB0aGUgcGFnZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldExpbmVFbGVtZW50c0F0UGFnZU9mZnNldChvZmZzZXQ6IG51bWJlcik6IHsgcHJldmlvdXM6IENvZGVMaW5lRWxlbWVudDsgbmV4dD86IENvZGVMaW5lRWxlbWVudDsgfSB7XG5cdGNvbnN0IGxpbmVzID0gZ2V0Q29kZUxpbmVFbGVtZW50cygpO1xuXHRjb25zdCBwb3NpdGlvbiA9IG9mZnNldCAtIHdpbmRvdy5zY3JvbGxZO1xuXHRsZXQgbG8gPSAtMTtcblx0bGV0IGhpID0gbGluZXMubGVuZ3RoIC0gMTtcblx0d2hpbGUgKGxvICsgMSA8IGhpKSB7XG5cdFx0Y29uc3QgbWlkID0gTWF0aC5mbG9vcigobG8gKyBoaSkgLyAyKTtcblx0XHRjb25zdCBib3VuZHMgPSBsaW5lc1ttaWRdLmVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cdFx0aWYgKGJvdW5kcy50b3AgKyBib3VuZHMuaGVpZ2h0ID49IHBvc2l0aW9uKSB7XG5cdFx0XHRoaSA9IG1pZDtcblx0XHR9XG5cdFx0ZWxzZSB7XG5cdFx0XHRsbyA9IG1pZDtcblx0XHR9XG5cdH1cblx0Y29uc3QgaGlFbGVtZW50ID0gbGluZXNbaGldO1xuXHRjb25zdCBoaUJvdW5kcyA9IGhpRWxlbWVudC5lbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXHRpZiAoaGkgPj0gMSAmJiBoaUJvdW5kcy50b3AgPiBwb3NpdGlvbikge1xuXHRcdGNvbnN0IGxvRWxlbWVudCA9IGxpbmVzW2xvXTtcblx0XHRyZXR1cm4geyBwcmV2aW91czogbG9FbGVtZW50LCBuZXh0OiBoaUVsZW1lbnQgfTtcblx0fVxuXHRyZXR1cm4geyBwcmV2aW91czogaGlFbGVtZW50IH07XG59XG5cbi8qKlxuICogQXR0ZW1wdCB0byByZXZlYWwgdGhlIGVsZW1lbnQgZm9yIGEgc291cmNlIGxpbmUgaW4gdGhlIGVkaXRvci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNjcm9sbFRvUmV2ZWFsU291cmNlTGluZShsaW5lOiBudW1iZXIpIHtcblx0Y29uc3QgeyBwcmV2aW91cywgbmV4dCB9ID0gZ2V0RWxlbWVudHNGb3JTb3VyY2VMaW5lKGxpbmUpO1xuXHRpZiAocHJldmlvdXMgJiYgZ2V0U2V0dGluZ3MoKS5zY3JvbGxQcmV2aWV3V2l0aEVkaXRvcikge1xuXHRcdGxldCBzY3JvbGxUbyA9IDA7XG5cdFx0Y29uc3QgcmVjdCA9IHByZXZpb3VzLmVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cdFx0Y29uc3QgcHJldmlvdXNUb3AgPSByZWN0LnRvcDtcblx0XHRpZiAobmV4dCAmJiBuZXh0LmxpbmUgIT09IHByZXZpb3VzLmxpbmUpIHtcblx0XHRcdC8vIEJldHdlZW4gdHdvIGVsZW1lbnRzLiBHbyB0byBwZXJjZW50YWdlIG9mZnNldCBiZXR3ZWVuIHRoZW0uXG5cdFx0XHRjb25zdCBiZXR3ZWVuUHJvZ3Jlc3MgPSAobGluZSAtIHByZXZpb3VzLmxpbmUpIC8gKG5leHQubGluZSAtIHByZXZpb3VzLmxpbmUpO1xuXHRcdFx0Y29uc3QgZWxlbWVudE9mZnNldCA9IG5leHQuZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3AgLSBwcmV2aW91c1RvcDtcblx0XHRcdHNjcm9sbFRvID0gcHJldmlvdXNUb3AgKyBiZXR3ZWVuUHJvZ3Jlc3MgKiBlbGVtZW50T2Zmc2V0O1xuXHRcdH1cblx0XHRlbHNlIHtcblx0XHRcdHNjcm9sbFRvID0gcHJldmlvdXNUb3A7XG5cdFx0fVxuXHRcdHdpbmRvdy5zY3JvbGwoMCwgTWF0aC5tYXgoMSwgd2luZG93LnNjcm9sbFkgKyBzY3JvbGxUbykpO1xuXHR9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRFZGl0b3JMaW5lTnVtYmVyRm9yUGFnZU9mZnNldChvZmZzZXQ6IG51bWJlcikge1xuXHRjb25zdCB7IHByZXZpb3VzLCBuZXh0IH0gPSBnZXRMaW5lRWxlbWVudHNBdFBhZ2VPZmZzZXQob2Zmc2V0KTtcblx0aWYgKHByZXZpb3VzKSB7XG5cdFx0Y29uc3QgcHJldmlvdXNCb3VuZHMgPSBwcmV2aW91cy5lbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXHRcdGNvbnN0IG9mZnNldEZyb21QcmV2aW91cyA9IChvZmZzZXQgLSB3aW5kb3cuc2Nyb2xsWSAtIHByZXZpb3VzQm91bmRzLnRvcCk7XG5cdFx0aWYgKG5leHQpIHtcblx0XHRcdGNvbnN0IHByb2dyZXNzQmV0d2VlbkVsZW1lbnRzID0gb2Zmc2V0RnJvbVByZXZpb3VzIC8gKG5leHQuZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3AgLSBwcmV2aW91c0JvdW5kcy50b3ApO1xuXHRcdFx0Y29uc3QgbGluZSA9IHByZXZpb3VzLmxpbmUgKyBwcm9ncmVzc0JldHdlZW5FbGVtZW50cyAqIChuZXh0LmxpbmUgLSBwcmV2aW91cy5saW5lKTtcblx0XHRcdHJldHVybiBjbGFtcExpbmUobGluZSk7XG5cdFx0fVxuXHRcdGVsc2Uge1xuXHRcdFx0Y29uc3QgcHJvZ3Jlc3NXaXRoaW5FbGVtZW50ID0gb2Zmc2V0RnJvbVByZXZpb3VzIC8gKHByZXZpb3VzQm91bmRzLmhlaWdodCk7XG5cdFx0XHRjb25zdCBsaW5lID0gcHJldmlvdXMubGluZSArIHByb2dyZXNzV2l0aGluRWxlbWVudDtcblx0XHRcdHJldHVybiBjbGFtcExpbmUobGluZSk7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBudWxsO1xufVxuIiwiLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqICBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqICBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbmV4cG9ydCBpbnRlcmZhY2UgUHJldmlld1NldHRpbmdzIHtcblx0c291cmNlOiBzdHJpbmc7XG5cdGxpbmU6IG51bWJlcjtcblx0bGluZUNvdW50OiBudW1iZXI7XG5cdHNjcm9sbFByZXZpZXdXaXRoRWRpdG9yPzogYm9vbGVhbjtcblx0c2Nyb2xsRWRpdG9yV2l0aFByZXZpZXc6IGJvb2xlYW47XG5cdGRpc2FibGVTZWN1cml0eVdhcm5pbmdzOiBib29sZWFuO1xuXHRkb3VibGVDbGlja1RvU3dpdGNoVG9FZGl0b3I6IGJvb2xlYW47XG59XG5cbmxldCBjYWNoZWRTZXR0aW5nczogUHJldmlld1NldHRpbmdzIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2V0dGluZ3MoKTogUHJldmlld1NldHRpbmdzIHtcblx0aWYgKGNhY2hlZFNldHRpbmdzKSB7XG5cdFx0cmV0dXJuIGNhY2hlZFNldHRpbmdzO1xuXHR9XG5cblx0Y29uc3QgZWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd2c2NvZGUtbWFya2Rvd24tcHJldmlldy1kYXRhJyk7XG5cdGlmIChlbGVtZW50KSB7XG5cdFx0Y29uc3QgZGF0YSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLXNldHRpbmdzJyk7XG5cdFx0aWYgKGRhdGEpIHtcblx0XHRcdGNhY2hlZFNldHRpbmdzID0gSlNPTi5wYXJzZShkYXRhKTtcblx0XHRcdHJldHVybiBjYWNoZWRTZXR0aW5ncyE7XG5cdFx0fVxuXHR9XG5cblx0dGhyb3cgbmV3IEVycm9yKCdDb3VsZCBub3QgbG9hZCBzZXR0aW5ncycpO1xufVxuIl0sInNvdXJjZVJvb3QiOiIifQ== \ No newline at end of file +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC50aHJvdHRsZS9pbmRleC5qcyIsIndlYnBhY2s6Ly8vKHdlYnBhY2spL2J1aWxkaW4vZ2xvYmFsLmpzIiwid2VicGFjazovLy8uL3ByZXZpZXctc3JjL2FjdGl2ZUxpbmVNYXJrZXIudHMiLCJ3ZWJwYWNrOi8vLy4vcHJldmlldy1zcmMvZXZlbnRzLnRzIiwid2VicGFjazovLy8uL3ByZXZpZXctc3JjL2luZGV4LnRzIiwid2VicGFjazovLy8uL3ByZXZpZXctc3JjL21lc3NhZ2luZy50cyIsIndlYnBhY2s6Ly8vLi9wcmV2aWV3LXNyYy9zY3JvbGwtc3luYy50cyIsIndlYnBhY2s6Ly8vLi9wcmV2aWV3LXNyYy9zZXR0aW5ncy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQSx5REFBaUQsY0FBYztBQUMvRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxtQ0FBMkIsMEJBQTBCLEVBQUU7QUFDdkQseUNBQWlDLGVBQWU7QUFDaEQ7QUFDQTtBQUNBOztBQUVBO0FBQ0EsOERBQXNELCtEQUErRDs7QUFFckg7QUFDQTs7O0FBR0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDbkVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxPQUFPO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFNBQVM7QUFDcEIsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsT0FBTyxZQUFZO0FBQzlCLFdBQVcsUUFBUTtBQUNuQjtBQUNBLFdBQVcsT0FBTztBQUNsQjtBQUNBLFdBQVcsUUFBUTtBQUNuQjtBQUNBLGFBQWEsU0FBUztBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBLDhDQUE4QyxrQkFBa0I7QUFDaEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFNBQVM7QUFDcEIsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsT0FBTyxZQUFZO0FBQzlCLFdBQVcsUUFBUTtBQUNuQjtBQUNBLFdBQVcsUUFBUTtBQUNuQjtBQUNBLGFBQWEsU0FBUztBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtREFBbUQsb0JBQW9CO0FBQ3ZFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEVBQUU7QUFDYixhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBLGdCQUFnQjtBQUNoQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsRUFBRTtBQUNiLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0Esb0JBQW9CO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEVBQUU7QUFDYixhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxFQUFFO0FBQ2IsYUFBYSxPQUFPO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOzs7Ozs7Ozs7Ozs7O0FDdGJBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsNENBQTRDOztBQUU1Qzs7Ozs7Ozs7Ozs7Ozs7O0FDbkJBOzs7Z0dBR2dHO0FBQ2hHLCtGQUF5RDtBQUV6RDtJQUdDLDhCQUE4QixDQUFDLElBQVk7UUFDMUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxHQUFHLHNDQUF3QixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3BELElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxJQUFJLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBRUQsT0FBTyxDQUFDLE1BQStCO1FBQ3RDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDekMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2hDLElBQUksQ0FBQyxRQUFRLEdBQUcsTUFBTSxDQUFDO0lBQ3hCLENBQUM7SUFFRCxvQkFBb0IsQ0FBQyxPQUFnQztRQUNwRCxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7WUFDZCxNQUFNLENBQUM7UUFDUixDQUFDO1FBQ0QsT0FBTyxDQUFDLFNBQVMsR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyx1QkFBdUIsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUM1RSxDQUFDO0lBRUQsa0JBQWtCLENBQUMsT0FBZ0M7UUFDbEQsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1lBQ2QsTUFBTSxDQUFDO1FBQ1IsQ0FBQztRQUNELE9BQU8sQ0FBQyxTQUFTLElBQUksbUJBQW1CLENBQUM7SUFDMUMsQ0FBQztDQUNEO0FBM0JELDRDQTJCQzs7Ozs7Ozs7Ozs7Ozs7QUNqQ0Q7OztnR0FHZ0c7O0FBRWhHLDRCQUFtQyxDQUFhO0lBQy9DLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxVQUFVLEtBQUssU0FBUyxJQUFJLFFBQVEsQ0FBQyxVQUFVLEtBQUssZUFBZSxDQUFDLENBQUMsQ0FBQztRQUNsRixRQUFRLENBQUMsZ0JBQWdCLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUFDLElBQUksQ0FBQyxDQUFDO1FBQ1AsQ0FBQyxFQUFFLENBQUM7SUFDTCxDQUFDO0FBQ0YsQ0FBQztBQU5ELGdEQU1DOzs7Ozs7Ozs7Ozs7OztBQ1hEOzs7Z0dBR2dHOztBQUVoRyw4R0FBc0Q7QUFDdEQsZ0ZBQThDO0FBQzlDLHlGQUFvRDtBQUNwRCwrRkFBMkY7QUFDM0Ysc0ZBQWtEO0FBQ2xELHVHQUE2QztBQUk3QyxJQUFJLGNBQWMsR0FBRyxJQUFJLENBQUM7QUFDMUIsTUFBTSxNQUFNLEdBQUcsSUFBSSxtQ0FBZ0IsRUFBRSxDQUFDO0FBQ3RDLE1BQU0sUUFBUSxHQUFHLHNCQUFXLEVBQUUsQ0FBQztBQUUvQixNQUFNLE1BQU0sR0FBRyxnQkFBZ0IsRUFBRSxDQUFDO0FBRWxDLG9CQUFvQjtBQUNwQixNQUFNLEtBQUssR0FBRyxrQkFBTyxDQUFDLFlBQVksQ0FBQyxDQUFDO0FBQ3BDLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7QUFFdkIsTUFBTSxTQUFTLEdBQUcsaUNBQXFCLENBQUMsTUFBTSxDQUFDLENBQUM7QUFFaEQsTUFBTSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUM7QUFDdkMsTUFBTSxDQUFDLG1CQUFtQixDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUVoRCwyQkFBa0IsQ0FBQyxHQUFHLEVBQUU7SUFDdkIsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLHVCQUF1QixDQUFDLENBQUMsQ0FBQztRQUN0QyxVQUFVLENBQUMsR0FBRyxFQUFFO1lBQ2YsTUFBTSxXQUFXLEdBQUcsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDO1lBQ25DLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDekIsY0FBYyxHQUFHLElBQUksQ0FBQztnQkFDdEIsc0NBQXdCLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDdkMsQ0FBQztRQUNGLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7QUFDRixDQUFDLENBQUMsQ0FBQztBQUVILE1BQU0sWUFBWSxHQUFHLENBQUMsR0FBRyxFQUFFO0lBQzFCLE1BQU0sUUFBUSxHQUFHLFFBQVEsQ0FBQyxDQUFDLElBQVksRUFBRSxFQUFFO1FBQzFDLGNBQWMsR0FBRyxJQUFJLENBQUM7UUFDdEIsc0NBQXdCLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDaEMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBRVAsTUFBTSxDQUFDLENBQUMsSUFBWSxFQUFFLFFBQWEsRUFBRSxFQUFFO1FBQ3RDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNsQixRQUFRLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztZQUNyQixRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDaEIsQ0FBQztJQUNGLENBQUMsQ0FBQztBQUNILENBQUMsQ0FBQyxFQUFFLENBQUM7QUFFTCxNQUFNLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxFQUFFLEdBQUcsRUFBRTtJQUN0QyxjQUFjLEdBQUcsSUFBSSxDQUFDO0FBQ3ZCLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUVULE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLEVBQUU7SUFDMUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLEtBQUssUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFDM0MsTUFBTSxDQUFDO0lBQ1IsQ0FBQztJQUVELE1BQU0sQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUN6QixLQUFLLGdDQUFnQztZQUNwQyxNQUFNLENBQUMsOEJBQThCLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN2RCxLQUFLLENBQUM7UUFFUCxLQUFLLFlBQVk7WUFDaEIsWUFBWSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQ3hDLEtBQUssQ0FBQztJQUNSLENBQUM7QUFDRixDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFFVixRQUFRLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxFQUFFO0lBQzdDLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLDJCQUEyQixDQUFDLENBQUMsQ0FBQztRQUMzQyxNQUFNLENBQUM7SUFDUixDQUFDO0lBRUQseUJBQXlCO0lBQ3pCLEdBQUcsQ0FBQyxDQUFDLElBQUksSUFBSSxHQUFHLEtBQUssQ0FBQyxNQUFxQixFQUFFLElBQUksRUFBRSxJQUFJLEdBQUcsSUFBSSxDQUFDLFVBQXlCLEVBQUUsQ0FBQztRQUMxRixFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDMUIsTUFBTSxDQUFDO1FBQ1IsQ0FBQztJQUNGLENBQUM7SUFFRCxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDO0lBQzNCLE1BQU0sSUFBSSxHQUFHLDhDQUFnQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3RELEVBQUUsQ0FBQyxDQUFDLE9BQU8sSUFBSSxLQUFLLFFBQVEsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDOUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxVQUFVLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDL0QsQ0FBQztBQUNGLENBQUMsQ0FBQyxDQUFDO0FBRUgsUUFBUSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsRUFBRTtJQUMxQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDWixNQUFNLENBQUM7SUFDUixDQUFDO0lBRUQsSUFBSSxJQUFJLEdBQVEsS0FBSyxDQUFDLE1BQU0sQ0FBQztJQUM3QixPQUFPLElBQUksRUFBRSxDQUFDO1FBQ2IsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsT0FBTyxLQUFLLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUN2RCxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQy9DLEtBQUssQ0FBQztZQUNQLENBQUM7WUFDRCxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDakYsTUFBTSxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxnQ0FBZ0MsRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQzVGLFNBQVMsQ0FBQyxXQUFXLENBQUMsNEJBQTRCLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQzFFLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztnQkFDdkIsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO2dCQUN4QixLQUFLLENBQUM7WUFDUCxDQUFDO1lBQ0QsS0FBSyxDQUFDO1FBQ1AsQ0FBQztRQUNELElBQUksR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDO0lBQ3hCLENBQUM7QUFDRixDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFFVCxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxDQUFDO0lBQ3RDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLEdBQUcsRUFBRTtRQUMvQyxFQUFFLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDO1lBQ3BCLGNBQWMsR0FBRyxLQUFLLENBQUM7UUFDeEIsQ0FBQztRQUFDLElBQUksQ0FBQyxDQUFDO1lBQ1AsTUFBTSxJQUFJLEdBQUcsOENBQWdDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQzlELEVBQUUsQ0FBQyxDQUFDLE9BQU8sSUFBSSxLQUFLLFFBQVEsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzlDLFNBQVMsQ0FBQyxXQUFXLENBQUMsWUFBWSxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUMvQyxDQUFDO1FBQ0YsQ0FBQztJQUNGLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ1QsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7QUNqSUQ7OztnR0FHZ0c7O0FBRWhHLHNGQUF5QztBQWU1Qiw2QkFBcUIsR0FBRyxDQUFDLE1BQVcsRUFBRSxFQUFFO0lBQ3BELE1BQU0sQ0FBQyxJQUFJO1FBQ1YsV0FBVyxDQUFDLElBQVksRUFBRSxJQUFZO1lBQ3JDLE1BQU0sQ0FBQyxXQUFXLENBQUM7Z0JBQ2xCLElBQUk7Z0JBQ0osTUFBTSxFQUFFLHNCQUFXLEVBQUUsQ0FBQyxNQUFNO2dCQUM1QixJQUFJO2FBQ0osQ0FBQyxDQUFDO1FBQ0osQ0FBQztRQUNELFdBQVcsQ0FBQyxPQUFlLEVBQUUsSUFBVztZQUN2QyxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ2hELENBQUM7S0FDRCxDQUFDO0FBQ0gsQ0FBQyxDQUFDOzs7Ozs7Ozs7Ozs7OztBQ2pDRjs7O2dHQUdnRzs7QUFFaEcsc0ZBQXlDO0FBR3pDLGVBQWUsR0FBVyxFQUFFLEdBQVcsRUFBRSxLQUFhO0lBQ3JELE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBQzVDLENBQUM7QUFFRCxtQkFBbUIsSUFBWTtJQUM5QixNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxzQkFBVyxFQUFFLENBQUMsU0FBUyxHQUFHLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUNwRCxDQUFDO0FBUUQsTUFBTSxtQkFBbUIsR0FBRyxDQUFDLEdBQUcsRUFBRTtJQUNqQyxJQUFJLFFBQTJCLENBQUM7SUFDaEMsTUFBTSxDQUFDLEdBQUcsRUFBRTtRQUNYLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztZQUNmLFFBQVEsR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQ2xDLFFBQVEsQ0FBQyxzQkFBc0IsQ0FBQyxXQUFXLENBQUMsRUFDNUMsQ0FBQyxPQUFZLEVBQUUsRUFBRTtnQkFDaEIsTUFBTSxJQUFJLEdBQUcsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxDQUFDO2dCQUNoRCxNQUFNLENBQUMsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUM7WUFDMUIsQ0FBQyxDQUFDO2lCQUNELE1BQU0sQ0FBQyxDQUFDLENBQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDdEMsQ0FBQztRQUNELE1BQU0sQ0FBQyxRQUFRLENBQUM7SUFDakIsQ0FBQyxDQUFDO0FBQ0gsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUVMOzs7OztHQUtHO0FBQ0gsa0NBQXlDLFVBQWtCO0lBQzFELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDMUMsTUFBTSxLQUFLLEdBQUcsbUJBQW1CLEVBQUUsQ0FBQztJQUNwQyxJQUFJLFFBQVEsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDO0lBQ2hDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sS0FBSyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDM0IsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxVQUFVLENBQUMsQ0FBQyxDQUFDO1lBQy9CLE1BQU0sQ0FBQyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDO1FBQzdDLENBQUM7UUFDRCxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDO1lBQ2xDLE1BQU0sQ0FBQyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUM7UUFDbEMsQ0FBQztRQUNELFFBQVEsR0FBRyxLQUFLLENBQUM7SUFDbEIsQ0FBQztJQUNELE1BQU0sQ0FBQyxFQUFFLFFBQVEsRUFBRSxDQUFDO0FBQ3JCLENBQUM7QUFkRCw0REFjQztBQUVEOztHQUVHO0FBQ0gscUNBQTRDLE1BQWM7SUFDekQsTUFBTSxLQUFLLEdBQUcsbUJBQW1CLEVBQUUsQ0FBQztJQUNwQyxNQUFNLFFBQVEsR0FBRyxNQUFNLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQztJQUN6QyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUNaLElBQUksRUFBRSxHQUFHLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBQzFCLE9BQU8sRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQztRQUNwQixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ3RDLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUMxRCxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxHQUFHLE1BQU0sQ0FBQyxNQUFNLElBQUksUUFBUSxDQUFDLENBQUMsQ0FBQztZQUM1QyxFQUFFLEdBQUcsR0FBRyxDQUFDO1FBQ1YsQ0FBQztRQUNELElBQUksQ0FBQyxDQUFDO1lBQ0wsRUFBRSxHQUFHLEdBQUcsQ0FBQztRQUNWLENBQUM7SUFDRixDQUFDO0lBQ0QsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQzVCLE1BQU0sUUFBUSxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMscUJBQXFCLEVBQUUsQ0FBQztJQUMzRCxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLFFBQVEsQ0FBQyxHQUFHLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQztRQUN4QyxNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDNUIsTUFBTSxDQUFDLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUM7SUFDakQsQ0FBQztJQUNELE1BQU0sQ0FBQyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsQ0FBQztBQUNoQyxDQUFDO0FBdEJELGtFQXNCQztBQUVEOztHQUVHO0FBQ0gsa0NBQXlDLElBQVk7SUFDcEQsTUFBTSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsR0FBRyx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMxRCxFQUFFLENBQUMsQ0FBQyxRQUFRLElBQUksc0JBQVcsRUFBRSxDQUFDLHVCQUF1QixDQUFDLENBQUMsQ0FBQztRQUN2RCxJQUFJLFFBQVEsR0FBRyxDQUFDLENBQUM7UUFDakIsTUFBTSxJQUFJLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1FBQ3RELE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUM7UUFDN0IsRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDekMsOERBQThEO1lBQzlELE1BQU0sZUFBZSxHQUFHLENBQUMsSUFBSSxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzdFLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMscUJBQXFCLEVBQUUsQ0FBQyxHQUFHLEdBQUcsV0FBVyxDQUFDO1lBQzdFLFFBQVEsR0FBRyxXQUFXLEdBQUcsZUFBZSxHQUFHLGFBQWEsQ0FBQztRQUMxRCxDQUFDO1FBQ0QsSUFBSSxDQUFDLENBQUM7WUFDTCxRQUFRLEdBQUcsV0FBVyxDQUFDO1FBQ3hCLENBQUM7UUFDRCxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsT0FBTyxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUM7SUFDMUQsQ0FBQztBQUNGLENBQUM7QUFqQkQsNERBaUJDO0FBRUQsMENBQWlELE1BQWM7SUFDOUQsTUFBTSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsR0FBRywyQkFBMkIsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUMvRCxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1FBQ2QsTUFBTSxjQUFjLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1FBQ2hFLE1BQU0sa0JBQWtCLEdBQUcsQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLE9BQU8sR0FBRyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDMUUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUNWLE1BQU0sdUJBQXVCLEdBQUcsa0JBQWtCLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLHFCQUFxQixFQUFFLENBQUMsR0FBRyxHQUFHLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNySCxNQUFNLElBQUksR0FBRyxRQUFRLENBQUMsSUFBSSxHQUFHLHVCQUF1QixHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDbkYsTUFBTSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN4QixDQUFDO1FBQ0QsSUFBSSxDQUFDLENBQUM7WUFDTCxNQUFNLHFCQUFxQixHQUFHLGtCQUFrQixHQUFHLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzNFLE1BQU0sSUFBSSxHQUFHLFFBQVEsQ0FBQyxJQUFJLEdBQUcscUJBQXFCLENBQUM7WUFDbkQsTUFBTSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN4QixDQUFDO0lBQ0YsQ0FBQztJQUNELE1BQU0sQ0FBQyxJQUFJLENBQUM7QUFDYixDQUFDO0FBakJELDRFQWlCQzs7Ozs7Ozs7Ozs7Ozs7QUM5SEQ7OztnR0FHZ0c7O0FBWWhHLElBQUksY0FBYyxHQUFnQyxTQUFTLENBQUM7QUFFNUQsaUJBQXdCLEdBQVc7SUFDbEMsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDLGNBQWMsQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDO0lBQ3hFLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFDYixNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3ZDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDVixNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN6QixDQUFDO0lBQ0YsQ0FBQztJQUVELE1BQU0sSUFBSSxLQUFLLENBQUMsMkJBQTJCLEdBQUcsRUFBRSxDQUFDLENBQUM7QUFDbkQsQ0FBQztBQVZELDBCQVVDO0FBRUQ7SUFDQyxFQUFFLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDO1FBQ3BCLE1BQU0sQ0FBQyxjQUFjLENBQUM7SUFDdkIsQ0FBQztJQUVELGNBQWMsR0FBRyxPQUFPLENBQUMsZUFBZSxDQUFDLENBQUM7SUFDMUMsRUFBRSxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQztRQUNwQixNQUFNLENBQUMsY0FBYyxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxNQUFNLElBQUksS0FBSyxDQUFDLHlCQUF5QixDQUFDLENBQUM7QUFDNUMsQ0FBQztBQVhELGtDQVdDIiwiZmlsZSI6ImluZGV4LmpzIiwic291cmNlc0NvbnRlbnQiOlsiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbiBcdFx0fVxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0aTogbW9kdWxlSWQsXG4gXHRcdFx0bDogZmFsc2UsXG4gXHRcdFx0ZXhwb3J0czoge31cbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbiBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7XG4gXHRcdFx0XHRjb25maWd1cmFibGU6IGZhbHNlLFxuIFx0XHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcbiBcdFx0XHRcdGdldDogZ2V0dGVyXG4gXHRcdFx0fSk7XG4gXHRcdH1cbiBcdH07XG5cbiBcdC8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uciA9IGZ1bmN0aW9uKGV4cG9ydHMpIHtcbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbiBcdH07XG5cbiBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbiBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbiBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4gXHRcdHJldHVybiBnZXR0ZXI7XG4gXHR9O1xuXG4gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcblxuIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbiBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG5cblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSBcIi4vcHJldmlldy1zcmMvaW5kZXgudHNcIik7XG4iLCIvKipcbiAqIGxvZGFzaCAoQ3VzdG9tIEJ1aWxkKSA8aHR0cHM6Ly9sb2Rhc2guY29tLz5cbiAqIEJ1aWxkOiBgbG9kYXNoIG1vZHVsYXJpemUgZXhwb3J0cz1cIm5wbVwiIC1vIC4vYFxuICogQ29weXJpZ2h0IGpRdWVyeSBGb3VuZGF0aW9uIGFuZCBvdGhlciBjb250cmlidXRvcnMgPGh0dHBzOi8vanF1ZXJ5Lm9yZy8+XG4gKiBSZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZSA8aHR0cHM6Ly9sb2Rhc2guY29tL2xpY2Vuc2U+XG4gKiBCYXNlZCBvbiBVbmRlcnNjb3JlLmpzIDEuOC4zIDxodHRwOi8vdW5kZXJzY29yZWpzLm9yZy9MSUNFTlNFPlxuICogQ29weXJpZ2h0IEplcmVteSBBc2hrZW5hcywgRG9jdW1lbnRDbG91ZCBhbmQgSW52ZXN0aWdhdGl2ZSBSZXBvcnRlcnMgJiBFZGl0b3JzXG4gKi9cblxuLyoqIFVzZWQgYXMgdGhlIGBUeXBlRXJyb3JgIG1lc3NhZ2UgZm9yIFwiRnVuY3Rpb25zXCIgbWV0aG9kcy4gKi9cbnZhciBGVU5DX0VSUk9SX1RFWFQgPSAnRXhwZWN0ZWQgYSBmdW5jdGlvbic7XG5cbi8qKiBVc2VkIGFzIHJlZmVyZW5jZXMgZm9yIHZhcmlvdXMgYE51bWJlcmAgY29uc3RhbnRzLiAqL1xudmFyIE5BTiA9IDAgLyAwO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgc3ltYm9sVGFnID0gJ1tvYmplY3QgU3ltYm9sXSc7XG5cbi8qKiBVc2VkIHRvIG1hdGNoIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2UuICovXG52YXIgcmVUcmltID0gL15cXHMrfFxccyskL2c7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCBiYWQgc2lnbmVkIGhleGFkZWNpbWFsIHN0cmluZyB2YWx1ZXMuICovXG52YXIgcmVJc0JhZEhleCA9IC9eWy0rXTB4WzAtOWEtZl0rJC9pO1xuXG4vKiogVXNlZCB0byBkZXRlY3QgYmluYXJ5IHN0cmluZyB2YWx1ZXMuICovXG52YXIgcmVJc0JpbmFyeSA9IC9eMGJbMDFdKyQvaTtcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IG9jdGFsIHN0cmluZyB2YWx1ZXMuICovXG52YXIgcmVJc09jdGFsID0gL14wb1swLTddKyQvaTtcblxuLyoqIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIHdpdGhvdXQgYSBkZXBlbmRlbmN5IG9uIGByb290YC4gKi9cbnZhciBmcmVlUGFyc2VJbnQgPSBwYXJzZUludDtcblxuLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBnbG9iYWxgIGZyb20gTm9kZS5qcy4gKi9cbnZhciBmcmVlR2xvYmFsID0gdHlwZW9mIGdsb2JhbCA9PSAnb2JqZWN0JyAmJiBnbG9iYWwgJiYgZ2xvYmFsLk9iamVjdCA9PT0gT2JqZWN0ICYmIGdsb2JhbDtcblxuLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBzZWxmYC4gKi9cbnZhciBmcmVlU2VsZiA9IHR5cGVvZiBzZWxmID09ICdvYmplY3QnICYmIHNlbGYgJiYgc2VsZi5PYmplY3QgPT09IE9iamVjdCAmJiBzZWxmO1xuXG4vKiogVXNlZCBhcyBhIHJlZmVyZW5jZSB0byB0aGUgZ2xvYmFsIG9iamVjdC4gKi9cbnZhciByb290ID0gZnJlZUdsb2JhbCB8fCBmcmVlU2VsZiB8fCBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKipcbiAqIFVzZWQgdG8gcmVzb2x2ZSB0aGVcbiAqIFtgdG9TdHJpbmdUYWdgXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1vYmplY3QucHJvdG90eXBlLnRvc3RyaW5nKVxuICogb2YgdmFsdWVzLlxuICovXG52YXIgb2JqZWN0VG9TdHJpbmcgPSBvYmplY3RQcm90by50b1N0cmluZztcblxuLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgZm9yIHRob3NlIHdpdGggdGhlIHNhbWUgbmFtZSBhcyBvdGhlciBgbG9kYXNoYCBtZXRob2RzLiAqL1xudmFyIG5hdGl2ZU1heCA9IE1hdGgubWF4LFxuICAgIG5hdGl2ZU1pbiA9IE1hdGgubWluO1xuXG4vKipcbiAqIEdldHMgdGhlIHRpbWVzdGFtcCBvZiB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0aGF0IGhhdmUgZWxhcHNlZCBzaW5jZVxuICogdGhlIFVuaXggZXBvY2ggKDEgSmFudWFyeSAxOTcwIDAwOjAwOjAwIFVUQykuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAyLjQuMFxuICogQGNhdGVnb3J5IERhdGVcbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHRpbWVzdGFtcC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5kZWZlcihmdW5jdGlvbihzdGFtcCkge1xuICogICBjb25zb2xlLmxvZyhfLm5vdygpIC0gc3RhbXApO1xuICogfSwgXy5ub3coKSk7XG4gKiAvLyA9PiBMb2dzIHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIGl0IHRvb2sgZm9yIHRoZSBkZWZlcnJlZCBpbnZvY2F0aW9uLlxuICovXG52YXIgbm93ID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiByb290LkRhdGUubm93KCk7XG59O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBkZWJvdW5jZWQgZnVuY3Rpb24gdGhhdCBkZWxheXMgaW52b2tpbmcgYGZ1bmNgIHVudGlsIGFmdGVyIGB3YWl0YFxuICogbWlsbGlzZWNvbmRzIGhhdmUgZWxhcHNlZCBzaW5jZSB0aGUgbGFzdCB0aW1lIHRoZSBkZWJvdW5jZWQgZnVuY3Rpb24gd2FzXG4gKiBpbnZva2VkLiBUaGUgZGVib3VuY2VkIGZ1bmN0aW9uIGNvbWVzIHdpdGggYSBgY2FuY2VsYCBtZXRob2QgdG8gY2FuY2VsXG4gKiBkZWxheWVkIGBmdW5jYCBpbnZvY2F0aW9ucyBhbmQgYSBgZmx1c2hgIG1ldGhvZCB0byBpbW1lZGlhdGVseSBpbnZva2UgdGhlbS5cbiAqIFByb3ZpZGUgYG9wdGlvbnNgIHRvIGluZGljYXRlIHdoZXRoZXIgYGZ1bmNgIHNob3VsZCBiZSBpbnZva2VkIG9uIHRoZVxuICogbGVhZGluZyBhbmQvb3IgdHJhaWxpbmcgZWRnZSBvZiB0aGUgYHdhaXRgIHRpbWVvdXQuIFRoZSBgZnVuY2AgaXMgaW52b2tlZFxuICogd2l0aCB0aGUgbGFzdCBhcmd1bWVudHMgcHJvdmlkZWQgdG8gdGhlIGRlYm91bmNlZCBmdW5jdGlvbi4gU3Vic2VxdWVudFxuICogY2FsbHMgdG8gdGhlIGRlYm91bmNlZCBmdW5jdGlvbiByZXR1cm4gdGhlIHJlc3VsdCBvZiB0aGUgbGFzdCBgZnVuY2BcbiAqIGludm9jYXRpb24uXG4gKlxuICogKipOb3RlOioqIElmIGBsZWFkaW5nYCBhbmQgYHRyYWlsaW5nYCBvcHRpb25zIGFyZSBgdHJ1ZWAsIGBmdW5jYCBpc1xuICogaW52b2tlZCBvbiB0aGUgdHJhaWxpbmcgZWRnZSBvZiB0aGUgdGltZW91dCBvbmx5IGlmIHRoZSBkZWJvdW5jZWQgZnVuY3Rpb25cbiAqIGlzIGludm9rZWQgbW9yZSB0aGFuIG9uY2UgZHVyaW5nIHRoZSBgd2FpdGAgdGltZW91dC5cbiAqXG4gKiBJZiBgd2FpdGAgaXMgYDBgIGFuZCBgbGVhZGluZ2AgaXMgYGZhbHNlYCwgYGZ1bmNgIGludm9jYXRpb24gaXMgZGVmZXJyZWRcbiAqIHVudGlsIHRvIHRoZSBuZXh0IHRpY2ssIHNpbWlsYXIgdG8gYHNldFRpbWVvdXRgIHdpdGggYSB0aW1lb3V0IG9mIGAwYC5cbiAqXG4gKiBTZWUgW0RhdmlkIENvcmJhY2hvJ3MgYXJ0aWNsZV0oaHR0cHM6Ly9jc3MtdHJpY2tzLmNvbS9kZWJvdW5jaW5nLXRocm90dGxpbmctZXhwbGFpbmVkLWV4YW1wbGVzLylcbiAqIGZvciBkZXRhaWxzIG92ZXIgdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gYF8uZGVib3VuY2VgIGFuZCBgXy50aHJvdHRsZWAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBkZWJvdW5jZS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbd2FpdD0wXSBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byBkZWxheS5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucz17fV0gVGhlIG9wdGlvbnMgb2JqZWN0LlxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5sZWFkaW5nPWZhbHNlXVxuICogIFNwZWNpZnkgaW52b2tpbmcgb24gdGhlIGxlYWRpbmcgZWRnZSBvZiB0aGUgdGltZW91dC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5tYXhXYWl0XVxuICogIFRoZSBtYXhpbXVtIHRpbWUgYGZ1bmNgIGlzIGFsbG93ZWQgdG8gYmUgZGVsYXllZCBiZWZvcmUgaXQncyBpbnZva2VkLlxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy50cmFpbGluZz10cnVlXVxuICogIFNwZWNpZnkgaW52b2tpbmcgb24gdGhlIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlIHRpbWVvdXQuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBkZWJvdW5jZWQgZnVuY3Rpb24uXG4gKiBAZXhhbXBsZVxuICpcbiAqIC8vIEF2b2lkIGNvc3RseSBjYWxjdWxhdGlvbnMgd2hpbGUgdGhlIHdpbmRvdyBzaXplIGlzIGluIGZsdXguXG4gKiBqUXVlcnkod2luZG93KS5vbigncmVzaXplJywgXy5kZWJvdW5jZShjYWxjdWxhdGVMYXlvdXQsIDE1MCkpO1xuICpcbiAqIC8vIEludm9rZSBgc2VuZE1haWxgIHdoZW4gY2xpY2tlZCwgZGVib3VuY2luZyBzdWJzZXF1ZW50IGNhbGxzLlxuICogalF1ZXJ5KGVsZW1lbnQpLm9uKCdjbGljaycsIF8uZGVib3VuY2Uoc2VuZE1haWwsIDMwMCwge1xuICogICAnbGVhZGluZyc6IHRydWUsXG4gKiAgICd0cmFpbGluZyc6IGZhbHNlXG4gKiB9KSk7XG4gKlxuICogLy8gRW5zdXJlIGBiYXRjaExvZ2AgaXMgaW52b2tlZCBvbmNlIGFmdGVyIDEgc2Vjb25kIG9mIGRlYm91bmNlZCBjYWxscy5cbiAqIHZhciBkZWJvdW5jZWQgPSBfLmRlYm91bmNlKGJhdGNoTG9nLCAyNTAsIHsgJ21heFdhaXQnOiAxMDAwIH0pO1xuICogdmFyIHNvdXJjZSA9IG5ldyBFdmVudFNvdXJjZSgnL3N0cmVhbScpO1xuICogalF1ZXJ5KHNvdXJjZSkub24oJ21lc3NhZ2UnLCBkZWJvdW5jZWQpO1xuICpcbiAqIC8vIENhbmNlbCB0aGUgdHJhaWxpbmcgZGVib3VuY2VkIGludm9jYXRpb24uXG4gKiBqUXVlcnkod2luZG93KS5vbigncG9wc3RhdGUnLCBkZWJvdW5jZWQuY2FuY2VsKTtcbiAqL1xuZnVuY3Rpb24gZGVib3VuY2UoZnVuYywgd2FpdCwgb3B0aW9ucykge1xuICB2YXIgbGFzdEFyZ3MsXG4gICAgICBsYXN0VGhpcyxcbiAgICAgIG1heFdhaXQsXG4gICAgICByZXN1bHQsXG4gICAgICB0aW1lcklkLFxuICAgICAgbGFzdENhbGxUaW1lLFxuICAgICAgbGFzdEludm9rZVRpbWUgPSAwLFxuICAgICAgbGVhZGluZyA9IGZhbHNlLFxuICAgICAgbWF4aW5nID0gZmFsc2UsXG4gICAgICB0cmFpbGluZyA9IHRydWU7XG5cbiAgaWYgKHR5cGVvZiBmdW5jICE9ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKEZVTkNfRVJST1JfVEVYVCk7XG4gIH1cbiAgd2FpdCA9IHRvTnVtYmVyKHdhaXQpIHx8IDA7XG4gIGlmIChpc09iamVjdChvcHRpb25zKSkge1xuICAgIGxlYWRpbmcgPSAhIW9wdGlvbnMubGVhZGluZztcbiAgICBtYXhpbmcgPSAnbWF4V2FpdCcgaW4gb3B0aW9ucztcbiAgICBtYXhXYWl0ID0gbWF4aW5nID8gbmF0aXZlTWF4KHRvTnVtYmVyKG9wdGlvbnMubWF4V2FpdCkgfHwgMCwgd2FpdCkgOiBtYXhXYWl0O1xuICAgIHRyYWlsaW5nID0gJ3RyYWlsaW5nJyBpbiBvcHRpb25zID8gISFvcHRpb25zLnRyYWlsaW5nIDogdHJhaWxpbmc7XG4gIH1cblxuICBmdW5jdGlvbiBpbnZva2VGdW5jKHRpbWUpIHtcbiAgICB2YXIgYXJncyA9IGxhc3RBcmdzLFxuICAgICAgICB0aGlzQXJnID0gbGFzdFRoaXM7XG5cbiAgICBsYXN0QXJncyA9IGxhc3RUaGlzID0gdW5kZWZpbmVkO1xuICAgIGxhc3RJbnZva2VUaW1lID0gdGltZTtcbiAgICByZXN1bHQgPSBmdW5jLmFwcGx5KHRoaXNBcmcsIGFyZ3MpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBmdW5jdGlvbiBsZWFkaW5nRWRnZSh0aW1lKSB7XG4gICAgLy8gUmVzZXQgYW55IGBtYXhXYWl0YCB0aW1lci5cbiAgICBsYXN0SW52b2tlVGltZSA9IHRpbWU7XG4gICAgLy8gU3RhcnQgdGhlIHRpbWVyIGZvciB0aGUgdHJhaWxpbmcgZWRnZS5cbiAgICB0aW1lcklkID0gc2V0VGltZW91dCh0aW1lckV4cGlyZWQsIHdhaXQpO1xuICAgIC8vIEludm9rZSB0aGUgbGVhZGluZyBlZGdlLlxuICAgIHJldHVybiBsZWFkaW5nID8gaW52b2tlRnVuYyh0aW1lKSA6IHJlc3VsdDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlbWFpbmluZ1dhaXQodGltZSkge1xuICAgIHZhciB0aW1lU2luY2VMYXN0Q2FsbCA9IHRpbWUgLSBsYXN0Q2FsbFRpbWUsXG4gICAgICAgIHRpbWVTaW5jZUxhc3RJbnZva2UgPSB0aW1lIC0gbGFzdEludm9rZVRpbWUsXG4gICAgICAgIHJlc3VsdCA9IHdhaXQgLSB0aW1lU2luY2VMYXN0Q2FsbDtcblxuICAgIHJldHVybiBtYXhpbmcgPyBuYXRpdmVNaW4ocmVzdWx0LCBtYXhXYWl0IC0gdGltZVNpbmNlTGFzdEludm9rZSkgOiByZXN1bHQ7XG4gIH1cblxuICBmdW5jdGlvbiBzaG91bGRJbnZva2UodGltZSkge1xuICAgIHZhciB0aW1lU2luY2VMYXN0Q2FsbCA9IHRpbWUgLSBsYXN0Q2FsbFRpbWUsXG4gICAgICAgIHRpbWVTaW5jZUxhc3RJbnZva2UgPSB0aW1lIC0gbGFzdEludm9rZVRpbWU7XG5cbiAgICAvLyBFaXRoZXIgdGhpcyBpcyB0aGUgZmlyc3QgY2FsbCwgYWN0aXZpdHkgaGFzIHN0b3BwZWQgYW5kIHdlJ3JlIGF0IHRoZVxuICAgIC8vIHRyYWlsaW5nIGVkZ2UsIHRoZSBzeXN0ZW0gdGltZSBoYXMgZ29uZSBiYWNrd2FyZHMgYW5kIHdlJ3JlIHRyZWF0aW5nXG4gICAgLy8gaXQgYXMgdGhlIHRyYWlsaW5nIGVkZ2UsIG9yIHdlJ3ZlIGhpdCB0aGUgYG1heFdhaXRgIGxpbWl0LlxuICAgIHJldHVybiAobGFzdENhbGxUaW1lID09PSB1bmRlZmluZWQgfHwgKHRpbWVTaW5jZUxhc3RDYWxsID49IHdhaXQpIHx8XG4gICAgICAodGltZVNpbmNlTGFzdENhbGwgPCAwKSB8fCAobWF4aW5nICYmIHRpbWVTaW5jZUxhc3RJbnZva2UgPj0gbWF4V2FpdCkpO1xuICB9XG5cbiAgZnVuY3Rpb24gdGltZXJFeHBpcmVkKCkge1xuICAgIHZhciB0aW1lID0gbm93KCk7XG4gICAgaWYgKHNob3VsZEludm9rZSh0aW1lKSkge1xuICAgICAgcmV0dXJuIHRyYWlsaW5nRWRnZSh0aW1lKTtcbiAgICB9XG4gICAgLy8gUmVzdGFydCB0aGUgdGltZXIuXG4gICAgdGltZXJJZCA9IHNldFRpbWVvdXQodGltZXJFeHBpcmVkLCByZW1haW5pbmdXYWl0KHRpbWUpKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRyYWlsaW5nRWRnZSh0aW1lKSB7XG4gICAgdGltZXJJZCA9IHVuZGVmaW5lZDtcblxuICAgIC8vIE9ubHkgaW52b2tlIGlmIHdlIGhhdmUgYGxhc3RBcmdzYCB3aGljaCBtZWFucyBgZnVuY2AgaGFzIGJlZW5cbiAgICAvLyBkZWJvdW5jZWQgYXQgbGVhc3Qgb25jZS5cbiAgICBpZiAodHJhaWxpbmcgJiYgbGFzdEFyZ3MpIHtcbiAgICAgIHJldHVybiBpbnZva2VGdW5jKHRpbWUpO1xuICAgIH1cbiAgICBsYXN0QXJncyA9IGxhc3RUaGlzID0gdW5kZWZpbmVkO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBmdW5jdGlvbiBjYW5jZWwoKSB7XG4gICAgaWYgKHRpbWVySWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRpbWVySWQpO1xuICAgIH1cbiAgICBsYXN0SW52b2tlVGltZSA9IDA7XG4gICAgbGFzdEFyZ3MgPSBsYXN0Q2FsbFRpbWUgPSBsYXN0VGhpcyA9IHRpbWVySWQgPSB1bmRlZmluZWQ7XG4gIH1cblxuICBmdW5jdGlvbiBmbHVzaCgpIHtcbiAgICByZXR1cm4gdGltZXJJZCA9PT0gdW5kZWZpbmVkID8gcmVzdWx0IDogdHJhaWxpbmdFZGdlKG5vdygpKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGRlYm91bmNlZCgpIHtcbiAgICB2YXIgdGltZSA9IG5vdygpLFxuICAgICAgICBpc0ludm9raW5nID0gc2hvdWxkSW52b2tlKHRpbWUpO1xuXG4gICAgbGFzdEFyZ3MgPSBhcmd1bWVudHM7XG4gICAgbGFzdFRoaXMgPSB0aGlzO1xuICAgIGxhc3RDYWxsVGltZSA9IHRpbWU7XG5cbiAgICBpZiAoaXNJbnZva2luZykge1xuICAgICAgaWYgKHRpbWVySWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gbGVhZGluZ0VkZ2UobGFzdENhbGxUaW1lKTtcbiAgICAgIH1cbiAgICAgIGlmIChtYXhpbmcpIHtcbiAgICAgICAgLy8gSGFuZGxlIGludm9jYXRpb25zIGluIGEgdGlnaHQgbG9vcC5cbiAgICAgICAgdGltZXJJZCA9IHNldFRpbWVvdXQodGltZXJFeHBpcmVkLCB3YWl0KTtcbiAgICAgICAgcmV0dXJuIGludm9rZUZ1bmMobGFzdENhbGxUaW1lKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRpbWVySWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGltZXJJZCA9IHNldFRpbWVvdXQodGltZXJFeHBpcmVkLCB3YWl0KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICBkZWJvdW5jZWQuY2FuY2VsID0gY2FuY2VsO1xuICBkZWJvdW5jZWQuZmx1c2ggPSBmbHVzaDtcbiAgcmV0dXJuIGRlYm91bmNlZDtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgdGhyb3R0bGVkIGZ1bmN0aW9uIHRoYXQgb25seSBpbnZva2VzIGBmdW5jYCBhdCBtb3N0IG9uY2UgcGVyXG4gKiBldmVyeSBgd2FpdGAgbWlsbGlzZWNvbmRzLiBUaGUgdGhyb3R0bGVkIGZ1bmN0aW9uIGNvbWVzIHdpdGggYSBgY2FuY2VsYFxuICogbWV0aG9kIHRvIGNhbmNlbCBkZWxheWVkIGBmdW5jYCBpbnZvY2F0aW9ucyBhbmQgYSBgZmx1c2hgIG1ldGhvZCB0b1xuICogaW1tZWRpYXRlbHkgaW52b2tlIHRoZW0uIFByb3ZpZGUgYG9wdGlvbnNgIHRvIGluZGljYXRlIHdoZXRoZXIgYGZ1bmNgXG4gKiBzaG91bGQgYmUgaW52b2tlZCBvbiB0aGUgbGVhZGluZyBhbmQvb3IgdHJhaWxpbmcgZWRnZSBvZiB0aGUgYHdhaXRgXG4gKiB0aW1lb3V0LiBUaGUgYGZ1bmNgIGlzIGludm9rZWQgd2l0aCB0aGUgbGFzdCBhcmd1bWVudHMgcHJvdmlkZWQgdG8gdGhlXG4gKiB0aHJvdHRsZWQgZnVuY3Rpb24uIFN1YnNlcXVlbnQgY2FsbHMgdG8gdGhlIHRocm90dGxlZCBmdW5jdGlvbiByZXR1cm4gdGhlXG4gKiByZXN1bHQgb2YgdGhlIGxhc3QgYGZ1bmNgIGludm9jYXRpb24uXG4gKlxuICogKipOb3RlOioqIElmIGBsZWFkaW5nYCBhbmQgYHRyYWlsaW5nYCBvcHRpb25zIGFyZSBgdHJ1ZWAsIGBmdW5jYCBpc1xuICogaW52b2tlZCBvbiB0aGUgdHJhaWxpbmcgZWRnZSBvZiB0aGUgdGltZW91dCBvbmx5IGlmIHRoZSB0aHJvdHRsZWQgZnVuY3Rpb25cbiAqIGlzIGludm9rZWQgbW9yZSB0aGFuIG9uY2UgZHVyaW5nIHRoZSBgd2FpdGAgdGltZW91dC5cbiAqXG4gKiBJZiBgd2FpdGAgaXMgYDBgIGFuZCBgbGVhZGluZ2AgaXMgYGZhbHNlYCwgYGZ1bmNgIGludm9jYXRpb24gaXMgZGVmZXJyZWRcbiAqIHVudGlsIHRvIHRoZSBuZXh0IHRpY2ssIHNpbWlsYXIgdG8gYHNldFRpbWVvdXRgIHdpdGggYSB0aW1lb3V0IG9mIGAwYC5cbiAqXG4gKiBTZWUgW0RhdmlkIENvcmJhY2hvJ3MgYXJ0aWNsZV0oaHR0cHM6Ly9jc3MtdHJpY2tzLmNvbS9kZWJvdW5jaW5nLXRocm90dGxpbmctZXhwbGFpbmVkLWV4YW1wbGVzLylcbiAqIGZvciBkZXRhaWxzIG92ZXIgdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gYF8udGhyb3R0bGVgIGFuZCBgXy5kZWJvdW5jZWAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byB0aHJvdHRsZS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbd2FpdD0wXSBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byB0aHJvdHRsZSBpbnZvY2F0aW9ucyB0by5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucz17fV0gVGhlIG9wdGlvbnMgb2JqZWN0LlxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5sZWFkaW5nPXRydWVdXG4gKiAgU3BlY2lmeSBpbnZva2luZyBvbiB0aGUgbGVhZGluZyBlZGdlIG9mIHRoZSB0aW1lb3V0LlxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy50cmFpbGluZz10cnVlXVxuICogIFNwZWNpZnkgaW52b2tpbmcgb24gdGhlIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlIHRpbWVvdXQuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyB0aHJvdHRsZWQgZnVuY3Rpb24uXG4gKiBAZXhhbXBsZVxuICpcbiAqIC8vIEF2b2lkIGV4Y2Vzc2l2ZWx5IHVwZGF0aW5nIHRoZSBwb3NpdGlvbiB3aGlsZSBzY3JvbGxpbmcuXG4gKiBqUXVlcnkod2luZG93KS5vbignc2Nyb2xsJywgXy50aHJvdHRsZSh1cGRhdGVQb3NpdGlvbiwgMTAwKSk7XG4gKlxuICogLy8gSW52b2tlIGByZW5ld1Rva2VuYCB3aGVuIHRoZSBjbGljayBldmVudCBpcyBmaXJlZCwgYnV0IG5vdCBtb3JlIHRoYW4gb25jZSBldmVyeSA1IG1pbnV0ZXMuXG4gKiB2YXIgdGhyb3R0bGVkID0gXy50aHJvdHRsZShyZW5ld1Rva2VuLCAzMDAwMDAsIHsgJ3RyYWlsaW5nJzogZmFsc2UgfSk7XG4gKiBqUXVlcnkoZWxlbWVudCkub24oJ2NsaWNrJywgdGhyb3R0bGVkKTtcbiAqXG4gKiAvLyBDYW5jZWwgdGhlIHRyYWlsaW5nIHRocm90dGxlZCBpbnZvY2F0aW9uLlxuICogalF1ZXJ5KHdpbmRvdykub24oJ3BvcHN0YXRlJywgdGhyb3R0bGVkLmNhbmNlbCk7XG4gKi9cbmZ1bmN0aW9uIHRocm90dGxlKGZ1bmMsIHdhaXQsIG9wdGlvbnMpIHtcbiAgdmFyIGxlYWRpbmcgPSB0cnVlLFxuICAgICAgdHJhaWxpbmcgPSB0cnVlO1xuXG4gIGlmICh0eXBlb2YgZnVuYyAhPSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO1xuICB9XG4gIGlmIChpc09iamVjdChvcHRpb25zKSkge1xuICAgIGxlYWRpbmcgPSAnbGVhZGluZycgaW4gb3B0aW9ucyA/ICEhb3B0aW9ucy5sZWFkaW5nIDogbGVhZGluZztcbiAgICB0cmFpbGluZyA9ICd0cmFpbGluZycgaW4gb3B0aW9ucyA/ICEhb3B0aW9ucy50cmFpbGluZyA6IHRyYWlsaW5nO1xuICB9XG4gIHJldHVybiBkZWJvdW5jZShmdW5jLCB3YWl0LCB7XG4gICAgJ2xlYWRpbmcnOiBsZWFkaW5nLFxuICAgICdtYXhXYWl0Jzogd2FpdCxcbiAgICAndHJhaWxpbmcnOiB0cmFpbGluZ1xuICB9KTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyB0aGVcbiAqIFtsYW5ndWFnZSB0eXBlXShodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtZWNtYXNjcmlwdC1sYW5ndWFnZS10eXBlcylcbiAqIG9mIGBPYmplY3RgLiAoZS5nLiBhcnJheXMsIGZ1bmN0aW9ucywgb2JqZWN0cywgcmVnZXhlcywgYG5ldyBOdW1iZXIoMClgLCBhbmQgYG5ldyBTdHJpbmcoJycpYClcbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBvYmplY3QsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc09iamVjdCh7fSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdChbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3QoXy5ub29wKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0KG51bGwpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNPYmplY3QodmFsdWUpIHtcbiAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsdWU7XG4gIHJldHVybiAhIXZhbHVlICYmICh0eXBlID09ICdvYmplY3QnIHx8IHR5cGUgPT0gJ2Z1bmN0aW9uJyk7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UuIEEgdmFsdWUgaXMgb2JqZWN0LWxpa2UgaWYgaXQncyBub3QgYG51bGxgXG4gKiBhbmQgaGFzIGEgYHR5cGVvZmAgcmVzdWx0IG9mIFwib2JqZWN0XCIuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc09iamVjdExpa2Uoe30pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdExpa2UoXy5ub29wKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc09iamVjdExpa2UobnVsbCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc09iamVjdExpa2UodmFsdWUpIHtcbiAgcmV0dXJuICEhdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09ICdvYmplY3QnO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgU3ltYm9sYCBwcmltaXRpdmUgb3Igb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgc3ltYm9sLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNTeW1ib2woU3ltYm9sLml0ZXJhdG9yKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzU3ltYm9sKCdhYmMnKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzU3ltYm9sKHZhbHVlKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ3N5bWJvbCcgfHxcbiAgICAoaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBvYmplY3RUb1N0cmluZy5jYWxsKHZhbHVlKSA9PSBzeW1ib2xUYWcpO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBudW1iZXIuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHByb2Nlc3MuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBudW1iZXIuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8udG9OdW1iZXIoMy4yKTtcbiAqIC8vID0+IDMuMlxuICpcbiAqIF8udG9OdW1iZXIoTnVtYmVyLk1JTl9WQUxVRSk7XG4gKiAvLyA9PiA1ZS0zMjRcbiAqXG4gKiBfLnRvTnVtYmVyKEluZmluaXR5KTtcbiAqIC8vID0+IEluZmluaXR5XG4gKlxuICogXy50b051bWJlcignMy4yJyk7XG4gKiAvLyA9PiAzLjJcbiAqL1xuZnVuY3Rpb24gdG9OdW1iZXIodmFsdWUpIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnbnVtYmVyJykge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICBpZiAoaXNTeW1ib2wodmFsdWUpKSB7XG4gICAgcmV0dXJuIE5BTjtcbiAgfVxuICBpZiAoaXNPYmplY3QodmFsdWUpKSB7XG4gICAgdmFyIG90aGVyID0gdHlwZW9mIHZhbHVlLnZhbHVlT2YgPT0gJ2Z1bmN0aW9uJyA/IHZhbHVlLnZhbHVlT2YoKSA6IHZhbHVlO1xuICAgIHZhbHVlID0gaXNPYmplY3Qob3RoZXIpID8gKG90aGVyICsgJycpIDogb3RoZXI7XG4gIH1cbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykge1xuICAgIHJldHVybiB2YWx1ZSA9PT0gMCA/IHZhbHVlIDogK3ZhbHVlO1xuICB9XG4gIHZhbHVlID0gdmFsdWUucmVwbGFjZShyZVRyaW0sICcnKTtcbiAgdmFyIGlzQmluYXJ5ID0gcmVJc0JpbmFyeS50ZXN0KHZhbHVlKTtcbiAgcmV0dXJuIChpc0JpbmFyeSB8fCByZUlzT2N0YWwudGVzdCh2YWx1ZSkpXG4gICAgPyBmcmVlUGFyc2VJbnQodmFsdWUuc2xpY2UoMiksIGlzQmluYXJ5ID8gMiA6IDgpXG4gICAgOiAocmVJc0JhZEhleC50ZXN0KHZhbHVlKSA/IE5BTiA6ICt2YWx1ZSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gdGhyb3R0bGU7XG4iLCJ2YXIgZztcclxuXHJcbi8vIFRoaXMgd29ya3MgaW4gbm9uLXN0cmljdCBtb2RlXHJcbmcgPSAoZnVuY3Rpb24oKSB7XHJcblx0cmV0dXJuIHRoaXM7XHJcbn0pKCk7XHJcblxyXG50cnkge1xyXG5cdC8vIFRoaXMgd29ya3MgaWYgZXZhbCBpcyBhbGxvd2VkIChzZWUgQ1NQKVxyXG5cdGcgPSBnIHx8IEZ1bmN0aW9uKFwicmV0dXJuIHRoaXNcIikoKSB8fCAoMSwgZXZhbCkoXCJ0aGlzXCIpO1xyXG59IGNhdGNoIChlKSB7XHJcblx0Ly8gVGhpcyB3b3JrcyBpZiB0aGUgd2luZG93IHJlZmVyZW5jZSBpcyBhdmFpbGFibGVcclxuXHRpZiAodHlwZW9mIHdpbmRvdyA9PT0gXCJvYmplY3RcIikgZyA9IHdpbmRvdztcclxufVxyXG5cclxuLy8gZyBjYW4gc3RpbGwgYmUgdW5kZWZpbmVkLCBidXQgbm90aGluZyB0byBkbyBhYm91dCBpdC4uLlxyXG4vLyBXZSByZXR1cm4gdW5kZWZpbmVkLCBpbnN0ZWFkIG9mIG5vdGhpbmcgaGVyZSwgc28gaXQnc1xyXG4vLyBlYXNpZXIgdG8gaGFuZGxlIHRoaXMgY2FzZS4gaWYoIWdsb2JhbCkgeyAuLi59XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IGc7XHJcbiIsIi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuaW1wb3J0IHsgZ2V0RWxlbWVudHNGb3JTb3VyY2VMaW5lIH0gZnJvbSAnLi9zY3JvbGwtc3luYyc7XG5cbmV4cG9ydCBjbGFzcyBBY3RpdmVMaW5lTWFya2VyIHtcblx0cHJpdmF0ZSBfY3VycmVudDogYW55O1xuXG5cdG9uRGlkQ2hhbmdlVGV4dEVkaXRvclNlbGVjdGlvbihsaW5lOiBudW1iZXIpIHtcblx0XHRjb25zdCB7IHByZXZpb3VzIH0gPSBnZXRFbGVtZW50c0ZvclNvdXJjZUxpbmUobGluZSk7XG5cdFx0dGhpcy5fdXBkYXRlKHByZXZpb3VzICYmIHByZXZpb3VzLmVsZW1lbnQpO1xuXHR9XG5cblx0X3VwZGF0ZShiZWZvcmU6IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkKSB7XG5cdFx0dGhpcy5fdW5tYXJrQWN0aXZlRWxlbWVudCh0aGlzLl9jdXJyZW50KTtcblx0XHR0aGlzLl9tYXJrQWN0aXZlRWxlbWVudChiZWZvcmUpO1xuXHRcdHRoaXMuX2N1cnJlbnQgPSBiZWZvcmU7XG5cdH1cblxuXHRfdW5tYXJrQWN0aXZlRWxlbWVudChlbGVtZW50OiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZCkge1xuXHRcdGlmICghZWxlbWVudCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRlbGVtZW50LmNsYXNzTmFtZSA9IGVsZW1lbnQuY2xhc3NOYW1lLnJlcGxhY2UoL1xcYmNvZGUtYWN0aXZlLWxpbmVcXGIvZywgJycpO1xuXHR9XG5cblx0X21hcmtBY3RpdmVFbGVtZW50KGVsZW1lbnQ6IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkKSB7XG5cdFx0aWYgKCFlbGVtZW50KSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGVsZW1lbnQuY2xhc3NOYW1lICs9ICcgY29kZS1hY3RpdmUtbGluZSc7XG5cdH1cbn0iLCIvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuZXhwb3J0IGZ1bmN0aW9uIG9uY2VEb2N1bWVudExvYWRlZChmOiAoKSA9PiB2b2lkKSB7XG5cdGlmIChkb2N1bWVudC5yZWFkeVN0YXRlID09PSAnbG9hZGluZycgfHwgZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gJ3VuaW5pdGlhbGl6ZWQnKSB7XG5cdFx0ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsIGYpO1xuXHR9IGVsc2Uge1xuXHRcdGYoKTtcblx0fVxufSIsIi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG5pbXBvcnQgeyBBY3RpdmVMaW5lTWFya2VyIH0gZnJvbSAnLi9hY3RpdmVMaW5lTWFya2VyJztcbmltcG9ydCB7IG9uY2VEb2N1bWVudExvYWRlZCB9IGZyb20gJy4vZXZlbnRzJztcbmltcG9ydCB7IGNyZWF0ZVBvc3RlckZvclZzQ29kZSB9IGZyb20gJy4vbWVzc2FnaW5nJztcbmltcG9ydCB7IGdldEVkaXRvckxpbmVOdW1iZXJGb3JQYWdlT2Zmc2V0LCBzY3JvbGxUb1JldmVhbFNvdXJjZUxpbmUgfSBmcm9tICcuL3Njcm9sbC1zeW5jJztcbmltcG9ydCB7IGdldFNldHRpbmdzLCBnZXREYXRhIH0gZnJvbSAnLi9zZXR0aW5ncyc7XG5pbXBvcnQgdGhyb3R0bGUgPSByZXF1aXJlKCdsb2Rhc2gudGhyb3R0bGUnKTtcblxuZGVjbGFyZSB2YXIgYWNxdWlyZVZzQ29kZUFwaTogYW55O1xuXG52YXIgc2Nyb2xsRGlzYWJsZWQgPSB0cnVlO1xuY29uc3QgbWFya2VyID0gbmV3IEFjdGl2ZUxpbmVNYXJrZXIoKTtcbmNvbnN0IHNldHRpbmdzID0gZ2V0U2V0dGluZ3MoKTtcblxuY29uc3QgdnNjb2RlID0gYWNxdWlyZVZzQ29kZUFwaSgpO1xuXG4vLyBTZXQgVlMgQ29kZSBzdGF0ZVxuY29uc3Qgc3RhdGUgPSBnZXREYXRhKCdkYXRhLXN0YXRlJyk7XG52c2NvZGUuc2V0U3RhdGUoc3RhdGUpO1xuXG5jb25zdCBtZXNzYWdpbmcgPSBjcmVhdGVQb3N0ZXJGb3JWc0NvZGUodnNjb2RlKTtcblxud2luZG93LmNzcEFsZXJ0ZXIuc2V0UG9zdGVyKG1lc3NhZ2luZyk7XG53aW5kb3cuc3R5bGVMb2FkaW5nTW9uaXRvci5zZXRQb3N0ZXIobWVzc2FnaW5nKTtcblxub25jZURvY3VtZW50TG9hZGVkKCgpID0+IHtcblx0aWYgKHNldHRpbmdzLnNjcm9sbFByZXZpZXdXaXRoRWRpdG9yKSB7XG5cdFx0c2V0VGltZW91dCgoKSA9PiB7XG5cdFx0XHRjb25zdCBpbml0aWFsTGluZSA9ICtzZXR0aW5ncy5saW5lO1xuXHRcdFx0aWYgKCFpc05hTihpbml0aWFsTGluZSkpIHtcblx0XHRcdFx0c2Nyb2xsRGlzYWJsZWQgPSB0cnVlO1xuXHRcdFx0XHRzY3JvbGxUb1JldmVhbFNvdXJjZUxpbmUoaW5pdGlhbExpbmUpO1xuXHRcdFx0fVxuXHRcdH0sIDApO1xuXHR9XG59KTtcblxuY29uc3Qgb25VcGRhdGVWaWV3ID0gKCgpID0+IHtcblx0Y29uc3QgZG9TY3JvbGwgPSB0aHJvdHRsZSgobGluZTogbnVtYmVyKSA9PiB7XG5cdFx0c2Nyb2xsRGlzYWJsZWQgPSB0cnVlO1xuXHRcdHNjcm9sbFRvUmV2ZWFsU291cmNlTGluZShsaW5lKTtcblx0fSwgNTApO1xuXG5cdHJldHVybiAobGluZTogbnVtYmVyLCBzZXR0aW5nczogYW55KSA9PiB7XG5cdFx0aWYgKCFpc05hTihsaW5lKSkge1xuXHRcdFx0c2V0dGluZ3MubGluZSA9IGxpbmU7XG5cdFx0XHRkb1Njcm9sbChsaW5lKTtcblx0XHR9XG5cdH07XG59KSgpO1xuXG53aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgKCkgPT4ge1xuXHRzY3JvbGxEaXNhYmxlZCA9IHRydWU7XG59LCB0cnVlKTtcblxud2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBldmVudCA9PiB7XG5cdGlmIChldmVudC5kYXRhLnNvdXJjZSAhPT0gc2V0dGluZ3Muc291cmNlKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0c3dpdGNoIChldmVudC5kYXRhLnR5cGUpIHtcblx0XHRjYXNlICdvbkRpZENoYW5nZVRleHRFZGl0b3JTZWxlY3Rpb24nOlxuXHRcdFx0bWFya2VyLm9uRGlkQ2hhbmdlVGV4dEVkaXRvclNlbGVjdGlvbihldmVudC5kYXRhLmxpbmUpO1xuXHRcdFx0YnJlYWs7XG5cblx0XHRjYXNlICd1cGRhdGVWaWV3Jzpcblx0XHRcdG9uVXBkYXRlVmlldyhldmVudC5kYXRhLmxpbmUsIHNldHRpbmdzKTtcblx0XHRcdGJyZWFrO1xuXHR9XG59LCBmYWxzZSk7XG5cbmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2RibGNsaWNrJywgZXZlbnQgPT4ge1xuXHRpZiAoIXNldHRpbmdzLmRvdWJsZUNsaWNrVG9Td2l0Y2hUb0VkaXRvcikge1xuXHRcdHJldHVybjtcblx0fVxuXG5cdC8vIElnbm9yZSBjbGlja3Mgb24gbGlua3Ncblx0Zm9yIChsZXQgbm9kZSA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDsgbm9kZTsgbm9kZSA9IG5vZGUucGFyZW50Tm9kZSBhcyBIVE1MRWxlbWVudCkge1xuXHRcdGlmIChub2RlLnRhZ05hbWUgPT09ICdBJykge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0fVxuXG5cdGNvbnN0IG9mZnNldCA9IGV2ZW50LnBhZ2VZO1xuXHRjb25zdCBsaW5lID0gZ2V0RWRpdG9yTGluZU51bWJlckZvclBhZ2VPZmZzZXQob2Zmc2V0KTtcblx0aWYgKHR5cGVvZiBsaW5lID09PSAnbnVtYmVyJyAmJiAhaXNOYU4obGluZSkpIHtcblx0XHRtZXNzYWdpbmcucG9zdE1lc3NhZ2UoJ2RpZENsaWNrJywgeyBsaW5lOiBNYXRoLmZsb29yKGxpbmUpIH0pO1xuXHR9XG59KTtcblxuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBldmVudCA9PiB7XG5cdGlmICghZXZlbnQpIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHRsZXQgbm9kZTogYW55ID0gZXZlbnQudGFyZ2V0O1xuXHR3aGlsZSAobm9kZSkge1xuXHRcdGlmIChub2RlLnRhZ05hbWUgJiYgbm9kZS50YWdOYW1lID09PSAnQScgJiYgbm9kZS5ocmVmKSB7XG5cdFx0XHRpZiAobm9kZS5nZXRBdHRyaWJ1dGUoJ2hyZWYnKS5zdGFydHNXaXRoKCcjJykpIHtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0XHRpZiAobm9kZS5ocmVmLnN0YXJ0c1dpdGgoJ2ZpbGU6Ly8nKSB8fCBub2RlLmhyZWYuc3RhcnRzV2l0aCgndnNjb2RlLXJlc291cmNlOicpKSB7XG5cdFx0XHRcdGNvbnN0IFtwYXRoLCBmcmFnbWVudF0gPSBub2RlLmhyZWYucmVwbGFjZSgvXihmaWxlOlxcL1xcL3x2c2NvZGUtcmVzb3VyY2U6KS9pLCAnJykuc3BsaXQoJyMnKTtcblx0XHRcdFx0bWVzc2FnaW5nLnBvc3RDb21tYW5kKCdfbWFya2Rvd24ub3BlbkRvY3VtZW50TGluaycsIFt7IHBhdGgsIGZyYWdtZW50IH1dKTtcblx0XHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0XHRcdFx0ZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdFx0YnJlYWs7XG5cdFx0fVxuXHRcdG5vZGUgPSBub2RlLnBhcmVudE5vZGU7XG5cdH1cbn0sIHRydWUpO1xuXG5pZiAoc2V0dGluZ3Muc2Nyb2xsRWRpdG9yV2l0aFByZXZpZXcpIHtcblx0d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHRocm90dGxlKCgpID0+IHtcblx0XHRpZiAoc2Nyb2xsRGlzYWJsZWQpIHtcblx0XHRcdHNjcm9sbERpc2FibGVkID0gZmFsc2U7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnN0IGxpbmUgPSBnZXRFZGl0b3JMaW5lTnVtYmVyRm9yUGFnZU9mZnNldCh3aW5kb3cuc2Nyb2xsWSk7XG5cdFx0XHRpZiAodHlwZW9mIGxpbmUgPT09ICdudW1iZXInICYmICFpc05hTihsaW5lKSkge1xuXHRcdFx0XHRtZXNzYWdpbmcucG9zdE1lc3NhZ2UoJ3JldmVhbExpbmUnLCB7IGxpbmUgfSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9LCA1MCkpO1xufSIsIi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG5pbXBvcnQgeyBnZXRTZXR0aW5ncyB9IGZyb20gJy4vc2V0dGluZ3MnO1xuXG5leHBvcnQgaW50ZXJmYWNlIE1lc3NhZ2VQb3N0ZXIge1xuXHQvKipcblx0ICogUG9zdCBhIG1lc3NhZ2UgdG8gdGhlIG1hcmtkb3duIGV4dGVuc2lvblxuXHQgKi9cblx0cG9zdE1lc3NhZ2UodHlwZTogc3RyaW5nLCBib2R5OiBvYmplY3QpOiB2b2lkO1xuXG5cblx0LyoqXG5cdCAqIFBvc3QgYSBjb21tYW5kIHRvIGJlIGV4ZWN1dGVkIHRvIHRoZSBtYXJrZG93biBleHRlbnNpb25cblx0ICovXG5cdHBvc3RDb21tYW5kKGNvbW1hbmQ6IHN0cmluZywgYXJnczogYW55W10pOiB2b2lkO1xufVxuXG5leHBvcnQgY29uc3QgY3JlYXRlUG9zdGVyRm9yVnNDb2RlID0gKHZzY29kZTogYW55KSA9PiB7XG5cdHJldHVybiBuZXcgY2xhc3MgaW1wbGVtZW50cyBNZXNzYWdlUG9zdGVyIHtcblx0XHRwb3N0TWVzc2FnZSh0eXBlOiBzdHJpbmcsIGJvZHk6IG9iamVjdCk6IHZvaWQge1xuXHRcdFx0dnNjb2RlLnBvc3RNZXNzYWdlKHtcblx0XHRcdFx0dHlwZSxcblx0XHRcdFx0c291cmNlOiBnZXRTZXR0aW5ncygpLnNvdXJjZSxcblx0XHRcdFx0Ym9keVxuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdHBvc3RDb21tYW5kKGNvbW1hbmQ6IHN0cmluZywgYXJnczogYW55W10pIHtcblx0XHRcdHRoaXMucG9zdE1lc3NhZ2UoJ2NvbW1hbmQnLCB7IGNvbW1hbmQsIGFyZ3MgfSk7XG5cdFx0fVxuXHR9O1xufTtcblxuIiwiLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqICBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqICBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbmltcG9ydCB7IGdldFNldHRpbmdzIH0gZnJvbSAnLi9zZXR0aW5ncyc7XG5cblxuZnVuY3Rpb24gY2xhbXAobWluOiBudW1iZXIsIG1heDogbnVtYmVyLCB2YWx1ZTogbnVtYmVyKSB7XG5cdHJldHVybiBNYXRoLm1pbihtYXgsIE1hdGgubWF4KG1pbiwgdmFsdWUpKTtcbn1cblxuZnVuY3Rpb24gY2xhbXBMaW5lKGxpbmU6IG51bWJlcikge1xuXHRyZXR1cm4gY2xhbXAoMCwgZ2V0U2V0dGluZ3MoKS5saW5lQ291bnQgLSAxLCBsaW5lKTtcbn1cblxuXG5leHBvcnQgaW50ZXJmYWNlIENvZGVMaW5lRWxlbWVudCB7XG5cdGVsZW1lbnQ6IEhUTUxFbGVtZW50O1xuXHRsaW5lOiBudW1iZXI7XG59XG5cbmNvbnN0IGdldENvZGVMaW5lRWxlbWVudHMgPSAoKCkgPT4ge1xuXHRsZXQgZWxlbWVudHM6IENvZGVMaW5lRWxlbWVudFtdO1xuXHRyZXR1cm4gKCkgPT4ge1xuXHRcdGlmICghZWxlbWVudHMpIHtcblx0XHRcdGVsZW1lbnRzID0gQXJyYXkucHJvdG90eXBlLm1hcC5jYWxsKFxuXHRcdFx0XHRkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdjb2RlLWxpbmUnKSxcblx0XHRcdFx0KGVsZW1lbnQ6IGFueSkgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IGxpbmUgPSArZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtbGluZScpO1xuXHRcdFx0XHRcdHJldHVybiB7IGVsZW1lbnQsIGxpbmUgfTtcblx0XHRcdFx0fSlcblx0XHRcdFx0LmZpbHRlcigoeDogYW55KSA9PiAhaXNOYU4oeC5saW5lKSk7XG5cdFx0fVxuXHRcdHJldHVybiBlbGVtZW50cztcblx0fTtcbn0pKCk7XG5cbi8qKlxuICogRmluZCB0aGUgaHRtbCBlbGVtZW50cyB0aGF0IG1hcCB0byBhIHNwZWNpZmljIHRhcmdldCBsaW5lIGluIHRoZSBlZGl0b3IuXG4gKlxuICogSWYgYW4gZXhhY3QgbWF0Y2gsIHJldHVybnMgYSBzaW5nbGUgZWxlbWVudC4gSWYgdGhlIGxpbmUgaXMgYmV0d2VlbiBlbGVtZW50cyxcbiAqIHJldHVybnMgdGhlIGVsZW1lbnQgcHJpb3IgdG8gYW5kIHRoZSBlbGVtZW50IGFmdGVyIHRoZSBnaXZlbiBsaW5lLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RWxlbWVudHNGb3JTb3VyY2VMaW5lKHRhcmdldExpbmU6IG51bWJlcik6IHsgcHJldmlvdXM6IENvZGVMaW5lRWxlbWVudDsgbmV4dD86IENvZGVMaW5lRWxlbWVudDsgfSB7XG5cdGNvbnN0IGxpbmVOdW1iZXIgPSBNYXRoLmZsb29yKHRhcmdldExpbmUpO1xuXHRjb25zdCBsaW5lcyA9IGdldENvZGVMaW5lRWxlbWVudHMoKTtcblx0bGV0IHByZXZpb3VzID0gbGluZXNbMF0gfHwgbnVsbDtcblx0Zm9yIChjb25zdCBlbnRyeSBvZiBsaW5lcykge1xuXHRcdGlmIChlbnRyeS5saW5lID09PSBsaW5lTnVtYmVyKSB7XG5cdFx0XHRyZXR1cm4geyBwcmV2aW91czogZW50cnksIG5leHQ6IHVuZGVmaW5lZCB9O1xuXHRcdH1cblx0XHRlbHNlIGlmIChlbnRyeS5saW5lID4gbGluZU51bWJlcikge1xuXHRcdFx0cmV0dXJuIHsgcHJldmlvdXMsIG5leHQ6IGVudHJ5IH07XG5cdFx0fVxuXHRcdHByZXZpb3VzID0gZW50cnk7XG5cdH1cblx0cmV0dXJuIHsgcHJldmlvdXMgfTtcbn1cblxuLyoqXG4gKiBGaW5kIHRoZSBodG1sIGVsZW1lbnRzIHRoYXQgYXJlIGF0IGEgc3BlY2lmaWMgcGl4ZWwgb2Zmc2V0IG9uIHRoZSBwYWdlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TGluZUVsZW1lbnRzQXRQYWdlT2Zmc2V0KG9mZnNldDogbnVtYmVyKTogeyBwcmV2aW91czogQ29kZUxpbmVFbGVtZW50OyBuZXh0PzogQ29kZUxpbmVFbGVtZW50OyB9IHtcblx0Y29uc3QgbGluZXMgPSBnZXRDb2RlTGluZUVsZW1lbnRzKCk7XG5cdGNvbnN0IHBvc2l0aW9uID0gb2Zmc2V0IC0gd2luZG93LnNjcm9sbFk7XG5cdGxldCBsbyA9IC0xO1xuXHRsZXQgaGkgPSBsaW5lcy5sZW5ndGggLSAxO1xuXHR3aGlsZSAobG8gKyAxIDwgaGkpIHtcblx0XHRjb25zdCBtaWQgPSBNYXRoLmZsb29yKChsbyArIGhpKSAvIDIpO1xuXHRcdGNvbnN0IGJvdW5kcyA9IGxpbmVzW21pZF0uZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblx0XHRpZiAoYm91bmRzLnRvcCArIGJvdW5kcy5oZWlnaHQgPj0gcG9zaXRpb24pIHtcblx0XHRcdGhpID0gbWlkO1xuXHRcdH1cblx0XHRlbHNlIHtcblx0XHRcdGxvID0gbWlkO1xuXHRcdH1cblx0fVxuXHRjb25zdCBoaUVsZW1lbnQgPSBsaW5lc1toaV07XG5cdGNvbnN0IGhpQm91bmRzID0gaGlFbGVtZW50LmVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cdGlmIChoaSA+PSAxICYmIGhpQm91bmRzLnRvcCA+IHBvc2l0aW9uKSB7XG5cdFx0Y29uc3QgbG9FbGVtZW50ID0gbGluZXNbbG9dO1xuXHRcdHJldHVybiB7IHByZXZpb3VzOiBsb0VsZW1lbnQsIG5leHQ6IGhpRWxlbWVudCB9O1xuXHR9XG5cdHJldHVybiB7IHByZXZpb3VzOiBoaUVsZW1lbnQgfTtcbn1cblxuLyoqXG4gKiBBdHRlbXB0IHRvIHJldmVhbCB0aGUgZWxlbWVudCBmb3IgYSBzb3VyY2UgbGluZSBpbiB0aGUgZWRpdG9yLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2Nyb2xsVG9SZXZlYWxTb3VyY2VMaW5lKGxpbmU6IG51bWJlcikge1xuXHRjb25zdCB7IHByZXZpb3VzLCBuZXh0IH0gPSBnZXRFbGVtZW50c0ZvclNvdXJjZUxpbmUobGluZSk7XG5cdGlmIChwcmV2aW91cyAmJiBnZXRTZXR0aW5ncygpLnNjcm9sbFByZXZpZXdXaXRoRWRpdG9yKSB7XG5cdFx0bGV0IHNjcm9sbFRvID0gMDtcblx0XHRjb25zdCByZWN0ID0gcHJldmlvdXMuZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblx0XHRjb25zdCBwcmV2aW91c1RvcCA9IHJlY3QudG9wO1xuXHRcdGlmIChuZXh0ICYmIG5leHQubGluZSAhPT0gcHJldmlvdXMubGluZSkge1xuXHRcdFx0Ly8gQmV0d2VlbiB0d28gZWxlbWVudHMuIEdvIHRvIHBlcmNlbnRhZ2Ugb2Zmc2V0IGJldHdlZW4gdGhlbS5cblx0XHRcdGNvbnN0IGJldHdlZW5Qcm9ncmVzcyA9IChsaW5lIC0gcHJldmlvdXMubGluZSkgLyAobmV4dC5saW5lIC0gcHJldmlvdXMubGluZSk7XG5cdFx0XHRjb25zdCBlbGVtZW50T2Zmc2V0ID0gbmV4dC5lbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCAtIHByZXZpb3VzVG9wO1xuXHRcdFx0c2Nyb2xsVG8gPSBwcmV2aW91c1RvcCArIGJldHdlZW5Qcm9ncmVzcyAqIGVsZW1lbnRPZmZzZXQ7XG5cdFx0fVxuXHRcdGVsc2Uge1xuXHRcdFx0c2Nyb2xsVG8gPSBwcmV2aW91c1RvcDtcblx0XHR9XG5cdFx0d2luZG93LnNjcm9sbCgwLCBNYXRoLm1heCgxLCB3aW5kb3cuc2Nyb2xsWSArIHNjcm9sbFRvKSk7XG5cdH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEVkaXRvckxpbmVOdW1iZXJGb3JQYWdlT2Zmc2V0KG9mZnNldDogbnVtYmVyKSB7XG5cdGNvbnN0IHsgcHJldmlvdXMsIG5leHQgfSA9IGdldExpbmVFbGVtZW50c0F0UGFnZU9mZnNldChvZmZzZXQpO1xuXHRpZiAocHJldmlvdXMpIHtcblx0XHRjb25zdCBwcmV2aW91c0JvdW5kcyA9IHByZXZpb3VzLmVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cdFx0Y29uc3Qgb2Zmc2V0RnJvbVByZXZpb3VzID0gKG9mZnNldCAtIHdpbmRvdy5zY3JvbGxZIC0gcHJldmlvdXNCb3VuZHMudG9wKTtcblx0XHRpZiAobmV4dCkge1xuXHRcdFx0Y29uc3QgcHJvZ3Jlc3NCZXR3ZWVuRWxlbWVudHMgPSBvZmZzZXRGcm9tUHJldmlvdXMgLyAobmV4dC5lbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCAtIHByZXZpb3VzQm91bmRzLnRvcCk7XG5cdFx0XHRjb25zdCBsaW5lID0gcHJldmlvdXMubGluZSArIHByb2dyZXNzQmV0d2VlbkVsZW1lbnRzICogKG5leHQubGluZSAtIHByZXZpb3VzLmxpbmUpO1xuXHRcdFx0cmV0dXJuIGNsYW1wTGluZShsaW5lKTtcblx0XHR9XG5cdFx0ZWxzZSB7XG5cdFx0XHRjb25zdCBwcm9ncmVzc1dpdGhpbkVsZW1lbnQgPSBvZmZzZXRGcm9tUHJldmlvdXMgLyAocHJldmlvdXNCb3VuZHMuaGVpZ2h0KTtcblx0XHRcdGNvbnN0IGxpbmUgPSBwcmV2aW91cy5saW5lICsgcHJvZ3Jlc3NXaXRoaW5FbGVtZW50O1xuXHRcdFx0cmV0dXJuIGNsYW1wTGluZShsaW5lKTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIG51bGw7XG59XG4iLCIvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuZXhwb3J0IGludGVyZmFjZSBQcmV2aWV3U2V0dGluZ3Mge1xuXHRzb3VyY2U6IHN0cmluZztcblx0bGluZTogbnVtYmVyO1xuXHRsaW5lQ291bnQ6IG51bWJlcjtcblx0c2Nyb2xsUHJldmlld1dpdGhFZGl0b3I/OiBib29sZWFuO1xuXHRzY3JvbGxFZGl0b3JXaXRoUHJldmlldzogYm9vbGVhbjtcblx0ZGlzYWJsZVNlY3VyaXR5V2FybmluZ3M6IGJvb2xlYW47XG5cdGRvdWJsZUNsaWNrVG9Td2l0Y2hUb0VkaXRvcjogYm9vbGVhbjtcbn1cblxubGV0IGNhY2hlZFNldHRpbmdzOiBQcmV2aWV3U2V0dGluZ3MgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXREYXRhKGtleTogc3RyaW5nKTogUHJldmlld1NldHRpbmdzIHtcblx0Y29uc3QgZWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd2c2NvZGUtbWFya2Rvd24tcHJldmlldy1kYXRhJyk7XG5cdGlmIChlbGVtZW50KSB7XG5cdFx0Y29uc3QgZGF0YSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKGtleSk7XG5cdFx0aWYgKGRhdGEpIHtcblx0XHRcdHJldHVybiBKU09OLnBhcnNlKGRhdGEpO1xuXHRcdH1cblx0fVxuXG5cdHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGxvYWQgZGF0YSBmb3IgJHtrZXl9YCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTZXR0aW5ncygpOiBQcmV2aWV3U2V0dGluZ3Mge1xuXHRpZiAoY2FjaGVkU2V0dGluZ3MpIHtcblx0XHRyZXR1cm4gY2FjaGVkU2V0dGluZ3M7XG5cdH1cblxuXHRjYWNoZWRTZXR0aW5ncyA9IGdldERhdGEoJ2RhdGEtc2V0dGluZ3MnKTtcblx0aWYgKGNhY2hlZFNldHRpbmdzKSB7XG5cdFx0cmV0dXJuIGNhY2hlZFNldHRpbmdzO1xuXHR9XG5cblx0dGhyb3cgbmV3IEVycm9yKCdDb3VsZCBub3QgbG9hZCBzZXR0aW5ncycpO1xufVxuIl0sInNvdXJjZVJvb3QiOiIifQ== \ No newline at end of file diff --git a/extensions/markdown-language-features/media/markdown.css b/extensions/markdown-language-features/media/markdown.css index 01cc4ae334..99f173f111 100644 --- a/extensions/markdown-language-features/media/markdown.css +++ b/extensions/markdown-language-features/media/markdown.css @@ -1,6 +1,6 @@ /*--------------------------------------------------------------------------------------------- * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. + * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ body { @@ -98,10 +98,13 @@ img { } a { - color: #4080D0; text-decoration: none; } +a:hover { + text-decoration: underline; +} + a:focus, input:focus, select:focus, @@ -137,11 +140,6 @@ h6 code { line-height: auto; } -a:hover { - color: #4080D0; - text-decoration: underline; -} - table { border-collapse: collapse; } @@ -165,7 +163,8 @@ table > tbody > tr + tr > td { blockquote { margin: 0 7px 0 5px; padding: 0 16px 0 10px; - border-left: 5px solid; + border-left-width: 5px; + border-left-style: solid; } code { @@ -192,41 +191,20 @@ pre.hljs code > div { /** Theming */ -.vscode-light, -.vscode-light pre code { - color: rgb(30, 30, 30); +pre code { + color: var(--vscode-editor-foreground); } -.vscode-dark, -.vscode-dark pre code { - color: #DDD; -} -.vscode-high-contrast, -.vscode-high-contrast pre code { - color: white; -} - -.vscode-light code { - color: #A31515; -} - -.vscode-dark code { - color: #D7BA7D; -} - -.vscode-light pre:not(.hljs), -.vscode-light code > div { +.vscode-light pre { background-color: rgba(220, 220, 220, 0.4); } -.vscode-dark pre:not(.hljs), -.vscode-dark code > div { +.vscode-dark pre { background-color: rgba(10, 10, 10, 0.4); } -.vscode-high-contrast pre:not(.hljs), -.vscode-high-contrast code > div { +.vscode-high-contrast pre { background-color: rgb(0, 0, 0); } @@ -253,14 +231,3 @@ pre.hljs code > div { .vscode-dark table > tbody > tr + tr > td { border-color: rgba(255, 255, 255, 0.18); } - -.vscode-light blockquote, -.vscode-dark blockquote { - background: rgba(127, 127, 127, 0.1); - border-color: rgba(0, 122, 204, 0.5); -} - -.vscode-high-contrast blockquote { - background: transparent; - border-color: #fff; -} \ No newline at end of file diff --git a/extensions/markdown-language-features/media/pre.js b/extensions/markdown-language-features/media/pre.js index 3089452ac0..8954cce512 100644 --- a/extensions/markdown-language-features/media/pre.js +++ b/extensions/markdown-language-features/media/pre.js @@ -82,7 +82,7 @@ /*--------------------------------------------------------------------------------------------- * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. + * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ Object.defineProperty(exports, "__esModule", { value: true }); const settings_1 = __webpack_require__(/*! ./settings */ "./preview-src/settings.ts"); @@ -195,7 +195,7 @@ exports.StyleLoadingMonitor = StyleLoadingMonitor; /*--------------------------------------------------------------------------------------------- * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. + * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ Object.defineProperty(exports, "__esModule", { value: true }); const csp_1 = __webpack_require__(/*! ./csp */ "./preview-src/csp.ts"); @@ -217,21 +217,28 @@ window.styleLoadingMonitor = new loading_1.StyleLoadingMonitor(); /*--------------------------------------------------------------------------------------------- * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. + * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ Object.defineProperty(exports, "__esModule", { value: true }); let cachedSettings = undefined; +function getData(key) { + const element = document.getElementById('vscode-markdown-preview-data'); + if (element) { + const data = element.getAttribute(key); + if (data) { + return JSON.parse(data); + } + } + throw new Error(`Could not load data for ${key}`); +} +exports.getData = getData; function getSettings() { if (cachedSettings) { return cachedSettings; } - const element = document.getElementById('vscode-markdown-preview-data'); - if (element) { - const data = element.getAttribute('data-settings'); - if (data) { - cachedSettings = JSON.parse(data); - return cachedSettings; - } + cachedSettings = getData('data-settings'); + if (cachedSettings) { + return cachedSettings; } throw new Error('Could not load settings'); } @@ -251,7 +258,7 @@ exports.getSettings = getSettings; /*--------------------------------------------------------------------------------------------- * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. + * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ Object.defineProperty(exports, "__esModule", { value: true }); function getStrings() { @@ -270,4 +277,4 @@ exports.getStrings = getStrings; /***/ }) /******/ }); -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vLy4vcHJldmlldy1zcmMvY3NwLnRzIiwid2VicGFjazovLy8uL3ByZXZpZXctc3JjL2xvYWRpbmcudHMiLCJ3ZWJwYWNrOi8vLy4vcHJldmlldy1zcmMvcHJlLnRzIiwid2VicGFjazovLy8uL3ByZXZpZXctc3JjL3NldHRpbmdzLnRzIiwid2VicGFjazovLy8uL3ByZXZpZXctc3JjL3N0cmluZ3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0EseURBQWlELGNBQWM7QUFDL0Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsbUNBQTJCLDBCQUEwQixFQUFFO0FBQ3ZELHlDQUFpQyxlQUFlO0FBQ2hEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDhEQUFzRCwrREFBK0Q7O0FBRXJIO0FBQ0E7OztBQUdBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7O0FDbkVBOzs7Z0dBR2dHOztBQUdoRyxzRkFBeUM7QUFDekMsbUZBQXVDO0FBRXZDOztHQUVHO0FBQ0g7SUFNQztRQUxRLFlBQU8sR0FBRyxLQUFLLENBQUM7UUFDaEIsc0JBQWlCLEdBQUcsS0FBSyxDQUFDO1FBS2pDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyx5QkFBeUIsRUFBRSxHQUFHLEVBQUU7WUFDekQsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3JCLENBQUMsQ0FBQyxDQUFDO1FBRUgsTUFBTSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQzVDLEVBQUUsQ0FBQyxDQUFDLEtBQUssSUFBSSxLQUFLLENBQUMsSUFBSSxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLLHNCQUFzQixDQUFDLENBQUMsQ0FBQztnQkFDdkUsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3JCLENBQUM7UUFDRixDQUFDLENBQUMsQ0FBQztJQUNKLENBQUM7SUFFTSxTQUFTLENBQUMsTUFBcUI7UUFDckMsSUFBSSxDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUM7UUFDeEIsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQztZQUM1QixJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDdkIsQ0FBQztJQUNGLENBQUM7SUFFTyxZQUFZO1FBQ25CLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUM7UUFDOUIsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO0lBQ3ZCLENBQUM7SUFFTyxjQUFjO1FBQ3JCLE1BQU0sT0FBTyxHQUFHLG9CQUFVLEVBQUUsQ0FBQztRQUM3QixNQUFNLFFBQVEsR0FBRyxzQkFBVyxFQUFFLENBQUM7UUFFL0IsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sSUFBSSxRQUFRLENBQUMsdUJBQXVCLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztZQUN6RSxNQUFNLENBQUM7UUFDUixDQUFDO1FBQ0QsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7UUFFcEIsTUFBTSxZQUFZLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNqRCxZQUFZLENBQUMsU0FBUyxHQUFHLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQztRQUNyRCxZQUFZLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO1FBQ3BELFlBQVksQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1FBRWpFLFlBQVksQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQzVDLFlBQVksQ0FBQyxZQUFZLENBQUMsWUFBWSxFQUFFLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1FBQ3RFLFlBQVksQ0FBQyxPQUFPLEdBQUcsR0FBRyxFQUFFO1lBQzNCLElBQUksQ0FBQyxTQUFVLENBQUMsV0FBVyxDQUFDLHNDQUFzQyxFQUFFLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFDeEYsQ0FBQyxDQUFDO1FBQ0YsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDekMsQ0FBQztDQUNEO0FBbkRELGdDQW1EQzs7Ozs7Ozs7Ozs7Ozs7O0FDekREO0lBTUM7UUFMUSxtQkFBYyxHQUFhLEVBQUUsQ0FBQztRQUM5QixvQkFBZSxHQUFZLEtBQUssQ0FBQztRQUt4QyxNQUFNLGdCQUFnQixHQUFHLENBQUMsS0FBVSxFQUFFLEVBQUU7WUFDdkMsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDO1lBQzNDLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2xDLENBQUMsQ0FBQztRQUVGLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxrQkFBa0IsRUFBRSxHQUFHLEVBQUU7WUFDaEQsR0FBRyxDQUFDLENBQUMsTUFBTSxJQUFJLElBQUksUUFBUSxDQUFDLHNCQUFzQixDQUFDLGlCQUFpQixDQUFrQyxDQUFDLENBQUMsQ0FBQztnQkFDeEcsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO29CQUN6QixJQUFJLENBQUMsT0FBTyxHQUFHLGdCQUFnQixDQUFDO2dCQUNqQyxDQUFDO1lBQ0YsQ0FBQztRQUNGLENBQUMsQ0FBQyxDQUFDO1FBRUgsTUFBTSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUU7WUFDcEMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7Z0JBQ2pDLE1BQU0sQ0FBQztZQUNSLENBQUM7WUFDRCxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQztZQUM1QixFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztnQkFDakIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsbUNBQW1DLEVBQUUsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQztZQUNyRixDQUFDO1FBQ0YsQ0FBQyxDQUFDLENBQUM7SUFDSixDQUFDO0lBRU0sU0FBUyxDQUFDLE1BQXFCO1FBQ3JDLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3JCLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDO1lBQzFCLE1BQU0sQ0FBQyxXQUFXLENBQUMsbUNBQW1DLEVBQUUsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQztRQUNoRixDQUFDO0lBQ0YsQ0FBQztDQUNEO0FBckNELGtEQXFDQzs7Ozs7Ozs7Ozs7Ozs7QUMzQ0Q7OztnR0FHZ0c7O0FBRWhHLHVFQUFtQztBQUNuQyxtRkFBZ0Q7QUFTaEQsTUFBTSxDQUFDLFVBQVUsR0FBRyxJQUFJLGdCQUFVLEVBQUUsQ0FBQztBQUNyQyxNQUFNLENBQUMsbUJBQW1CLEdBQUcsSUFBSSw2QkFBbUIsRUFBRSxDQUFDOzs7Ozs7Ozs7Ozs7OztBQ2hCdkQ7OztnR0FHZ0c7O0FBWWhHLElBQUksY0FBYyxHQUFnQyxTQUFTLENBQUM7QUFFNUQ7SUFDQyxFQUFFLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDO1FBQ3BCLE1BQU0sQ0FBQyxjQUFjLENBQUM7SUFDdkIsQ0FBQztJQUVELE1BQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQyxjQUFjLENBQUMsOEJBQThCLENBQUMsQ0FBQztJQUN4RSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBQ2IsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLFlBQVksQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUNuRCxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQ1YsY0FBYyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDbEMsTUFBTSxDQUFDLGNBQWUsQ0FBQztRQUN4QixDQUFDO0lBQ0YsQ0FBQztJQUVELE1BQU0sSUFBSSxLQUFLLENBQUMseUJBQXlCLENBQUMsQ0FBQztBQUM1QyxDQUFDO0FBZkQsa0NBZUM7Ozs7Ozs7Ozs7Ozs7O0FDaENEOzs7Z0dBR2dHOztBQUVoRztJQUNDLE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxjQUFjLENBQUMsOEJBQThCLENBQUMsQ0FBQztJQUN0RSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ1gsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLFlBQVksQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUNoRCxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQ1YsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDekIsQ0FBQztJQUNGLENBQUM7SUFDRCxNQUFNLElBQUksS0FBSyxDQUFDLHdCQUF3QixDQUFDLENBQUM7QUFDM0MsQ0FBQztBQVRELGdDQVNDIiwiZmlsZSI6InByZS5qcyIsInNvdXJjZXNDb250ZW50IjpbIiBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbiBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG5cbiBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbiBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKSB7XG4gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4gXHRcdH1cbiBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbiBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuIFx0XHRcdGk6IG1vZHVsZUlkLFxuIFx0XHRcdGw6IGZhbHNlLFxuIFx0XHRcdGV4cG9ydHM6IHt9XG4gXHRcdH07XG5cbiBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG4gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbiBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuXG4gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbiBcdH1cblxuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbiBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cbiBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwge1xuIFx0XHRcdFx0Y29uZmlndXJhYmxlOiBmYWxzZSxcbiBcdFx0XHRcdGVudW1lcmFibGU6IHRydWUsXG4gXHRcdFx0XHRnZXQ6IGdldHRlclxuIFx0XHRcdH0pO1xuIFx0XHR9XG4gXHR9O1xuXG4gXHQvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSBmdW5jdGlvbihleHBvcnRzKSB7XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG4gXHR9O1xuXG4gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuIFx0XHRyZXR1cm4gZ2V0dGVyO1xuIFx0fTtcblxuIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07XG5cbiBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIlwiO1xuXG5cbiBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gXCIuL3ByZXZpZXctc3JjL3ByZS50c1wiKTtcbiIsIi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG5pbXBvcnQgeyBNZXNzYWdlUG9zdGVyIH0gZnJvbSAnLi9tZXNzYWdpbmcnO1xuaW1wb3J0IHsgZ2V0U2V0dGluZ3MgfSBmcm9tICcuL3NldHRpbmdzJztcbmltcG9ydCB7IGdldFN0cmluZ3MgfSBmcm9tICcuL3N0cmluZ3MnO1xuXG4vKipcbiAqIFNob3dzIGFuIGFsZXJ0IHdoZW4gdGhlcmUgaXMgYSBjb250ZW50IHNlY3VyaXR5IHBvbGljeSB2aW9sYXRpb24uXG4gKi9cbmV4cG9ydCBjbGFzcyBDc3BBbGVydGVyIHtcblx0cHJpdmF0ZSBkaWRTaG93ID0gZmFsc2U7XG5cdHByaXZhdGUgZGlkSGF2ZUNzcFdhcm5pbmcgPSBmYWxzZTtcblxuXHRwcml2YXRlIG1lc3NhZ2luZz86IE1lc3NhZ2VQb3N0ZXI7XG5cblx0Y29uc3RydWN0b3IoKSB7XG5cdFx0ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignc2VjdXJpdHlwb2xpY3l2aW9sYXRpb24nLCAoKSA9PiB7XG5cdFx0XHR0aGlzLm9uQ3NwV2FybmluZygpO1xuXHRcdH0pO1xuXG5cdFx0d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCAoZXZlbnQpID0+IHtcblx0XHRcdGlmIChldmVudCAmJiBldmVudC5kYXRhICYmIGV2ZW50LmRhdGEubmFtZSA9PT0gJ3ZzY29kZS1kaWQtYmxvY2stc3ZnJykge1xuXHRcdFx0XHR0aGlzLm9uQ3NwV2FybmluZygpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cblx0cHVibGljIHNldFBvc3Rlcihwb3N0ZXI6IE1lc3NhZ2VQb3N0ZXIpIHtcblx0XHR0aGlzLm1lc3NhZ2luZyA9IHBvc3Rlcjtcblx0XHRpZiAodGhpcy5kaWRIYXZlQ3NwV2FybmluZykge1xuXHRcdFx0dGhpcy5zaG93Q3NwV2FybmluZygpO1xuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgb25Dc3BXYXJuaW5nKCkge1xuXHRcdHRoaXMuZGlkSGF2ZUNzcFdhcm5pbmcgPSB0cnVlO1xuXHRcdHRoaXMuc2hvd0NzcFdhcm5pbmcoKTtcblx0fVxuXG5cdHByaXZhdGUgc2hvd0NzcFdhcm5pbmcoKSB7XG5cdFx0Y29uc3Qgc3RyaW5ncyA9IGdldFN0cmluZ3MoKTtcblx0XHRjb25zdCBzZXR0aW5ncyA9IGdldFNldHRpbmdzKCk7XG5cblx0XHRpZiAodGhpcy5kaWRTaG93IHx8IHNldHRpbmdzLmRpc2FibGVTZWN1cml0eVdhcm5pbmdzIHx8ICF0aGlzLm1lc3NhZ2luZykge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHR0aGlzLmRpZFNob3cgPSB0cnVlO1xuXG5cdFx0Y29uc3Qgbm90aWZpY2F0aW9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuXHRcdG5vdGlmaWNhdGlvbi5pbm5lclRleHQgPSBzdHJpbmdzLmNzcEFsZXJ0TWVzc2FnZVRleHQ7XG5cdFx0bm90aWZpY2F0aW9uLnNldEF0dHJpYnV0ZSgnaWQnLCAnY29kZS1jc3Atd2FybmluZycpO1xuXHRcdG5vdGlmaWNhdGlvbi5zZXRBdHRyaWJ1dGUoJ3RpdGxlJywgc3RyaW5ncy5jc3BBbGVydE1lc3NhZ2VUaXRsZSk7XG5cblx0XHRub3RpZmljYXRpb24uc2V0QXR0cmlidXRlKCdyb2xlJywgJ2J1dHRvbicpO1xuXHRcdG5vdGlmaWNhdGlvbi5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLCBzdHJpbmdzLmNzcEFsZXJ0TWVzc2FnZUxhYmVsKTtcblx0XHRub3RpZmljYXRpb24ub25jbGljayA9ICgpID0+IHtcblx0XHRcdHRoaXMubWVzc2FnaW5nIS5wb3N0Q29tbWFuZCgnbWFya2Rvd24uc2hvd1ByZXZpZXdTZWN1cml0eVNlbGVjdG9yJywgW3NldHRpbmdzLnNvdXJjZV0pO1xuXHRcdH07XG5cdFx0ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChub3RpZmljYXRpb24pO1xuXHR9XG59XG4iLCIvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cbmltcG9ydCB7IE1lc3NhZ2VQb3N0ZXIgfSBmcm9tICcuL21lc3NhZ2luZyc7XG5cbmV4cG9ydCBjbGFzcyBTdHlsZUxvYWRpbmdNb25pdG9yIHtcblx0cHJpdmF0ZSB1bmxvYWRlZFN0eWxlczogc3RyaW5nW10gPSBbXTtcblx0cHJpdmF0ZSBmaW5pc2hlZExvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcblxuXHRwcml2YXRlIHBvc3Rlcj86IE1lc3NhZ2VQb3N0ZXI7XG5cblx0Y29uc3RydWN0b3IoKSB7XG5cdFx0Y29uc3Qgb25TdHlsZUxvYWRFcnJvciA9IChldmVudDogYW55KSA9PiB7XG5cdFx0XHRjb25zdCBzb3VyY2UgPSBldmVudC50YXJnZXQuZGF0YXNldC5zb3VyY2U7XG5cdFx0XHR0aGlzLnVubG9hZGVkU3R5bGVzLnB1c2goc291cmNlKTtcblx0XHR9O1xuXG5cdFx0d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCAoKSA9PiB7XG5cdFx0XHRmb3IgKGNvbnN0IGxpbmsgb2YgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnY29kZS11c2VyLXN0eWxlJykgYXMgSFRNTENvbGxlY3Rpb25PZjxIVE1MRWxlbWVudD4pIHtcblx0XHRcdFx0aWYgKGxpbmsuZGF0YXNldC5zb3VyY2UpIHtcblx0XHRcdFx0XHRsaW5rLm9uZXJyb3IgPSBvblN0eWxlTG9hZEVycm9yO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHR3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsICgpID0+IHtcblx0XHRcdGlmICghdGhpcy51bmxvYWRlZFN0eWxlcy5sZW5ndGgpIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0dGhpcy5maW5pc2hlZExvYWRpbmcgPSB0cnVlO1xuXHRcdFx0aWYgKHRoaXMucG9zdGVyKSB7XG5cdFx0XHRcdHRoaXMucG9zdGVyLnBvc3RDb21tYW5kKCdfbWFya2Rvd24ub25QcmV2aWV3U3R5bGVMb2FkRXJyb3InLCBbdGhpcy51bmxvYWRlZFN0eWxlc10pO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cblx0cHVibGljIHNldFBvc3Rlcihwb3N0ZXI6IE1lc3NhZ2VQb3N0ZXIpOiB2b2lkIHtcblx0XHR0aGlzLnBvc3RlciA9IHBvc3Rlcjtcblx0XHRpZiAodGhpcy5maW5pc2hlZExvYWRpbmcpIHtcblx0XHRcdHBvc3Rlci5wb3N0Q29tbWFuZCgnX21hcmtkb3duLm9uUHJldmlld1N0eWxlTG9hZEVycm9yJywgW3RoaXMudW5sb2FkZWRTdHlsZXNdKTtcblx0XHR9XG5cdH1cbn0iLCIvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuaW1wb3J0IHsgQ3NwQWxlcnRlciB9IGZyb20gJy4vY3NwJztcbmltcG9ydCB7IFN0eWxlTG9hZGluZ01vbml0b3IgfSBmcm9tICcuL2xvYWRpbmcnO1xuXG5kZWNsYXJlIGdsb2JhbCB7XG5cdGludGVyZmFjZSBXaW5kb3cge1xuXHRcdGNzcEFsZXJ0ZXI6IENzcEFsZXJ0ZXI7XG5cdFx0c3R5bGVMb2FkaW5nTW9uaXRvcjogU3R5bGVMb2FkaW5nTW9uaXRvcjtcblx0fVxufVxuXG53aW5kb3cuY3NwQWxlcnRlciA9IG5ldyBDc3BBbGVydGVyKCk7XG53aW5kb3cuc3R5bGVMb2FkaW5nTW9uaXRvciA9IG5ldyBTdHlsZUxvYWRpbmdNb25pdG9yKCk7IiwiLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqICBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqICBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbmV4cG9ydCBpbnRlcmZhY2UgUHJldmlld1NldHRpbmdzIHtcblx0c291cmNlOiBzdHJpbmc7XG5cdGxpbmU6IG51bWJlcjtcblx0bGluZUNvdW50OiBudW1iZXI7XG5cdHNjcm9sbFByZXZpZXdXaXRoRWRpdG9yPzogYm9vbGVhbjtcblx0c2Nyb2xsRWRpdG9yV2l0aFByZXZpZXc6IGJvb2xlYW47XG5cdGRpc2FibGVTZWN1cml0eVdhcm5pbmdzOiBib29sZWFuO1xuXHRkb3VibGVDbGlja1RvU3dpdGNoVG9FZGl0b3I6IGJvb2xlYW47XG59XG5cbmxldCBjYWNoZWRTZXR0aW5nczogUHJldmlld1NldHRpbmdzIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2V0dGluZ3MoKTogUHJldmlld1NldHRpbmdzIHtcblx0aWYgKGNhY2hlZFNldHRpbmdzKSB7XG5cdFx0cmV0dXJuIGNhY2hlZFNldHRpbmdzO1xuXHR9XG5cblx0Y29uc3QgZWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd2c2NvZGUtbWFya2Rvd24tcHJldmlldy1kYXRhJyk7XG5cdGlmIChlbGVtZW50KSB7XG5cdFx0Y29uc3QgZGF0YSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLXNldHRpbmdzJyk7XG5cdFx0aWYgKGRhdGEpIHtcblx0XHRcdGNhY2hlZFNldHRpbmdzID0gSlNPTi5wYXJzZShkYXRhKTtcblx0XHRcdHJldHVybiBjYWNoZWRTZXR0aW5ncyE7XG5cdFx0fVxuXHR9XG5cblx0dGhyb3cgbmV3IEVycm9yKCdDb3VsZCBub3QgbG9hZCBzZXR0aW5ncycpO1xufVxuIiwiLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqICBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqICBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTdHJpbmdzKCk6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0ge1xuXHRjb25zdCBzdG9yZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd2c2NvZGUtbWFya2Rvd24tcHJldmlldy1kYXRhJyk7XG5cdGlmIChzdG9yZSkge1xuXHRcdGNvbnN0IGRhdGEgPSBzdG9yZS5nZXRBdHRyaWJ1dGUoJ2RhdGEtc3RyaW5ncycpO1xuXHRcdGlmIChkYXRhKSB7XG5cdFx0XHRyZXR1cm4gSlNPTi5wYXJzZShkYXRhKTtcblx0XHR9XG5cdH1cblx0dGhyb3cgbmV3IEVycm9yKCdDb3VsZCBub3QgbG9hZCBzdHJpbmdzJyk7XG59XG4iXSwic291cmNlUm9vdCI6IiJ9 \ No newline at end of file +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vLy4vcHJldmlldy1zcmMvY3NwLnRzIiwid2VicGFjazovLy8uL3ByZXZpZXctc3JjL2xvYWRpbmcudHMiLCJ3ZWJwYWNrOi8vLy4vcHJldmlldy1zcmMvcHJlLnRzIiwid2VicGFjazovLy8uL3ByZXZpZXctc3JjL3NldHRpbmdzLnRzIiwid2VicGFjazovLy8uL3ByZXZpZXctc3JjL3N0cmluZ3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0EseURBQWlELGNBQWM7QUFDL0Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsbUNBQTJCLDBCQUEwQixFQUFFO0FBQ3ZELHlDQUFpQyxlQUFlO0FBQ2hEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDhEQUFzRCwrREFBK0Q7O0FBRXJIO0FBQ0E7OztBQUdBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7O0FDbkVBOzs7Z0dBR2dHOztBQUdoRyxzRkFBeUM7QUFDekMsbUZBQXVDO0FBRXZDOztHQUVHO0FBQ0g7SUFNQztRQUxRLFlBQU8sR0FBRyxLQUFLLENBQUM7UUFDaEIsc0JBQWlCLEdBQUcsS0FBSyxDQUFDO1FBS2pDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyx5QkFBeUIsRUFBRSxHQUFHLEVBQUU7WUFDekQsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3JCLENBQUMsQ0FBQyxDQUFDO1FBRUgsTUFBTSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQzVDLEVBQUUsQ0FBQyxDQUFDLEtBQUssSUFBSSxLQUFLLENBQUMsSUFBSSxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLLHNCQUFzQixDQUFDLENBQUMsQ0FBQztnQkFDdkUsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3JCLENBQUM7UUFDRixDQUFDLENBQUMsQ0FBQztJQUNKLENBQUM7SUFFTSxTQUFTLENBQUMsTUFBcUI7UUFDckMsSUFBSSxDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUM7UUFDeEIsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQztZQUM1QixJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDdkIsQ0FBQztJQUNGLENBQUM7SUFFTyxZQUFZO1FBQ25CLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUM7UUFDOUIsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO0lBQ3ZCLENBQUM7SUFFTyxjQUFjO1FBQ3JCLE1BQU0sT0FBTyxHQUFHLG9CQUFVLEVBQUUsQ0FBQztRQUM3QixNQUFNLFFBQVEsR0FBRyxzQkFBVyxFQUFFLENBQUM7UUFFL0IsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sSUFBSSxRQUFRLENBQUMsdUJBQXVCLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztZQUN6RSxNQUFNLENBQUM7UUFDUixDQUFDO1FBQ0QsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7UUFFcEIsTUFBTSxZQUFZLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNqRCxZQUFZLENBQUMsU0FBUyxHQUFHLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQztRQUNyRCxZQUFZLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO1FBQ3BELFlBQVksQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1FBRWpFLFlBQVksQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQzVDLFlBQVksQ0FBQyxZQUFZLENBQUMsWUFBWSxFQUFFLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1FBQ3RFLFlBQVksQ0FBQyxPQUFPLEdBQUcsR0FBRyxFQUFFO1lBQzNCLElBQUksQ0FBQyxTQUFVLENBQUMsV0FBVyxDQUFDLHNDQUFzQyxFQUFFLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFDeEYsQ0FBQyxDQUFDO1FBQ0YsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDekMsQ0FBQztDQUNEO0FBbkRELGdDQW1EQzs7Ozs7Ozs7Ozs7Ozs7O0FDekREO0lBTUM7UUFMUSxtQkFBYyxHQUFhLEVBQUUsQ0FBQztRQUM5QixvQkFBZSxHQUFZLEtBQUssQ0FBQztRQUt4QyxNQUFNLGdCQUFnQixHQUFHLENBQUMsS0FBVSxFQUFFLEVBQUU7WUFDdkMsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDO1lBQzNDLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2xDLENBQUMsQ0FBQztRQUVGLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxrQkFBa0IsRUFBRSxHQUFHLEVBQUU7WUFDaEQsR0FBRyxDQUFDLENBQUMsTUFBTSxJQUFJLElBQUksUUFBUSxDQUFDLHNCQUFzQixDQUFDLGlCQUFpQixDQUFrQyxDQUFDLENBQUMsQ0FBQztnQkFDeEcsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO29CQUN6QixJQUFJLENBQUMsT0FBTyxHQUFHLGdCQUFnQixDQUFDO2dCQUNqQyxDQUFDO1lBQ0YsQ0FBQztRQUNGLENBQUMsQ0FBQyxDQUFDO1FBRUgsTUFBTSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUU7WUFDcEMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7Z0JBQ2pDLE1BQU0sQ0FBQztZQUNSLENBQUM7WUFDRCxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQztZQUM1QixFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztnQkFDakIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsbUNBQW1DLEVBQUUsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQztZQUNyRixDQUFDO1FBQ0YsQ0FBQyxDQUFDLENBQUM7SUFDSixDQUFDO0lBRU0sU0FBUyxDQUFDLE1BQXFCO1FBQ3JDLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3JCLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDO1lBQzFCLE1BQU0sQ0FBQyxXQUFXLENBQUMsbUNBQW1DLEVBQUUsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQztRQUNoRixDQUFDO0lBQ0YsQ0FBQztDQUNEO0FBckNELGtEQXFDQzs7Ozs7Ozs7Ozs7Ozs7QUMzQ0Q7OztnR0FHZ0c7O0FBRWhHLHVFQUFtQztBQUNuQyxtRkFBZ0Q7QUFTaEQsTUFBTSxDQUFDLFVBQVUsR0FBRyxJQUFJLGdCQUFVLEVBQUUsQ0FBQztBQUNyQyxNQUFNLENBQUMsbUJBQW1CLEdBQUcsSUFBSSw2QkFBbUIsRUFBRSxDQUFDOzs7Ozs7Ozs7Ozs7OztBQ2hCdkQ7OztnR0FHZ0c7O0FBWWhHLElBQUksY0FBYyxHQUFnQyxTQUFTLENBQUM7QUFFNUQsaUJBQXdCLEdBQVc7SUFDbEMsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDLGNBQWMsQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDO0lBQ3hFLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFDYixNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3ZDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDVixNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN6QixDQUFDO0lBQ0YsQ0FBQztJQUVELE1BQU0sSUFBSSxLQUFLLENBQUMsMkJBQTJCLEdBQUcsRUFBRSxDQUFDLENBQUM7QUFDbkQsQ0FBQztBQVZELDBCQVVDO0FBRUQ7SUFDQyxFQUFFLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDO1FBQ3BCLE1BQU0sQ0FBQyxjQUFjLENBQUM7SUFDdkIsQ0FBQztJQUVELGNBQWMsR0FBRyxPQUFPLENBQUMsZUFBZSxDQUFDLENBQUM7SUFDMUMsRUFBRSxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQztRQUNwQixNQUFNLENBQUMsY0FBYyxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxNQUFNLElBQUksS0FBSyxDQUFDLHlCQUF5QixDQUFDLENBQUM7QUFDNUMsQ0FBQztBQVhELGtDQVdDOzs7Ozs7Ozs7Ozs7OztBQ3hDRDs7O2dHQUdnRzs7QUFFaEc7SUFDQyxNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDLDhCQUE4QixDQUFDLENBQUM7SUFDdEUsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUNYLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxZQUFZLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDaEQsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUNWLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3pCLENBQUM7SUFDRixDQUFDO0lBQ0QsTUFBTSxJQUFJLEtBQUssQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO0FBQzNDLENBQUM7QUFURCxnQ0FTQyIsImZpbGUiOiJwcmUuanMiLCJzb3VyY2VzQ29udGVudCI6WyIgXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuXG4gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXG4gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSkge1xuIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuIFx0XHR9XG4gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbiBcdFx0XHRpOiBtb2R1bGVJZCxcbiBcdFx0XHRsOiBmYWxzZSxcbiBcdFx0XHRleHBvcnRzOiB7fVxuIFx0XHR9O1xuXG4gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4gXHRcdG1vZHVsZS5sID0gdHJ1ZTtcblxuIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4gXHR9XG5cblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuXG4gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuIFx0XHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHtcbiBcdFx0XHRcdGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gXHRcdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuIFx0XHRcdFx0Z2V0OiBnZXR0ZXJcbiBcdFx0XHR9KTtcbiBcdFx0fVxuIFx0fTtcblxuIFx0Ly8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yID0gZnVuY3Rpb24oZXhwb3J0cykge1xuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuIFx0fTtcblxuIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbiBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbiBcdFx0cmV0dXJuIGdldHRlcjtcbiBcdH07XG5cbiBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcblxuXG4gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbiBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IFwiLi9wcmV2aWV3LXNyYy9wcmUudHNcIik7XG4iLCIvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuaW1wb3J0IHsgTWVzc2FnZVBvc3RlciB9IGZyb20gJy4vbWVzc2FnaW5nJztcbmltcG9ydCB7IGdldFNldHRpbmdzIH0gZnJvbSAnLi9zZXR0aW5ncyc7XG5pbXBvcnQgeyBnZXRTdHJpbmdzIH0gZnJvbSAnLi9zdHJpbmdzJztcblxuLyoqXG4gKiBTaG93cyBhbiBhbGVydCB3aGVuIHRoZXJlIGlzIGEgY29udGVudCBzZWN1cml0eSBwb2xpY3kgdmlvbGF0aW9uLlxuICovXG5leHBvcnQgY2xhc3MgQ3NwQWxlcnRlciB7XG5cdHByaXZhdGUgZGlkU2hvdyA9IGZhbHNlO1xuXHRwcml2YXRlIGRpZEhhdmVDc3BXYXJuaW5nID0gZmFsc2U7XG5cblx0cHJpdmF0ZSBtZXNzYWdpbmc/OiBNZXNzYWdlUG9zdGVyO1xuXG5cdGNvbnN0cnVjdG9yKCkge1xuXHRcdGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3NlY3VyaXR5cG9saWN5dmlvbGF0aW9uJywgKCkgPT4ge1xuXHRcdFx0dGhpcy5vbkNzcFdhcm5pbmcoKTtcblx0XHR9KTtcblxuXHRcdHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgKGV2ZW50KSA9PiB7XG5cdFx0XHRpZiAoZXZlbnQgJiYgZXZlbnQuZGF0YSAmJiBldmVudC5kYXRhLm5hbWUgPT09ICd2c2NvZGUtZGlkLWJsb2NrLXN2ZycpIHtcblx0XHRcdFx0dGhpcy5vbkNzcFdhcm5pbmcoKTtcblx0XHRcdH1cblx0XHR9KTtcblx0fVxuXG5cdHB1YmxpYyBzZXRQb3N0ZXIocG9zdGVyOiBNZXNzYWdlUG9zdGVyKSB7XG5cdFx0dGhpcy5tZXNzYWdpbmcgPSBwb3N0ZXI7XG5cdFx0aWYgKHRoaXMuZGlkSGF2ZUNzcFdhcm5pbmcpIHtcblx0XHRcdHRoaXMuc2hvd0NzcFdhcm5pbmcoKTtcblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIG9uQ3NwV2FybmluZygpIHtcblx0XHR0aGlzLmRpZEhhdmVDc3BXYXJuaW5nID0gdHJ1ZTtcblx0XHR0aGlzLnNob3dDc3BXYXJuaW5nKCk7XG5cdH1cblxuXHRwcml2YXRlIHNob3dDc3BXYXJuaW5nKCkge1xuXHRcdGNvbnN0IHN0cmluZ3MgPSBnZXRTdHJpbmdzKCk7XG5cdFx0Y29uc3Qgc2V0dGluZ3MgPSBnZXRTZXR0aW5ncygpO1xuXG5cdFx0aWYgKHRoaXMuZGlkU2hvdyB8fCBzZXR0aW5ncy5kaXNhYmxlU2VjdXJpdHlXYXJuaW5ncyB8fCAhdGhpcy5tZXNzYWdpbmcpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0dGhpcy5kaWRTaG93ID0gdHJ1ZTtcblxuXHRcdGNvbnN0IG5vdGlmaWNhdGlvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcblx0XHRub3RpZmljYXRpb24uaW5uZXJUZXh0ID0gc3RyaW5ncy5jc3BBbGVydE1lc3NhZ2VUZXh0O1xuXHRcdG5vdGlmaWNhdGlvbi5zZXRBdHRyaWJ1dGUoJ2lkJywgJ2NvZGUtY3NwLXdhcm5pbmcnKTtcblx0XHRub3RpZmljYXRpb24uc2V0QXR0cmlidXRlKCd0aXRsZScsIHN0cmluZ3MuY3NwQWxlcnRNZXNzYWdlVGl0bGUpO1xuXG5cdFx0bm90aWZpY2F0aW9uLnNldEF0dHJpYnV0ZSgncm9sZScsICdidXR0b24nKTtcblx0XHRub3RpZmljYXRpb24uc2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJywgc3RyaW5ncy5jc3BBbGVydE1lc3NhZ2VMYWJlbCk7XG5cdFx0bm90aWZpY2F0aW9uLm9uY2xpY2sgPSAoKSA9PiB7XG5cdFx0XHR0aGlzLm1lc3NhZ2luZyEucG9zdENvbW1hbmQoJ21hcmtkb3duLnNob3dQcmV2aWV3U2VjdXJpdHlTZWxlY3RvcicsIFtzZXR0aW5ncy5zb3VyY2VdKTtcblx0XHR9O1xuXHRcdGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQobm90aWZpY2F0aW9uKTtcblx0fVxufVxuIiwiLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqICBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqICBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5pbXBvcnQgeyBNZXNzYWdlUG9zdGVyIH0gZnJvbSAnLi9tZXNzYWdpbmcnO1xuXG5leHBvcnQgY2xhc3MgU3R5bGVMb2FkaW5nTW9uaXRvciB7XG5cdHByaXZhdGUgdW5sb2FkZWRTdHlsZXM6IHN0cmluZ1tdID0gW107XG5cdHByaXZhdGUgZmluaXNoZWRMb2FkaW5nOiBib29sZWFuID0gZmFsc2U7XG5cblx0cHJpdmF0ZSBwb3N0ZXI/OiBNZXNzYWdlUG9zdGVyO1xuXG5cdGNvbnN0cnVjdG9yKCkge1xuXHRcdGNvbnN0IG9uU3R5bGVMb2FkRXJyb3IgPSAoZXZlbnQ6IGFueSkgPT4ge1xuXHRcdFx0Y29uc3Qgc291cmNlID0gZXZlbnQudGFyZ2V0LmRhdGFzZXQuc291cmNlO1xuXHRcdFx0dGhpcy51bmxvYWRlZFN0eWxlcy5wdXNoKHNvdXJjZSk7XG5cdFx0fTtcblxuXHRcdHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgKCkgPT4ge1xuXHRcdFx0Zm9yIChjb25zdCBsaW5rIG9mIGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2NvZGUtdXNlci1zdHlsZScpIGFzIEhUTUxDb2xsZWN0aW9uT2Y8SFRNTEVsZW1lbnQ+KSB7XG5cdFx0XHRcdGlmIChsaW5rLmRhdGFzZXQuc291cmNlKSB7XG5cdFx0XHRcdFx0bGluay5vbmVycm9yID0gb25TdHlsZUxvYWRFcnJvcjtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCAoKSA9PiB7XG5cdFx0XHRpZiAoIXRoaXMudW5sb2FkZWRTdHlsZXMubGVuZ3RoKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdHRoaXMuZmluaXNoZWRMb2FkaW5nID0gdHJ1ZTtcblx0XHRcdGlmICh0aGlzLnBvc3Rlcikge1xuXHRcdFx0XHR0aGlzLnBvc3Rlci5wb3N0Q29tbWFuZCgnX21hcmtkb3duLm9uUHJldmlld1N0eWxlTG9hZEVycm9yJywgW3RoaXMudW5sb2FkZWRTdHlsZXNdKTtcblx0XHRcdH1cblx0XHR9KTtcblx0fVxuXG5cdHB1YmxpYyBzZXRQb3N0ZXIocG9zdGVyOiBNZXNzYWdlUG9zdGVyKTogdm9pZCB7XG5cdFx0dGhpcy5wb3N0ZXIgPSBwb3N0ZXI7XG5cdFx0aWYgKHRoaXMuZmluaXNoZWRMb2FkaW5nKSB7XG5cdFx0XHRwb3N0ZXIucG9zdENvbW1hbmQoJ19tYXJrZG93bi5vblByZXZpZXdTdHlsZUxvYWRFcnJvcicsIFt0aGlzLnVubG9hZGVkU3R5bGVzXSk7XG5cdFx0fVxuXHR9XG59IiwiLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqICBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqICBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbmltcG9ydCB7IENzcEFsZXJ0ZXIgfSBmcm9tICcuL2NzcCc7XG5pbXBvcnQgeyBTdHlsZUxvYWRpbmdNb25pdG9yIH0gZnJvbSAnLi9sb2FkaW5nJztcblxuZGVjbGFyZSBnbG9iYWwge1xuXHRpbnRlcmZhY2UgV2luZG93IHtcblx0XHRjc3BBbGVydGVyOiBDc3BBbGVydGVyO1xuXHRcdHN0eWxlTG9hZGluZ01vbml0b3I6IFN0eWxlTG9hZGluZ01vbml0b3I7XG5cdH1cbn1cblxud2luZG93LmNzcEFsZXJ0ZXIgPSBuZXcgQ3NwQWxlcnRlcigpO1xud2luZG93LnN0eWxlTG9hZGluZ01vbml0b3IgPSBuZXcgU3R5bGVMb2FkaW5nTW9uaXRvcigpOyIsIi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG5leHBvcnQgaW50ZXJmYWNlIFByZXZpZXdTZXR0aW5ncyB7XG5cdHNvdXJjZTogc3RyaW5nO1xuXHRsaW5lOiBudW1iZXI7XG5cdGxpbmVDb3VudDogbnVtYmVyO1xuXHRzY3JvbGxQcmV2aWV3V2l0aEVkaXRvcj86IGJvb2xlYW47XG5cdHNjcm9sbEVkaXRvcldpdGhQcmV2aWV3OiBib29sZWFuO1xuXHRkaXNhYmxlU2VjdXJpdHlXYXJuaW5nczogYm9vbGVhbjtcblx0ZG91YmxlQ2xpY2tUb1N3aXRjaFRvRWRpdG9yOiBib29sZWFuO1xufVxuXG5sZXQgY2FjaGVkU2V0dGluZ3M6IFByZXZpZXdTZXR0aW5ncyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldERhdGEoa2V5OiBzdHJpbmcpOiBQcmV2aWV3U2V0dGluZ3Mge1xuXHRjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3ZzY29kZS1tYXJrZG93bi1wcmV2aWV3LWRhdGEnKTtcblx0aWYgKGVsZW1lbnQpIHtcblx0XHRjb25zdCBkYXRhID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoa2V5KTtcblx0XHRpZiAoZGF0YSkge1xuXHRcdFx0cmV0dXJuIEpTT04ucGFyc2UoZGF0YSk7XG5cdFx0fVxuXHR9XG5cblx0dGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgbG9hZCBkYXRhIGZvciAke2tleX1gKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNldHRpbmdzKCk6IFByZXZpZXdTZXR0aW5ncyB7XG5cdGlmIChjYWNoZWRTZXR0aW5ncykge1xuXHRcdHJldHVybiBjYWNoZWRTZXR0aW5ncztcblx0fVxuXG5cdGNhY2hlZFNldHRpbmdzID0gZ2V0RGF0YSgnZGF0YS1zZXR0aW5ncycpO1xuXHRpZiAoY2FjaGVkU2V0dGluZ3MpIHtcblx0XHRyZXR1cm4gY2FjaGVkU2V0dGluZ3M7XG5cdH1cblxuXHR0aHJvdyBuZXcgRXJyb3IoJ0NvdWxkIG5vdCBsb2FkIHNldHRpbmdzJyk7XG59XG4iLCIvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFN0cmluZ3MoKTogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSB7XG5cdGNvbnN0IHN0b3JlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3ZzY29kZS1tYXJrZG93bi1wcmV2aWV3LWRhdGEnKTtcblx0aWYgKHN0b3JlKSB7XG5cdFx0Y29uc3QgZGF0YSA9IHN0b3JlLmdldEF0dHJpYnV0ZSgnZGF0YS1zdHJpbmdzJyk7XG5cdFx0aWYgKGRhdGEpIHtcblx0XHRcdHJldHVybiBKU09OLnBhcnNlKGRhdGEpO1xuXHRcdH1cblx0fVxuXHR0aHJvdyBuZXcgRXJyb3IoJ0NvdWxkIG5vdCBsb2FkIHN0cmluZ3MnKTtcbn1cbiJdLCJzb3VyY2VSb290IjoiIn0= diff --git a/extensions/markdown-language-features/package.json b/extensions/markdown-language-features/package.json index 491dfe0839..b49638d970 100644 --- a/extensions/markdown-language-features/package.json +++ b/extensions/markdown-language-features/package.json @@ -23,7 +23,7 @@ "onCommand:markdown.showLockedPreviewToSide", "onCommand:markdown.showSource", "onCommand:markdown.showPreviewSecuritySelector", - "onView:markdown.preview" + "onWebviewPanel:markdown.preview" ], "contributes": { "commands": [ @@ -115,6 +115,13 @@ "group": "navigation" } ], + "editor/title/context": [ + { + "command": "markdown.showPreview", + "when": "resourceLangId == markdown", + "group": "navigation" + } + ], "commandPalette": [ { "command": "markdown.showPreview", @@ -271,7 +278,7 @@ ], "markdown.previewStyles": [ "./media/markdown.css", - "./media/tomorrow.css" + "./media/highlight.css" ], "markdown.previewScripts": [ "./media/index.js" @@ -285,11 +292,11 @@ "build-preview": "webpack --mode development" }, "dependencies": { - "highlight.js": "9.5.0", - "markdown-it": "^8.4.0", + "highlight.js": "9.12.0", + "markdown-it": "^8.4.1", "markdown-it-named-headers": "0.0.4", - "vscode-extension-telemetry": "0.0.17", - "vscode-nls": "^3.2.1" + "vscode-extension-telemetry": "0.0.18", + "vscode-nls": "^3.2.4" }, "devDependencies": { "@types/highlight.js": "9.1.10", @@ -297,10 +304,12 @@ "@types/markdown-it": "0.0.2", "@types/node": "7.0.43", "lodash.throttle": "^4.1.1", + "mocha-junit-reporter": "^1.17.0", + "mocha-multi-reporters": "^1.1.7", "ts-loader": "^4.0.1", "typescript": "^2.7.2", "vscode": "^1.1.10", "webpack": "^4.1.0", "webpack-cli": "^2.0.10" } -} \ No newline at end of file +} diff --git a/extensions/markdown-language-features/preview-src/activeLineMarker.ts b/extensions/markdown-language-features/preview-src/activeLineMarker.ts index 21f41bc675..7204bfae4a 100644 --- a/extensions/markdown-language-features/preview-src/activeLineMarker.ts +++ b/extensions/markdown-language-features/preview-src/activeLineMarker.ts @@ -1,6 +1,6 @@ /*--------------------------------------------------------------------------------------------- * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. + * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ import { getElementsForSourceLine } from './scroll-sync'; diff --git a/extensions/markdown-language-features/preview-src/csp.ts b/extensions/markdown-language-features/preview-src/csp.ts index d7af87412f..7f524ee662 100644 --- a/extensions/markdown-language-features/preview-src/csp.ts +++ b/extensions/markdown-language-features/preview-src/csp.ts @@ -1,6 +1,6 @@ /*--------------------------------------------------------------------------------------------- * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. + * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ import { MessagePoster } from './messaging'; diff --git a/extensions/markdown-language-features/preview-src/events.ts b/extensions/markdown-language-features/preview-src/events.ts index 40833aca71..919b4863a6 100644 --- a/extensions/markdown-language-features/preview-src/events.ts +++ b/extensions/markdown-language-features/preview-src/events.ts @@ -1,6 +1,6 @@ /*--------------------------------------------------------------------------------------------- * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. + * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ export function onceDocumentLoaded(f: () => void) { diff --git a/extensions/markdown-language-features/preview-src/index.ts b/extensions/markdown-language-features/preview-src/index.ts index 8572230ab2..eb090b9327 100644 --- a/extensions/markdown-language-features/preview-src/index.ts +++ b/extensions/markdown-language-features/preview-src/index.ts @@ -1,13 +1,13 @@ /*--------------------------------------------------------------------------------------------- * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. + * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ import { ActiveLineMarker } from './activeLineMarker'; import { onceDocumentLoaded } from './events'; import { createPosterForVsCode } from './messaging'; import { getEditorLineNumberForPageOffset, scrollToRevealSourceLine } from './scroll-sync'; -import { getSettings } from './settings'; +import { getSettings, getData } from './settings'; import throttle = require('lodash.throttle'); declare var acquireVsCodeApi: any; @@ -17,7 +17,10 @@ const marker = new ActiveLineMarker(); const settings = getSettings(); const vscode = acquireVsCodeApi(); -vscode.postMessage({}); + +// Set VS Code state +const state = getData('data-state'); +vscode.setState(state); const messaging = createPosterForVsCode(vscode); diff --git a/extensions/markdown-language-features/preview-src/loading.ts b/extensions/markdown-language-features/preview-src/loading.ts index 94f4455a0c..99d0fbe722 100644 --- a/extensions/markdown-language-features/preview-src/loading.ts +++ b/extensions/markdown-language-features/preview-src/loading.ts @@ -1,6 +1,6 @@ /*--------------------------------------------------------------------------------------------- * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. + * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ import { MessagePoster } from './messaging'; diff --git a/extensions/markdown-language-features/preview-src/messaging.ts b/extensions/markdown-language-features/preview-src/messaging.ts index 7037766b7a..13e6db62ca 100644 --- a/extensions/markdown-language-features/preview-src/messaging.ts +++ b/extensions/markdown-language-features/preview-src/messaging.ts @@ -1,6 +1,6 @@ /*--------------------------------------------------------------------------------------------- * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. + * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ import { getSettings } from './settings'; diff --git a/extensions/markdown-language-features/preview-src/pre.ts b/extensions/markdown-language-features/preview-src/pre.ts index 9f1c806a97..7c314f74b0 100644 --- a/extensions/markdown-language-features/preview-src/pre.ts +++ b/extensions/markdown-language-features/preview-src/pre.ts @@ -1,6 +1,6 @@ /*--------------------------------------------------------------------------------------------- * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. + * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ import { CspAlerter } from './csp'; diff --git a/extensions/markdown-language-features/preview-src/scroll-sync.ts b/extensions/markdown-language-features/preview-src/scroll-sync.ts index dacc14a867..3a1499a043 100644 --- a/extensions/markdown-language-features/preview-src/scroll-sync.ts +++ b/extensions/markdown-language-features/preview-src/scroll-sync.ts @@ -1,6 +1,6 @@ /*--------------------------------------------------------------------------------------------- * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. + * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ import { getSettings } from './settings'; diff --git a/extensions/markdown-language-features/preview-src/settings.ts b/extensions/markdown-language-features/preview-src/settings.ts index b00abf281f..8cd8d7fd45 100644 --- a/extensions/markdown-language-features/preview-src/settings.ts +++ b/extensions/markdown-language-features/preview-src/settings.ts @@ -1,6 +1,6 @@ /*--------------------------------------------------------------------------------------------- * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. + * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ export interface PreviewSettings { @@ -15,18 +15,26 @@ export interface PreviewSettings { let cachedSettings: PreviewSettings | undefined = undefined; +export function getData(key: string): PreviewSettings { + const element = document.getElementById('vscode-markdown-preview-data'); + if (element) { + const data = element.getAttribute(key); + if (data) { + return JSON.parse(data); + } + } + + throw new Error(`Could not load data for ${key}`); +} + export function getSettings(): PreviewSettings { if (cachedSettings) { return cachedSettings; } - const element = document.getElementById('vscode-markdown-preview-data'); - if (element) { - const data = element.getAttribute('data-settings'); - if (data) { - cachedSettings = JSON.parse(data); - return cachedSettings!; - } + cachedSettings = getData('data-settings'); + if (cachedSettings) { + return cachedSettings; } throw new Error('Could not load settings'); diff --git a/extensions/markdown-language-features/preview-src/strings.ts b/extensions/markdown-language-features/preview-src/strings.ts index 61524535b9..495406d5c0 100644 --- a/extensions/markdown-language-features/preview-src/strings.ts +++ b/extensions/markdown-language-features/preview-src/strings.ts @@ -1,6 +1,6 @@ /*--------------------------------------------------------------------------------------------- * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. + * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ export function getStrings(): { [key: string]: string } { diff --git a/extensions/markdown-language-features/src/commandManager.ts b/extensions/markdown-language-features/src/commandManager.ts index 359d5b9ca9..174f30cd44 100644 --- a/extensions/markdown-language-features/src/commandManager.ts +++ b/extensions/markdown-language-features/src/commandManager.ts @@ -1,6 +1,6 @@ /*--------------------------------------------------------------------------------------------- * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. + * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ import * as vscode from 'vscode'; diff --git a/extensions/markdown-language-features/src/commands/index.ts b/extensions/markdown-language-features/src/commands/index.ts index 1ee4346db7..087f93987f 100644 --- a/extensions/markdown-language-features/src/commands/index.ts +++ b/extensions/markdown-language-features/src/commands/index.ts @@ -1,6 +1,6 @@ /*--------------------------------------------------------------------------------------------- * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. + * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ export { OpenDocumentLinkCommand } from './openDocumentLink'; diff --git a/extensions/markdown-language-features/src/commands/moveCursorToPosition.ts b/extensions/markdown-language-features/src/commands/moveCursorToPosition.ts index bcc9e56f0c..84be98db7f 100644 --- a/extensions/markdown-language-features/src/commands/moveCursorToPosition.ts +++ b/extensions/markdown-language-features/src/commands/moveCursorToPosition.ts @@ -1,6 +1,6 @@ /*--------------------------------------------------------------------------------------------- * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. + * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ import * as vscode from 'vscode'; diff --git a/extensions/markdown-language-features/src/commands/onPreviewStyleLoadError.ts b/extensions/markdown-language-features/src/commands/onPreviewStyleLoadError.ts index 9ea6fceb93..a2d1fa4d1f 100644 --- a/extensions/markdown-language-features/src/commands/onPreviewStyleLoadError.ts +++ b/extensions/markdown-language-features/src/commands/onPreviewStyleLoadError.ts @@ -1,6 +1,6 @@ /*--------------------------------------------------------------------------------------------- * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. + * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ import * as nls from 'vscode-nls'; const localize = nls.loadMessageBundle(); diff --git a/extensions/markdown-language-features/src/commands/openDocumentLink.ts b/extensions/markdown-language-features/src/commands/openDocumentLink.ts index 79e5e6c5b2..00074a6496 100644 --- a/extensions/markdown-language-features/src/commands/openDocumentLink.ts +++ b/extensions/markdown-language-features/src/commands/openDocumentLink.ts @@ -1,6 +1,6 @@ /*--------------------------------------------------------------------------------------------- * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. + * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ import * as vscode from 'vscode'; @@ -46,10 +46,10 @@ export class OpenDocumentLinkCommand implements Command { } private async tryOpen(path: string, args: OpenDocumentLinkArgs) { - if (vscode.window.activeTextEditor && isMarkdownFile(vscode.window.activeTextEditor.document) && vscode.window.activeTextEditor.document.uri.fsPath === path) { + const resource = vscode.Uri.file(path); + if (vscode.window.activeTextEditor && isMarkdownFile(vscode.window.activeTextEditor.document) && vscode.window.activeTextEditor.document.uri.fsPath === resource.fsPath) { return this.tryRevealLine(vscode.window.activeTextEditor, args.fragment); } else { - const resource = vscode.Uri.file(path); return vscode.workspace.openTextDocument(resource) .then(vscode.window.showTextDocument) .then(editor => this.tryRevealLine(editor, args.fragment)); @@ -63,7 +63,7 @@ export class OpenDocumentLinkCommand implements Command { if (entry) { return editor.revealRange(new vscode.Range(entry.line, 0, entry.line, 0), vscode.TextEditorRevealType.AtTop); } - const lineNumberFragment = fragment.match(/^L(\d+)$/); + const lineNumberFragment = fragment.match(/^L(\d+)$/i); if (lineNumberFragment) { const line = +lineNumberFragment[1] - 1; if (!isNaN(line)) { diff --git a/extensions/markdown-language-features/src/commands/refreshPreview.ts b/extensions/markdown-language-features/src/commands/refreshPreview.ts index fb1bb82996..338f24c3d9 100644 --- a/extensions/markdown-language-features/src/commands/refreshPreview.ts +++ b/extensions/markdown-language-features/src/commands/refreshPreview.ts @@ -1,6 +1,6 @@ /*--------------------------------------------------------------------------------------------- * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. + * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ import { Command } from '../commandManager'; diff --git a/extensions/markdown-language-features/src/commands/showPreview.ts b/extensions/markdown-language-features/src/commands/showPreview.ts index 69efb7fcb1..e7377eb56c 100644 --- a/extensions/markdown-language-features/src/commands/showPreview.ts +++ b/extensions/markdown-language-features/src/commands/showPreview.ts @@ -1,6 +1,6 @@ /*--------------------------------------------------------------------------------------------- * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. + * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ import * as vscode from 'vscode'; @@ -10,27 +10,6 @@ import { MarkdownPreviewManager } from '../features/previewManager'; import { TelemetryReporter } from '../telemetryReporter'; import { PreviewSettings } from '../features/preview'; - -function getViewColumn(sideBySide: boolean): vscode.ViewColumn | undefined { - const active = vscode.window.activeTextEditor; - if (!active) { - return vscode.ViewColumn.One; - } - - if (!sideBySide) { - return active.viewColumn; - } - - switch (active.viewColumn) { - case vscode.ViewColumn.One: - return vscode.ViewColumn.Two; - case vscode.ViewColumn.Two: - return vscode.ViewColumn.Three; - } - - return active.viewColumn; -} - interface ShowPreviewSettings { readonly sideBySide?: boolean; readonly locked?: boolean; @@ -61,7 +40,7 @@ async function showPreview( webviewManager.preview(resource, { resourceColumn: (vscode.window.activeTextEditor && vscode.window.activeTextEditor.viewColumn) || vscode.ViewColumn.One, - previewColumn: getViewColumn(!!previewSettings.sideBySide) || vscode.ViewColumn.Active, + previewColumn: previewSettings.sideBySide ? vscode.ViewColumn.Beside : vscode.ViewColumn.Active, locked: !!previewSettings.locked }); @@ -80,7 +59,7 @@ export class ShowPreviewCommand implements Command { ) { } public execute(mainUri?: vscode.Uri, allUris?: vscode.Uri[], previewSettings?: PreviewSettings) { - for (const uri of (allUris || [mainUri])) { + for (const uri of Array.isArray(allUris) ? allUris : [mainUri]) { showPreview(this.webviewManager, this.telemetryReporter, uri, { sideBySide: false, locked: previewSettings && previewSettings.locked diff --git a/extensions/markdown-language-features/src/commands/showPreviewSecuritySelector.ts b/extensions/markdown-language-features/src/commands/showPreviewSecuritySelector.ts index 2e520415eb..5b83706696 100644 --- a/extensions/markdown-language-features/src/commands/showPreviewSecuritySelector.ts +++ b/extensions/markdown-language-features/src/commands/showPreviewSecuritySelector.ts @@ -1,6 +1,6 @@ /*--------------------------------------------------------------------------------------------- * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. + * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ import * as vscode from 'vscode'; diff --git a/extensions/markdown-language-features/src/commands/showSource.ts b/extensions/markdown-language-features/src/commands/showSource.ts index a916bccefc..bc562c9070 100644 --- a/extensions/markdown-language-features/src/commands/showSource.ts +++ b/extensions/markdown-language-features/src/commands/showSource.ts @@ -1,6 +1,6 @@ /*--------------------------------------------------------------------------------------------- * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. + * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ import * as vscode from 'vscode'; diff --git a/extensions/markdown-language-features/src/commands/toggleLock.ts b/extensions/markdown-language-features/src/commands/toggleLock.ts index a6596e5e27..98a6044b13 100644 --- a/extensions/markdown-language-features/src/commands/toggleLock.ts +++ b/extensions/markdown-language-features/src/commands/toggleLock.ts @@ -1,6 +1,6 @@ /*--------------------------------------------------------------------------------------------- * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. + * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ import { Command } from '../commandManager'; diff --git a/extensions/markdown-language-features/src/extension.ts b/extensions/markdown-language-features/src/extension.ts index 5312e4109b..b73ed0f6c1 100644 --- a/extensions/markdown-language-features/src/extension.ts +++ b/extensions/markdown-language-features/src/extension.ts @@ -1,6 +1,6 @@ /*--------------------------------------------------------------------------------------------- * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. + * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ import * as vscode from 'vscode'; @@ -17,16 +17,17 @@ import { MarkdownEngine } from './markdownEngine'; import { getMarkdownExtensionContributions } from './markdownExtensions'; import { ExtensionContentSecurityPolicyArbiter, PreviewSecuritySelector } from './security'; import { loadDefaultTelemetryReporter } from './telemetryReporter'; +import { githubSlugifier } from './slugify'; export function activate(context: vscode.ExtensionContext) { const telemetryReporter = loadDefaultTelemetryReporter(); context.subscriptions.push(telemetryReporter); - const contributions = getMarkdownExtensionContributions(); + const contributions = getMarkdownExtensionContributions(context); const cspArbiter = new ExtensionContentSecurityPolicyArbiter(context.globalState, context.workspaceState); - const engine = new MarkdownEngine(contributions); + const engine = new MarkdownEngine(contributions, githubSlugifier); const logger = new Logger(); const selector: vscode.DocumentSelector = [ diff --git a/extensions/markdown-language-features/src/features/documentLinkProvider.ts b/extensions/markdown-language-features/src/features/documentLinkProvider.ts index a51df3686b..88f9085567 100644 --- a/extensions/markdown-language-features/src/features/documentLinkProvider.ts +++ b/extensions/markdown-language-features/src/features/documentLinkProvider.ts @@ -1,6 +1,6 @@ /*--------------------------------------------------------------------------------------------- * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. + * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ import * as vscode from 'vscode'; @@ -47,7 +47,7 @@ function matchAll( } export default class LinkProvider implements vscode.DocumentLinkProvider { - private readonly linkPattern = /(\[[^\]]*\]\(\s*?)(((((?=.*\)\)+)|(?=.*\)\]+))[^\s\)]+?)|([^\s]+?)))\)/g; + private readonly linkPattern = /(\[[^\]]*\]\(\s*)((([^\s\(\)]|\(\S*?\))+))\s*(".*?")?\)/g; private readonly referenceLinkPattern = /(\[([^\]]+)\]\[\s*?)([^\s\]]*?)\]/g; private readonly definitionPattern = /^([\t ]*\[([^\]]+)\]:\s*)(\S+)/gm; diff --git a/extensions/markdown-language-features/src/features/documentSymbolProvider.ts b/extensions/markdown-language-features/src/features/documentSymbolProvider.ts index 5c5e6de195..ee8638c503 100644 --- a/extensions/markdown-language-features/src/features/documentSymbolProvider.ts +++ b/extensions/markdown-language-features/src/features/documentSymbolProvider.ts @@ -1,12 +1,17 @@ /*--------------------------------------------------------------------------------------------- * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. + * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ import * as vscode from 'vscode'; import { MarkdownEngine } from '../markdownEngine'; -import { TableOfContentsProvider } from '../tableOfContentsProvider'; +import { TableOfContentsProvider, SkinnyTextDocument, TocEntry } from '../tableOfContentsProvider'; +interface MarkdownSymbol { + readonly level: number; + readonly parent: MarkdownSymbol | undefined; + readonly children: vscode.DocumentSymbol[]; +} export default class MDDocumentSymbolProvider implements vscode.DocumentSymbolProvider { @@ -14,10 +19,57 @@ export default class MDDocumentSymbolProvider implements vscode.DocumentSymbolPr private readonly engine: MarkdownEngine ) { } - public async provideDocumentSymbols(document: vscode.TextDocument): Promise { + public async provideDocumentSymbolInformation(document: SkinnyTextDocument): Promise { const toc = await new TableOfContentsProvider(this.engine, document).getToc(); - return toc.map(entry => { - return new vscode.SymbolInformation('#'.repeat(entry.level) + ' ' + entry.text, vscode.SymbolKind.String, '', entry.location); - }); + return toc.map(entry => this.toSymbolInformation(entry)); + } + + public async provideDocumentSymbols(document: SkinnyTextDocument): Promise { + const toc = await new TableOfContentsProvider(this.engine, document).getToc(); + const root: MarkdownSymbol = { + level: -Infinity, + children: [], + parent: undefined + }; + this.buildTree(root, toc); + return root.children; + } + + private buildTree(parent: MarkdownSymbol, entries: TocEntry[]) { + if (!entries.length) { + return; + } + + const entry = entries[0]; + const symbol = this.toDocumentSymbol(entry); + symbol.children = []; + + while (parent && entry.level <= parent.level) { + parent = parent.parent!; + } + parent.children.push(symbol); + this.buildTree({ level: entry.level, children: symbol.children, parent }, entries.slice(1)); + } + + + private toSymbolInformation(entry: TocEntry): vscode.SymbolInformation { + return new vscode.SymbolInformation( + this.getSymbolName(entry), + vscode.SymbolKind.String, + '', + entry.location); + } + + private toDocumentSymbol(entry: TocEntry) { + return new vscode.DocumentSymbol( + this.getSymbolName(entry), + '', + vscode.SymbolKind.String, + entry.location.range, + entry.location.range); + } + + private getSymbolName(entry: TocEntry): string { + return '#'.repeat(entry.level) + ' ' + entry.text; } } \ No newline at end of file diff --git a/extensions/markdown-language-features/src/features/foldingProvider.ts b/extensions/markdown-language-features/src/features/foldingProvider.ts index 236908a1f1..6f5b4709b5 100644 --- a/extensions/markdown-language-features/src/features/foldingProvider.ts +++ b/extensions/markdown-language-features/src/features/foldingProvider.ts @@ -1,6 +1,6 @@ /*--------------------------------------------------------------------------------------------- * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. + * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ import * as vscode from 'vscode'; diff --git a/extensions/markdown-language-features/src/features/preview.ts b/extensions/markdown-language-features/src/features/preview.ts index 067d0c1108..6c83d2c073 100644 --- a/extensions/markdown-language-features/src/features/preview.ts +++ b/extensions/markdown-language-features/src/features/preview.ts @@ -1,6 +1,6 @@ /*--------------------------------------------------------------------------------------------- * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. + * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ import * as vscode from 'vscode'; @@ -34,14 +34,14 @@ export class MarkdownPreview { private isScrolling = false; private _disposed: boolean = false; - public static async revive( webview: vscode.WebviewPanel, state: any, contentProvider: MarkdownContentProvider, previewConfigurations: MarkdownPreviewConfigurationManager, logger: Logger, - topmostLineMonitor: MarkdownFileTopmostLineMonitor + topmostLineMonitor: MarkdownFileTopmostLineMonitor, + contributions: MarkdownContributions, ): Promise { const resource = vscode.Uri.parse(state.resource); const locked = state.locked; @@ -54,7 +54,10 @@ export class MarkdownPreview { contentProvider, previewConfigurations, logger, - topmostLineMonitor); + topmostLineMonitor, + contributions); + + preview.editor.webview.options = MarkdownPreview.getWebviewOptions(resource, contributions); if (!isNaN(line)) { preview.line = line; @@ -77,10 +80,8 @@ export class MarkdownPreview { MarkdownPreview.viewType, MarkdownPreview.getPreviewTitle(resource, locked), previewColumn, { - enableScripts: true, - enableCommandUris: true, enableFindWidget: true, - localResourceRoots: MarkdownPreview.getLocalResourceRoots(resource, contributions) + ...MarkdownPreview.getWebviewOptions(resource, contributions) }); return new MarkdownPreview( @@ -90,7 +91,8 @@ export class MarkdownPreview { contentProvider, previewConfigurations, logger, - topmostLineMonitor); + topmostLineMonitor, + contributions); } private constructor( @@ -100,7 +102,8 @@ export class MarkdownPreview { private readonly _contentProvider: MarkdownContentProvider, private readonly _previewConfigurations: MarkdownPreviewConfigurationManager, private readonly _logger: Logger, - topmostLineMonitor: MarkdownFileTopmostLineMonitor + topmostLineMonitor: MarkdownFileTopmostLineMonitor, + private readonly _contributions: MarkdownContributions, ) { this._resource = resource; this._locked = locked; @@ -239,10 +242,6 @@ export class MarkdownPreview { return this.editor.viewColumn; } - public isWebviewOf(webview: vscode.WebviewPanel): boolean { - return this.editor === webview; - } - public matchesResource( otherResource: vscode.Uri, otherPosition: vscode.ViewColumn | undefined, @@ -272,6 +271,14 @@ export class MarkdownPreview { this.editor.title = MarkdownPreview.getPreviewTitle(this._resource, this._locked); } + private get iconPath() { + const root = path.join(this._contributions.extensionPath, 'media'); + return { + light: vscode.Uri.file(path.join(root, 'Preview.svg')), + dark: vscode.Uri.file(path.join(root, 'Preview_inverse.svg')) + }; + } + private isPreviewOf(resource: vscode.Uri): boolean { return this._resource.fsPath === resource.fsPath; } @@ -325,13 +332,26 @@ export class MarkdownPreview { this.forceUpdate = false; this.currentVersion = { resource, version: document.version }; - const content = await this._contentProvider.provideTextDocumentContent(document, this._previewConfigurations, this.line); + const content = await this._contentProvider.provideTextDocumentContent(document, this._previewConfigurations, this.line, this.state); if (this._resource === resource) { this.editor.title = MarkdownPreview.getPreviewTitle(this._resource, this._locked); + this.editor.iconPath = this.iconPath; + this.editor.webview.options = MarkdownPreview.getWebviewOptions(resource, this._contributions); this.editor.webview.html = content; } } + private static getWebviewOptions( + resource: vscode.Uri, + contributions: MarkdownContributions + ): vscode.WebviewOptions { + return { + enableScripts: true, + enableCommandUris: true, + localResourceRoots: MarkdownPreview.getLocalResourceRoots(resource, contributions) + }; + } + private static getLocalResourceRoots( resource: vscode.Uri, contributions: MarkdownContributions diff --git a/extensions/markdown-language-features/src/features/previewConfig.ts b/extensions/markdown-language-features/src/features/previewConfig.ts index 5f120a1507..f58ed83d79 100644 --- a/extensions/markdown-language-features/src/features/previewConfig.ts +++ b/extensions/markdown-language-features/src/features/previewConfig.ts @@ -1,6 +1,6 @@ /*--------------------------------------------------------------------------------------------- * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. + * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ import * as vscode from 'vscode'; @@ -27,7 +27,7 @@ export class MarkdownPreviewConfiguration { private constructor(resource: vscode.Uri) { const editorConfig = vscode.workspace.getConfiguration('editor', resource); const markdownConfig = vscode.workspace.getConfiguration('markdown', resource); - const markdownEditorConfig = vscode.workspace.getConfiguration('[markdown]'); + const markdownEditorConfig = vscode.workspace.getConfiguration('[markdown]', resource); this.scrollBeyondLastLine = editorConfig.get('scrollBeyondLastLine', false); diff --git a/extensions/markdown-language-features/src/features/previewContentProvider.ts b/extensions/markdown-language-features/src/features/previewContentProvider.ts index e2cbae775b..3d5411294c 100644 --- a/extensions/markdown-language-features/src/features/previewContentProvider.ts +++ b/extensions/markdown-language-features/src/features/previewContentProvider.ts @@ -1,6 +1,6 @@ /*--------------------------------------------------------------------------------------------- * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. + * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ import * as vscode from 'vscode'; @@ -47,7 +47,8 @@ export class MarkdownContentProvider { public async provideTextDocumentContent( markdownDocument: vscode.TextDocument, previewConfigurations: MarkdownPreviewConfigurationManager, - initialLine: number | undefined = undefined + initialLine: number | undefined = undefined, + state?: any ): Promise { const sourceUri = markdownDocument.uri; const config = previewConfigurations.loadAndCacheConfiguration(sourceUri); @@ -73,7 +74,10 @@ export class MarkdownContentProvider { ${csp} - + ${this.getStyles(sourceUri, nonce, config)} diff --git a/extensions/markdown-language-features/src/features/previewManager.ts b/extensions/markdown-language-features/src/features/previewManager.ts index ec59ba12f3..b50da474f5 100644 --- a/extensions/markdown-language-features/src/features/previewManager.ts +++ b/extensions/markdown-language-features/src/features/previewManager.ts @@ -1,6 +1,6 @@ /*--------------------------------------------------------------------------------------------- * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. + * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ import * as vscode from 'vscode'; @@ -16,33 +16,33 @@ import { MarkdownContentProvider } from './previewContentProvider'; export class MarkdownPreviewManager implements vscode.WebviewPanelSerializer { private static readonly markdownPreviewActiveContextKey = 'markdownPreviewFocus'; - private readonly topmostLineMonitor = new MarkdownFileTopmostLineMonitor(); - private readonly previewConfigurations = new MarkdownPreviewConfigurationManager(); - private readonly previews: MarkdownPreview[] = []; - private activePreview: MarkdownPreview | undefined = undefined; - private readonly disposables: vscode.Disposable[] = []; + private readonly _topmostLineMonitor = new MarkdownFileTopmostLineMonitor(); + private readonly _previewConfigurations = new MarkdownPreviewConfigurationManager(); + private readonly _previews: MarkdownPreview[] = []; + private _activePreview: MarkdownPreview | undefined = undefined; + private readonly _disposables: vscode.Disposable[] = []; public constructor( - private readonly contentProvider: MarkdownContentProvider, - private readonly logger: Logger, - private readonly contributions: MarkdownContributions + private readonly _contentProvider: MarkdownContentProvider, + private readonly _logger: Logger, + private readonly _contributions: MarkdownContributions ) { - this.disposables.push(vscode.window.registerWebviewPanelSerializer(MarkdownPreview.viewType, this)); + this._disposables.push(vscode.window.registerWebviewPanelSerializer(MarkdownPreview.viewType, this)); } public dispose(): void { - disposeAll(this.disposables); - disposeAll(this.previews); + disposeAll(this._disposables); + disposeAll(this._previews); } public refresh() { - for (const preview of this.previews) { + for (const preview of this._previews) { preview.refresh(); } } public updateConfiguration() { - for (const preview of this.previews) { + for (const preview of this._previews) { preview.updateConfiguration(); } } @@ -62,16 +62,16 @@ export class MarkdownPreviewManager implements vscode.WebviewPanelSerializer { } public get activePreviewResource() { - return this.activePreview && this.activePreview.resource; + return this._activePreview && this._activePreview.resource; } public toggleLock() { - const preview = this.activePreview; + const preview = this._activePreview; if (preview) { preview.toggleLock(); // Close any previews that are now redundant, such as having two dynamic previews in the same editor group - for (const otherPreview of this.previews) { + for (const otherPreview of this._previews) { if (otherPreview !== preview && preview.matches(otherPreview)) { otherPreview.dispose(); } @@ -86,26 +86,20 @@ export class MarkdownPreviewManager implements vscode.WebviewPanelSerializer { const preview = await MarkdownPreview.revive( webview, state, - this.contentProvider, - this.previewConfigurations, - this.logger, - this.topmostLineMonitor); + this._contentProvider, + this._previewConfigurations, + this._logger, + this._topmostLineMonitor, + this._contributions); this.registerPreview(preview); } - public async serializeWebviewPanel( - webview: vscode.WebviewPanel, - ): Promise { - const preview = this.previews.find(preview => preview.isWebviewOf(webview)); - return preview ? preview.state : undefined; - } - private getExistingPreview( resource: vscode.Uri, previewSettings: PreviewSettings ): MarkdownPreview | undefined { - return this.previews.find(preview => + return this._previews.find(preview => preview.matchesResource(resource, previewSettings.previewColumn, previewSettings.locked)); } @@ -117,37 +111,46 @@ export class MarkdownPreviewManager implements vscode.WebviewPanelSerializer { resource, previewSettings.previewColumn, previewSettings.locked, - this.contentProvider, - this.previewConfigurations, - this.logger, - this.topmostLineMonitor, - this.contributions); + this._contentProvider, + this._previewConfigurations, + this._logger, + this._topmostLineMonitor, + this._contributions); + this.setPreviewActiveContext(true); + this._activePreview = preview; return this.registerPreview(preview); } private registerPreview( preview: MarkdownPreview ): MarkdownPreview { - this.previews.push(preview); + this._previews.push(preview); preview.onDispose(() => { - const existing = this.previews.indexOf(preview!); - if (existing >= 0) { - this.previews.splice(existing, 1); + const existing = this._previews.indexOf(preview); + if (existing === -1) { + return; + } + + this._previews.splice(existing, 1); + if (this._activePreview === preview) { + this.setPreviewActiveContext(false); + this._activePreview = undefined; } }); preview.onDidChangeViewState(({ webviewPanel }) => { - disposeAll(this.previews.filter(otherPreview => preview !== otherPreview && preview!.matches(otherPreview))); - - vscode.commands.executeCommand('setContext', MarkdownPreviewManager.markdownPreviewActiveContextKey, - webviewPanel.visible); - - this.activePreview = webviewPanel.visible ? preview : undefined; + disposeAll(this._previews.filter(otherPreview => preview !== otherPreview && preview!.matches(otherPreview))); + this.setPreviewActiveContext(webviewPanel.active); + this._activePreview = webviewPanel.active ? preview : undefined; }); return preview; } + + private setPreviewActiveContext(value: boolean) { + vscode.commands.executeCommand('setContext', MarkdownPreviewManager.markdownPreviewActiveContextKey, value); + } } diff --git a/extensions/markdown-language-features/src/features/workspaceSymbolProvider.ts b/extensions/markdown-language-features/src/features/workspaceSymbolProvider.ts index 6a392e9b0d..22bd456de0 100644 --- a/extensions/markdown-language-features/src/features/workspaceSymbolProvider.ts +++ b/extensions/markdown-language-features/src/features/workspaceSymbolProvider.ts @@ -1,6 +1,6 @@ /*--------------------------------------------------------------------------------------------- * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. + * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ import * as vscode from 'vscode'; @@ -8,19 +8,20 @@ import { disposeAll } from '../util/dispose'; import { isMarkdownFile } from '../util/file'; import { Lazy, lazy } from '../util/lazy'; import MDDocumentSymbolProvider from './documentSymbolProvider'; +import { SkinnyTextDocument } from '../tableOfContentsProvider'; export interface WorkspaceMarkdownDocumentProvider { - getAllMarkdownDocuments(): Thenable; + getAllMarkdownDocuments(): Thenable>; - readonly onDidChangeMarkdownDocument: vscode.Event; - readonly onDidCreateMarkdownDocument: vscode.Event; + readonly onDidChangeMarkdownDocument: vscode.Event; + readonly onDidCreateMarkdownDocument: vscode.Event; readonly onDidDeleteMarkdownDocument: vscode.Event; } class VSCodeWorkspaceMarkdownDocumentProvider implements WorkspaceMarkdownDocumentProvider { - private readonly _onDidChangeMarkdownDocumentEmitter = new vscode.EventEmitter(); - private readonly _onDidCreateMarkdownDocumentEmitter = new vscode.EventEmitter(); + private readonly _onDidChangeMarkdownDocumentEmitter = new vscode.EventEmitter(); + private readonly _onDidCreateMarkdownDocumentEmitter = new vscode.EventEmitter(); private readonly _onDidDeleteMarkdownDocumentEmitter = new vscode.EventEmitter(); private _watcher: vscode.FileSystemWatcher | undefined; @@ -39,9 +40,8 @@ class VSCodeWorkspaceMarkdownDocumentProvider implements WorkspaceMarkdownDocume async getAllMarkdownDocuments() { const resources = await vscode.workspace.findFiles('**/*.md', '**/node_modules/**'); - const documents = await Promise.all( - resources.map(resource => vscode.workspace.openTextDocument(resource).then(x => x, () => undefined))); - return documents.filter(doc => doc && isMarkdownFile(doc)) as vscode.TextDocument[]; + const docs = await Promise.all(resources.map(doc => this.getMarkdownDocument(doc))); + return docs.filter(doc => !!doc) as SkinnyTextDocument[]; } public get onDidChangeMarkdownDocument() { @@ -67,15 +67,15 @@ class VSCodeWorkspaceMarkdownDocumentProvider implements WorkspaceMarkdownDocume this._watcher = vscode.workspace.createFileSystemWatcher('**/*.md'); this._watcher.onDidChange(async resource => { - const document = await vscode.workspace.openTextDocument(resource); - if (isMarkdownFile(document)) { + const document = await this.getMarkdownDocument(resource); + if (document) { this._onDidChangeMarkdownDocumentEmitter.fire(document); } }, null, this._disposables); this._watcher.onDidCreate(async resource => { - const document = await vscode.workspace.openTextDocument(resource); - if (isMarkdownFile(document)) { + const document = await this.getMarkdownDocument(resource); + if (document) { this._onDidCreateMarkdownDocumentEmitter.fire(document); } }, null, this._disposables); @@ -90,6 +90,11 @@ class VSCodeWorkspaceMarkdownDocumentProvider implements WorkspaceMarkdownDocume } }, null, this._disposables); } + + private async getMarkdownDocument(resource: vscode.Uri): Promise { + const doc = await vscode.workspace.openTextDocument(resource); + return doc && isMarkdownFile(doc) ? doc : undefined; + } } @@ -119,9 +124,9 @@ export default class MarkdownWorkspaceSymbolProvider implements vscode.Workspace } public async populateSymbolCache(): Promise { - const markDownDocumentUris = await this._workspaceMarkdownDocumentProvider.getAllMarkdownDocuments(); - for (const document of markDownDocumentUris) { - this._symbolCache.set(document.fileName, this.getSymbols(document)); + const markdownDocumentUris = await this._workspaceMarkdownDocumentProvider.getAllMarkdownDocuments(); + for (const document of markdownDocumentUris) { + this._symbolCache.set(document.uri.fsPath, this.getSymbols(document)); } } @@ -129,17 +134,17 @@ export default class MarkdownWorkspaceSymbolProvider implements vscode.Workspace disposeAll(this._disposables); } - private getSymbols(document: vscode.TextDocument): Lazy> { + private getSymbols(document: SkinnyTextDocument): Lazy> { return lazy(async () => { - return this._symbolProvider.provideDocumentSymbols(document); + return this._symbolProvider.provideDocumentSymbolInformation(document); }); } - private onDidChangeDocument(document: vscode.TextDocument) { - this._symbolCache.set(document.fileName, this.getSymbols(document)); + private onDidChangeDocument(document: SkinnyTextDocument) { + this._symbolCache.set(document.uri.fsPath, this.getSymbols(document)); } private onDidDeleteDocument(resource: vscode.Uri) { this._symbolCache.delete(resource.fsPath); } -} \ No newline at end of file +} diff --git a/extensions/markdown-language-features/src/logger.ts b/extensions/markdown-language-features/src/logger.ts index f5a4a77653..98da9ea4fe 100644 --- a/extensions/markdown-language-features/src/logger.ts +++ b/extensions/markdown-language-features/src/logger.ts @@ -1,9 +1,10 @@ /*--------------------------------------------------------------------------------------------- * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. + * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { OutputChannel, window, workspace } from 'vscode'; +import * as vscode from 'vscode'; +import { lazy } from './util/lazy'; enum Trace { Off, @@ -31,7 +32,8 @@ function isString(value: any): value is string { export class Logger { private trace?: Trace; - private _output?: OutputChannel; + + private readonly outputChannel = lazy(() => vscode.window.createOutputChannel('Markdown')); constructor() { this.updateConfiguration(); @@ -39,9 +41,9 @@ export class Logger { public log(message: string, data?: any): void { if (this.trace === Trace.Verbose) { - this.output.appendLine(`[Log - ${(new Date().toLocaleTimeString())}] ${message}`); + this.appendLine(`[Log - ${(new Date().toLocaleTimeString())}] ${message}`); if (data) { - this.output.appendLine(Logger.data2String(data)); + this.appendLine(Logger.data2String(data)); } } } @@ -50,15 +52,12 @@ export class Logger { this.trace = this.readTrace(); } - private get output(): OutputChannel { - if (!this._output) { - this._output = window.createOutputChannel('Markdown'); - } - return this._output; + private appendLine(value: string) { + return this.outputChannel.value.appendLine(value); } private readTrace(): Trace { - return Trace.fromString(workspace.getConfiguration().get('markdown.trace', 'off')); + return Trace.fromString(vscode.workspace.getConfiguration().get('markdown.trace', 'off')); } private static data2String(data: any): string { @@ -73,4 +72,4 @@ export class Logger { } return JSON.stringify(data, undefined, 2); } -} \ No newline at end of file +} diff --git a/extensions/markdown-language-features/src/markdownEngine.ts b/extensions/markdown-language-features/src/markdownEngine.ts index c503f4f12c..2571c04875 100644 --- a/extensions/markdown-language-features/src/markdownEngine.ts +++ b/extensions/markdown-language-features/src/markdownEngine.ts @@ -1,13 +1,13 @@ /*--------------------------------------------------------------------------------------------- * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. + * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as vscode from 'vscode'; -import * as path from 'path'; -import { Slug } from './tableOfContentsProvider'; import { MarkdownIt, Token } from 'markdown-it'; +import * as path from 'path'; +import * as vscode from 'vscode'; import { MarkdownContributions } from './markdownExtensions'; +import { Slugifier } from './slugify'; const FrontMatterRegex = /^---\s*[^]*?(-{3}|\.{3})\s*/; @@ -19,7 +19,8 @@ export class MarkdownEngine { private currentDocument?: vscode.Uri; public constructor( - private readonly extensionPreviewResourceProvider: MarkdownContributions + private readonly extensionPreviewResourceProvider: MarkdownContributions, + private readonly slugifier: Slugifier, ) { } private usePlugin(factory: (md: any) => any): void { @@ -43,23 +44,25 @@ export class MarkdownEngine { } if (lang && hljs.getLanguage(lang)) { try { - return `
${hljs.highlight(lang, str, true).value}
`; + return `
${hljs.highlight(lang, str, true).value}
`; } catch (error) { } } - return `
${this.md!.utils.escapeHtml(str)}
`; + return `
${this.md!.utils.escapeHtml(str)}
`; } }).use(mdnh, { - slugify: (header: string) => Slug.fromHeading(header).value + slugify: (header: string) => this.slugifier.fromHeading(header).value }); for (const plugin of this.extensionPreviewResourceProvider.markdownItPlugins) { this.usePlugin(await plugin); } - for (const renderName of ['paragraph_open', 'heading_open', 'image', 'code_block', 'blockquote_open', 'list_item_open']) { + for (const renderName of ['paragraph_open', 'heading_open', 'image', 'code_block', 'fence', 'blockquote_open', 'list_item_open']) { this.addLineNumberRenderer(this.md, renderName); } + this.addFencedRenderer(this.md); + this.addLinkNormalizer(this.md); this.addLinkValidator(this.md); } @@ -126,6 +129,18 @@ export class MarkdownEngine { }; } + private addFencedRenderer(md: any): void { + const original = md.renderer.rules['fenced']; + md.renderer.rules['fenced'] = (tokens: any, idx: number, options: any, env: any, self: any) => { + const token = tokens[idx]; + if (token.map && token.map.length) { + token.attrJoin('class', 'hljs'); + } + + return original(tokens, idx, options, env, self); + }; + } + private addLinkNormalizer(md: any): void { const normalizeLink = md.normalizeLink; md.normalizeLink = (link: string) => { @@ -145,13 +160,13 @@ export class MarkdownEngine { if (fragment) { uri = uri.with({ - fragment: Slug.fromHeading(fragment).value + fragment: this.slugifier.fromHeading(fragment).value }); } return normalizeLink(uri.with({ scheme: 'vscode-resource' }).toString(true)); } else if (!uri.scheme && !uri.path && uri.fragment) { return normalizeLink(uri.with({ - fragment: Slug.fromHeading(uri.fragment).value + fragment: this.slugifier.fromHeading(uri.fragment).value }).toString(true)); } } catch (e) { diff --git a/extensions/markdown-language-features/src/markdownExtensions.ts b/extensions/markdown-language-features/src/markdownExtensions.ts index a9ef207cf3..e712fc13c8 100644 --- a/extensions/markdown-language-features/src/markdownExtensions.ts +++ b/extensions/markdown-language-features/src/markdownExtensions.ts @@ -1,6 +1,6 @@ /*--------------------------------------------------------------------------------------------- * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. + * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ import * as vscode from 'vscode'; @@ -26,6 +26,7 @@ const resolveExtensionResources = (extension: vscode.Extension, resourcePat }; export interface MarkdownContributions { + readonly extensionPath: string; readonly previewScripts: vscode.Uri[]; readonly previewStyles: vscode.Uri[]; readonly markdownItPlugins: Thenable<(md: any) => any>[]; @@ -40,6 +41,10 @@ class MarkdownExtensionContributions implements MarkdownContributions { private _loaded = false; + public constructor( + public readonly extensionPath: string, + ) { } + public get previewScripts(): vscode.Uri[] { this.ensureLoaded(); return this._scripts; @@ -111,6 +116,6 @@ class MarkdownExtensionContributions implements MarkdownContributions { } } -export function getMarkdownExtensionContributions(): MarkdownContributions { - return new MarkdownExtensionContributions(); +export function getMarkdownExtensionContributions(context: vscode.ExtensionContext): MarkdownContributions { + return new MarkdownExtensionContributions(context.extensionPath); } \ No newline at end of file diff --git a/extensions/markdown-language-features/src/security.ts b/extensions/markdown-language-features/src/security.ts index a09ce1f538..f8611d74a4 100644 --- a/extensions/markdown-language-features/src/security.ts +++ b/extensions/markdown-language-features/src/security.ts @@ -1,6 +1,6 @@ /*--------------------------------------------------------------------------------------------- * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. + * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ import * as vscode from 'vscode'; diff --git a/extensions/markdown-language-features/src/slugify.ts b/extensions/markdown-language-features/src/slugify.ts new file mode 100644 index 0000000000..9bcdcdef66 --- /dev/null +++ b/extensions/markdown-language-features/src/slugify.ts @@ -0,0 +1,32 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the Source EULA. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +export class Slug { + public constructor( + public readonly value: string + ) { } + + public equals(other: Slug): boolean { + return this.value === other.value; + } +} + +export interface Slugifier { + fromHeading(heading: string): Slug; +} + +export const githubSlugifier: Slugifier = new class implements Slugifier { + fromHeading(heading: string): Slug { + const slugifiedHeading = encodeURI( + heading.trim() + .toLowerCase() + .replace(/\s+/g, '-') // Replace whitespace with - + .replace(/[\]\[\!\'\#\$\%\&\'\(\)\*\+\,\.\/\:\;\<\=\>\?\@\\\^\_\{\|\}\~\`。,、;:?!…—·ˉ¨‘’“”々~‖∶"'`|〃〔〕〈〉《》「」『』.〖〗【】()[]{}]/g, '') // Remove known puctuators + .replace(/^\-+/, '') // Remove leading - + .replace(/\-+$/, '') // Remove trailing - + ); + return new Slug(slugifiedHeading); + } +}; diff --git a/extensions/markdown-language-features/src/tableOfContentsProvider.ts b/extensions/markdown-language-features/src/tableOfContentsProvider.ts index cca46aae81..b23a48cb11 100644 --- a/extensions/markdown-language-features/src/tableOfContentsProvider.ts +++ b/extensions/markdown-language-features/src/tableOfContentsProvider.ts @@ -1,37 +1,11 @@ /*--------------------------------------------------------------------------------------------- * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. + * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ import * as vscode from 'vscode'; - import { MarkdownEngine } from './markdownEngine'; - -export class Slug { - private static specialChars: any = { 'à': 'a', 'ä': 'a', 'ã': 'a', 'á': 'a', 'â': 'a', 'æ': 'a', 'å': 'a', 'ë': 'e', 'è': 'e', 'é': 'e', 'ê': 'e', 'î': 'i', 'ï': 'i', 'ì': 'i', 'í': 'i', 'ò': 'o', 'ó': 'o', 'ö': 'o', 'ô': 'o', 'ø': 'o', 'ù': 'o', 'ú': 'u', 'ü': 'u', 'û': 'u', 'ñ': 'n', 'ç': 'c', 'ß': 's', 'ÿ': 'y', 'œ': 'o', 'ŕ': 'r', 'ś': 's', 'ń': 'n', 'ṕ': 'p', 'ẃ': 'w', 'ǵ': 'g', 'ǹ': 'n', 'ḿ': 'm', 'ǘ': 'u', 'ẍ': 'x', 'ź': 'z', 'ḧ': 'h', '·': '-', '/': '-', '_': '-', ',': '-', ':': '-', ';': '-', 'З': '3', 'з': '3' }; - - public static fromHeading(heading: string): Slug { - const slugifiedHeading = encodeURI(heading.trim() - .toLowerCase() - .replace(/./g, c => Slug.specialChars[c] || c) - .replace(/[\]\[\!\'\#\$\%\&\'\(\)\*\+\,\.\/\:\;\<\=\>\?\@\\\^\_\{\|\}\~\`]/g, '') - .replace(/\s+/g, '-') // Replace whitespace with - - .replace(/[^\w\-]+/g, '') // Remove remaining non-word chars - .replace(/^\-+/, '') // Remove leading - - .replace(/\-+$/, '') // Remove trailing - - ); - - return new Slug(slugifiedHeading); - } - - private constructor( - public readonly value: string - ) { } - - public equals(other: Slug): boolean { - return this.value === other.value; - } -} +import { Slug, githubSlugifier } from './slugify'; export interface TocEntry { readonly slug: Slug; @@ -41,12 +15,18 @@ export interface TocEntry { readonly location: vscode.Location; } +export interface SkinnyTextDocument { + readonly uri: vscode.Uri; + getText(): string; + lineAt(line: number): vscode.TextLine; +} + export class TableOfContentsProvider { private toc?: TocEntry[]; public constructor( private engine: MarkdownEngine, - private document: vscode.TextDocument + private document: SkinnyTextDocument ) { } public async getToc(): Promise { @@ -62,11 +42,11 @@ export class TableOfContentsProvider { public async lookup(fragment: string): Promise { const toc = await this.getToc(); - const slug = Slug.fromHeading(fragment); + const slug = githubSlugifier.fromHeading(fragment); return toc.find(entry => entry.slug.equals(slug)); } - private async buildToc(document: vscode.TextDocument): Promise { + private async buildToc(document: SkinnyTextDocument): Promise { const toc: TocEntry[] = []; const tokens = await this.engine.parse(document.uri, document.getText()); @@ -74,7 +54,7 @@ export class TableOfContentsProvider { const lineNumber = heading.map[0]; const line = document.lineAt(lineNumber); toc.push({ - slug: Slug.fromHeading(line.text), + slug: githubSlugifier.fromHeading(line.text), text: TableOfContentsProvider.getHeaderText(line.text), level: TableOfContentsProvider.getHeaderLevel(heading.markup), line: lineNumber, diff --git a/extensions/markdown-language-features/src/telemetryReporter.ts b/extensions/markdown-language-features/src/telemetryReporter.ts index d00dca386d..6d93a328e8 100644 --- a/extensions/markdown-language-features/src/telemetryReporter.ts +++ b/extensions/markdown-language-features/src/telemetryReporter.ts @@ -1,6 +1,6 @@ /*--------------------------------------------------------------------------------------------- * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. + * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ import * as vscode from 'vscode'; import { default as VSCodeTelemetryReporter } from 'vscode-extension-telemetry'; diff --git a/extensions/markdown-language-features/src/test/documentLinkProvider.test.ts b/extensions/markdown-language-features/src/test/documentLinkProvider.test.ts new file mode 100644 index 0000000000..64340408d4 --- /dev/null +++ b/extensions/markdown-language-features/src/test/documentLinkProvider.test.ts @@ -0,0 +1,108 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the Source EULA. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import * as assert from 'assert'; +import 'mocha'; +import * as vscode from 'vscode'; +import LinkProvider from '../features/documentLinkProvider'; +import { InMemoryDocument } from './inMemoryDocument'; + + +const testFileName = vscode.Uri.parse('test.md'); + +const noopToken = new class implements vscode.CancellationToken { + private _onCancellationRequestedEmitter = new vscode.EventEmitter(); + public onCancellationRequested = this._onCancellationRequestedEmitter.event; + + get isCancellationRequested() { return false; } +}; + +function getLinksForFile(fileContents: string) { + const doc = new InMemoryDocument(testFileName, fileContents); + const provider = new LinkProvider(); + return provider.provideDocumentLinks(doc, noopToken); +} + +function assertRangeEqual(expected: vscode.Range, actual: vscode.Range) { + assert.strictEqual(expected.start.line, actual.start.line); + assert.strictEqual(expected.start.character, actual.start.character); + assert.strictEqual(expected.end.line, actual.end.line); + assert.strictEqual(expected.end.character, actual.end.character); +} + +suite('markdown.DocumentLinkProvider', () => { + test('Should not return anything for empty document', () => { + const links = getLinksForFile(''); + assert.strictEqual(links.length, 0); + }); + + test('Should not return anything for simple document without links', () => { + const links = getLinksForFile('# a\nfdasfdfsafsa'); + assert.strictEqual(links.length, 0); + }); + + test('Should detect basic http links', () => { + const links = getLinksForFile('a [b](https://example.com) c'); + assert.strictEqual(links.length, 1); + const [link] = links; + assertRangeEqual(link.range, new vscode.Range(0, 6, 0, 25)); + }); + + test('Should detect basic workspace links', () => { + { + const links = getLinksForFile('a [b](./file) c'); + assert.strictEqual(links.length, 1); + const [link] = links; + assertRangeEqual(link.range, new vscode.Range(0, 6, 0, 12)); + } + { + const links = getLinksForFile('a [b](file.png) c'); + assert.strictEqual(links.length, 1); + const [link] = links; + assertRangeEqual(link.range, new vscode.Range(0, 6, 0, 14)); + } + }); + + test('Should detect links with title', () => { + const links = getLinksForFile('a [b](https://example.com "abc") c'); + assert.strictEqual(links.length, 1); + const [link] = links; + assertRangeEqual(link.range, new vscode.Range(0, 6, 0, 25)); + }); + + + test('Should handle links with balanced parens', () => { + { + const links = getLinksForFile('a [b](https://example.com/a()c) c'); + assert.strictEqual(links.length, 1); + const [link] = links; + assertRangeEqual(link.range, new vscode.Range(0, 6, 0, 30)); + } + { + const links = getLinksForFile('a [b](https://example.com/a(b)c) c'); + assert.strictEqual(links.length, 1); + const [link] = links; + assertRangeEqual(link.range, new vscode.Range(0, 6, 0, 31)); + + } + { + // #49011 + const links = getLinksForFile('[A link](http://ThisUrlhasParens/A_link(in_parens))'); + assert.strictEqual(links.length, 1); + const [link] = links; + assertRangeEqual(link.range, new vscode.Range(0, 9, 0, 50)); + } + }); + + test('Should handle two links without space', () => { + const links = getLinksForFile('a ([test](test)[test2](test2)) c'); + assert.strictEqual(links.length, 2); + const [link1, link2] = links; + assertRangeEqual(link1.range, new vscode.Range(0, 10, 0, 14)); + assertRangeEqual(link2.range, new vscode.Range(0, 23, 0, 28)); + }); +}); + + diff --git a/extensions/markdown-language-features/src/test/documentSymbolProvider.test.ts b/extensions/markdown-language-features/src/test/documentSymbolProvider.test.ts new file mode 100644 index 0000000000..85e9255867 --- /dev/null +++ b/extensions/markdown-language-features/src/test/documentSymbolProvider.test.ts @@ -0,0 +1,86 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the Source EULA. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import * as assert from 'assert'; +import 'mocha'; +import * as vscode from 'vscode'; +import SymbolProvider from '../features/documentSymbolProvider'; +import { InMemoryDocument } from './inMemoryDocument'; +import { createNewMarkdownEngine } from './engine'; + + +const testFileName = vscode.Uri.parse('test.md'); + + +function getSymbolsForFile(fileContents: string) { + const doc = new InMemoryDocument(testFileName, fileContents); + const provider = new SymbolProvider(createNewMarkdownEngine()); + return provider.provideDocumentSymbols(doc); +} + + +suite('markdown.DocumentSymbolProvider', () => { + test('Should not return anything for empty document', async () => { + const symbols = await getSymbolsForFile(''); + assert.strictEqual(symbols.length, 0); + }); + + test('Should not return anything for document with no headers', async () => { + const symbols = await getSymbolsForFile('a\na'); + assert.strictEqual(symbols.length, 0); + }); + + test('Should not return anything for document with # but no real headers', async () => { + const symbols = await getSymbolsForFile('a#a\na#'); + assert.strictEqual(symbols.length, 0); + }); + + test('Should return single symbol for single header', async () => { + const symbols = await getSymbolsForFile('# h'); + assert.strictEqual(symbols.length, 1); + assert.strictEqual(symbols[0].name, '# h'); + }); + + test('Should not care about symbol level for single header', async () => { + const symbols = await getSymbolsForFile('### h'); + assert.strictEqual(symbols.length, 1); + assert.strictEqual(symbols[0].name, '### h'); + }); + + test('Should put symbols of same level in flat list', async () => { + const symbols = await getSymbolsForFile('## h\n## h2'); + assert.strictEqual(symbols.length, 2); + assert.strictEqual(symbols[0].name, '## h'); + assert.strictEqual(symbols[1].name, '## h2'); + }); + + test('Should nest symbol of level - 1 under parent', async () => { + + const symbols = await getSymbolsForFile('# h\n## h2\n## h3'); + assert.strictEqual(symbols.length, 1); + assert.strictEqual(symbols[0].name, '# h'); + assert.strictEqual(symbols[0].children.length, 2); + assert.strictEqual(symbols[0].children[0].name, '## h2'); + assert.strictEqual(symbols[0].children[1].name, '## h3'); + }); + + test('Should nest symbol of level - n under parent', async () => { + const symbols = await getSymbolsForFile('# h\n#### h2'); + assert.strictEqual(symbols.length, 1); + assert.strictEqual(symbols[0].name, '# h'); + assert.strictEqual(symbols[0].children.length, 1); + assert.strictEqual(symbols[0].children[0].name, '#### h2'); + }); + + test('Should flatten children where lower level occurs first', async () => { + const symbols = await getSymbolsForFile('# h\n### h2\n## h3'); + assert.strictEqual(symbols.length, 1); + assert.strictEqual(symbols[0].name, '# h'); + assert.strictEqual(symbols[0].children.length, 2); + assert.strictEqual(symbols[0].children[0].name, '### h2'); + assert.strictEqual(symbols[0].children[1].name, '## h3'); + }); +}); + diff --git a/extensions/markdown-language-features/src/test/engine.ts b/extensions/markdown-language-features/src/test/engine.ts index a7a30a89ce..1ff4505648 100644 --- a/extensions/markdown-language-features/src/test/engine.ts +++ b/extensions/markdown-language-features/src/test/engine.ts @@ -1,18 +1,21 @@ /*--------------------------------------------------------------------------------------------- * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. + * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ import * as vscode from 'vscode'; import { MarkdownEngine } from '../markdownEngine'; import { MarkdownContributions } from '../markdownExtensions'; +import { githubSlugifier } from '../slugify'; + +const emptyContributions = new class implements MarkdownContributions { + readonly extensionPath = ''; + readonly previewScripts: vscode.Uri[] = []; + readonly previewStyles: vscode.Uri[] = []; + readonly previewResourceRoots: vscode.Uri[] = []; + readonly markdownItPlugins: Promise<(md: any) => any>[] = []; +}; export function createNewMarkdownEngine(): MarkdownEngine { - return new MarkdownEngine(new class implements MarkdownContributions { - readonly previewScripts: vscode.Uri[] = []; - readonly previewStyles: vscode.Uri[] = []; - readonly previewResourceRoots: vscode.Uri[] = []; - readonly markdownItPlugins: Promise<(md: any) => any>[] = []; - }); + return new MarkdownEngine(emptyContributions, githubSlugifier); } - diff --git a/extensions/markdown-language-features/src/test/foldingProvider.test.ts b/extensions/markdown-language-features/src/test/foldingProvider.test.ts index 44c570d64d..ba8e32de3f 100644 --- a/extensions/markdown-language-features/src/test/foldingProvider.test.ts +++ b/extensions/markdown-language-features/src/test/foldingProvider.test.ts @@ -1,6 +1,6 @@ /*--------------------------------------------------------------------------------------------- * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. + * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ import * as assert from 'assert'; diff --git a/extensions/markdown-language-features/src/test/inMemoryDocument.ts b/extensions/markdown-language-features/src/test/inMemoryDocument.ts index 60ff91f15f..960d2d9b2b 100644 --- a/extensions/markdown-language-features/src/test/inMemoryDocument.ts +++ b/extensions/markdown-language-features/src/test/inMemoryDocument.ts @@ -1,6 +1,6 @@ /*--------------------------------------------------------------------------------------------- * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. + * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ import * as vscode from 'vscode'; @@ -44,8 +44,12 @@ export class InMemoryDocument implements vscode.TextDocument { offsetAt(_position: vscode.Position): never { throw new Error('Method not implemented.'); } - positionAt(_offset: number): never { - throw new Error('Method not implemented.'); + positionAt(offset: number): vscode.Position { + const before = this._contents.slice(0, offset); + const newLines = before.match(/\n/g); + const line = newLines ? newLines.length : 0; + const preCharacters = before.match(/(\n|^).*$/g); + return new vscode.Position(line, preCharacters ? preCharacters[0].length : 0); } getText(_range?: vscode.Range | undefined): string { return this._contents; @@ -62,4 +66,4 @@ export class InMemoryDocument implements vscode.TextDocument { save(): never { throw new Error('Method not implemented.'); } -} \ No newline at end of file +} diff --git a/extensions/markdown-language-features/src/test/index.ts b/extensions/markdown-language-features/src/test/index.ts index f65a756a8d..a6ac226afd 100644 --- a/extensions/markdown-language-features/src/test/index.ts +++ b/extensions/markdown-language-features/src/test/index.ts @@ -1,28 +1,30 @@ /*--------------------------------------------------------------------------------------------- * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. + * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -// -// PLEASE DO NOT MODIFY / DELETE UNLESS YOU KNOW WHAT YOU ARE DOING -// -// This file is providing the test runner to use when running extension tests. -// By default the test runner in use is Mocha based. -// -// You can provide your own test runner if you want to override it by exporting -// a function run(testRoot: string, clb: (error:Error) => void) that the extension -// host can call to run the tests. The test runner is expected to use console.log -// to report the results back to the caller. When the tests are finished, return -// a possible error to the callback or null if none. - +const path = require('path'); const testRunner = require('vscode/lib/testrunner'); -// You can directly control Mocha options by uncommenting the following lines -// See https://github.com/mochajs/mocha/wiki/Using-mocha-programmatically#set-options for more info -testRunner.configure({ - ui: 'tdd', // the TDD UI is being used in extension.test.ts (suite, test, etc.) - useColors: process.platform !== 'win32', // colored output from test results (only windows cannot handle) +const suite = 'Integration Markdown Tests'; + +const options: any = { + ui: 'tdd', + useColors: true, timeout: 60000 -}); +}; + +if (process.env.BUILD_ARTIFACTSTAGINGDIRECTORY) { + options.reporter = 'mocha-multi-reporters'; + options.reporterOptions = { + reporterEnabled: 'spec, mocha-junit-reporter', + mochaJunitReporterReporterOptions: { + testsuitesTitle: `${suite} ${process.platform}`, + mochaFile: path.join(process.env.BUILD_ARTIFACTSTAGINGDIRECTORY, `test-results/${process.platform}-${suite.toLowerCase().replace(/[^\w]/g, '-')}-results.xml`) + } + }; +} + +testRunner.configure(options); export = testRunner; diff --git a/extensions/markdown-language-features/src/test/tableOfContentsProvider.test.ts b/extensions/markdown-language-features/src/test/tableOfContentsProvider.test.ts index d2f6c180b6..cccd5ef927 100644 --- a/extensions/markdown-language-features/src/test/tableOfContentsProvider.test.ts +++ b/extensions/markdown-language-features/src/test/tableOfContentsProvider.test.ts @@ -1,6 +1,6 @@ /*--------------------------------------------------------------------------------------------- * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. + * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ import * as assert from 'assert'; @@ -75,18 +75,35 @@ suite('markdown.TableOfContentsProvider', () => { assert.strictEqual(await provider.lookup('fo o'), undefined); }); - test('should normalize special characters #44779', async () => { + test('should handle special characters #44779', async () => { const doc = new InMemoryDocument(testFileName, `# Indentação\n`); const provider = new TableOfContentsProvider(createNewMarkdownEngine(), doc); - assert.strictEqual((await provider.lookup('indentacao'))!.line, 0); + assert.strictEqual((await provider.lookup('indentação'))!.line, 0); }); - test('should map special З, #37079', async () => { - const doc = new InMemoryDocument(testFileName, `### Заголовок Header 3`); + test('should handle special characters 2, #48482', async () => { + const doc = new InMemoryDocument(testFileName, `# Инструкция - Делай Раз, Делай Два\n`); const provider = new TableOfContentsProvider(createNewMarkdownEngine(), doc); - assert.strictEqual((await provider.lookup('Заголовок-header-3'))!.line, 0); - assert.strictEqual((await provider.lookup('3аголовок-header-3'))!.line, 0); + assert.strictEqual((await provider.lookup('инструкция---делай-раз-делай-два'))!.line, 0); + }); + + test('should handle special characters 3, #37079', async () => { + const doc = new InMemoryDocument(testFileName, `## Header 2 +### Header 3 +## Заголовок 2 +### Заголовок 3 +### Заголовок Header 3 +## Заголовок`); + + const provider = new TableOfContentsProvider(createNewMarkdownEngine(), doc); + + assert.strictEqual((await provider.lookup('header-2'))!.line, 0); + assert.strictEqual((await provider.lookup('header-3'))!.line, 1); + assert.strictEqual((await provider.lookup('Заголовок-2'))!.line, 2); + assert.strictEqual((await provider.lookup('Заголовок-3'))!.line, 3); + assert.strictEqual((await provider.lookup('Заголовок-header-3'))!.line, 4); + assert.strictEqual((await provider.lookup('Заголовок'))!.line, 5); }); }); diff --git a/extensions/markdown-language-features/src/test/workspaceSymbolProvider.test.ts b/extensions/markdown-language-features/src/test/workspaceSymbolProvider.test.ts index 2ee12a7979..b5f8634a0f 100644 --- a/extensions/markdown-language-features/src/test/workspaceSymbolProvider.test.ts +++ b/extensions/markdown-language-features/src/test/workspaceSymbolProvider.test.ts @@ -1,6 +1,6 @@ /*--------------------------------------------------------------------------------------------- * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. + * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ import * as assert from 'assert'; diff --git a/extensions/markdown-language-features/src/typings/markdown-it-named-headers.d.ts b/extensions/markdown-language-features/src/typings/markdown-it-named-headers.d.ts index de9b23d0df..b525589725 100644 --- a/extensions/markdown-language-features/src/typings/markdown-it-named-headers.d.ts +++ b/extensions/markdown-language-features/src/typings/markdown-it-named-headers.d.ts @@ -1,5 +1,5 @@ /*--------------------------------------------------------------------------------------------- * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. + * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ declare module 'markdown-it-named-headers' { } \ No newline at end of file diff --git a/extensions/markdown-language-features/src/typings/ref.d.ts b/extensions/markdown-language-features/src/typings/ref.d.ts index 954bab971e..37d9f00e11 100644 --- a/extensions/markdown-language-features/src/typings/ref.d.ts +++ b/extensions/markdown-language-features/src/typings/ref.d.ts @@ -1,6 +1,6 @@ /*--------------------------------------------------------------------------------------------- * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. + * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ /// diff --git a/extensions/markdown-language-features/src/util/dispose.ts b/extensions/markdown-language-features/src/util/dispose.ts index 19b3b3f4f1..fbce45d605 100644 --- a/extensions/markdown-language-features/src/util/dispose.ts +++ b/extensions/markdown-language-features/src/util/dispose.ts @@ -1,6 +1,6 @@ /*--------------------------------------------------------------------------------------------- * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. + * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ import * as vscode from 'vscode'; diff --git a/extensions/markdown-language-features/src/util/file.ts b/extensions/markdown-language-features/src/util/file.ts index d61029aaf9..c8acf43f6e 100644 --- a/extensions/markdown-language-features/src/util/file.ts +++ b/extensions/markdown-language-features/src/util/file.ts @@ -1,6 +1,6 @@ /*--------------------------------------------------------------------------------------------- * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. + * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ import * as vscode from 'vscode'; diff --git a/extensions/markdown-language-features/src/util/lazy.ts b/extensions/markdown-language-features/src/util/lazy.ts index aa5effd3d3..270d93de07 100644 --- a/extensions/markdown-language-features/src/util/lazy.ts +++ b/extensions/markdown-language-features/src/util/lazy.ts @@ -1,6 +1,6 @@ /*--------------------------------------------------------------------------------------------- * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. + * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ export interface Lazy { diff --git a/extensions/markdown-language-features/src/util/topmostLineMonitor.ts b/extensions/markdown-language-features/src/util/topmostLineMonitor.ts index 7b51cf56db..389149031e 100644 --- a/extensions/markdown-language-features/src/util/topmostLineMonitor.ts +++ b/extensions/markdown-language-features/src/util/topmostLineMonitor.ts @@ -1,24 +1,24 @@ /*--------------------------------------------------------------------------------------------- * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. + * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ import * as vscode from 'vscode'; - import { disposeAll } from '../util/dispose'; import { isMarkdownFile } from './file'; - export class MarkdownFileTopmostLineMonitor { private readonly disposables: vscode.Disposable[] = []; private readonly pendingUpdates = new Map(); + private readonly throttle = 50; + constructor() { vscode.window.onDidChangeTextEditorVisibleRanges(event => { if (isMarkdownFile(event.textEditor.document)) { const line = getVisibleLine(event.textEditor); - if (line) { + if (typeof line === 'number') { this.updateLine(event.textEditor.document.uri, line); } } @@ -47,7 +47,7 @@ export class MarkdownFileTopmostLineMonitor { }); this.pendingUpdates.delete(key); } - }, 50); + }, this.throttle); } this.pendingUpdates.set(key, line); diff --git a/extensions/markdown-language-features/webpack.config.js b/extensions/markdown-language-features/webpack.config.js index 58996c3eb7..36f188ccb1 100644 --- a/extensions/markdown-language-features/webpack.config.js +++ b/extensions/markdown-language-features/webpack.config.js @@ -1,6 +1,6 @@ /*--------------------------------------------------------------------------------------------- * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. + * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ const path = require('path'); diff --git a/extensions/markdown-language-features/yarn.lock b/extensions/markdown-language-features/yarn.lock index 915ae941b8..a2e69ddb6b 100644 --- a/extensions/markdown-language-features/yarn.lock +++ b/extensions/markdown-language-features/yarn.lock @@ -1153,6 +1153,10 @@ chardet@^0.4.0: version "0.4.2" resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.4.2.tgz#b5473b33dc97c424e5d98dc87d55d4d8a29c8bf2" +charenc@~0.0.1: + version "0.0.2" + resolved "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667" + chokidar@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.0.2.tgz#4dc65139eeb2714977735b6a35d06e97b494dfd7" @@ -1439,6 +1443,10 @@ cross-spawn@^6.0.4: shebang-command "^1.2.0" which "^1.2.9" +crypt@~0.0.1: + version "0.0.2" + resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b" + cryptiles@2.x.x: version "2.0.5" resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8" @@ -2536,9 +2544,9 @@ he@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/he/-/he-1.1.1.tgz#93410fd21b009735151f8868c2f271f3427e23fd" -highlight.js@9.5.0: - version "9.5.0" - resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-9.5.0.tgz#46ae51b9db00f70052bcdf196cd404757b6582ae" +highlight.js@9.12.0: + version "9.12.0" + resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-9.12.0.tgz#e6d9dbe57cbefe60751f02af336195870c90c01e" hmac-drbg@^1.0.0: version "1.0.1" @@ -2745,7 +2753,7 @@ is-binary-path@^1.0.0: dependencies: binary-extensions "^1.0.0" -is-buffer@^1.1.5: +is-buffer@^1.1.5, is-buffer@~1.1.1: version "1.1.6" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" @@ -3295,6 +3303,10 @@ lodash@^4.11.1, lodash@^4.13.1, lodash@^4.14.0, lodash@^4.17.2, lodash@^4.17.4, version "4.17.5" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.5.tgz#99a92d65c0272debe8c96b6057bc8fbfa3bed511" +lodash@^4.16.4: + version "4.17.10" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.10.tgz#1b7793cf7259ea38fb3661d4d38b3260af8ae4e7" + log-symbols@2.2.0, log-symbols@^2.1.0: version "2.2.0" resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a" @@ -3357,15 +3369,15 @@ markdown-it-named-headers@0.0.4: dependencies: string "^3.0.1" -markdown-it@^8.4.0: - version "8.4.0" - resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-8.4.0.tgz#e2400881bf171f7018ed1bd9da441dac8af6306d" +markdown-it@^8.4.1: + version "8.4.1" + resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-8.4.1.tgz#206fe59b0e4e1b78a7c73250af9b34a4ad0aaf44" dependencies: argparse "^1.0.7" entities "~1.1.1" linkify-it "^2.0.0" mdurl "^1.0.1" - uc.micro "^1.0.3" + uc.micro "^1.0.5" md5.js@^1.3.4: version "1.3.4" @@ -3374,6 +3386,14 @@ md5.js@^1.3.4: hash-base "^3.0.0" inherits "^2.0.1" +md5@^2.1.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/md5/-/md5-2.2.1.tgz#53ab38d5fe3c8891ba465329ea23fac0540126f9" + dependencies: + charenc "~0.0.1" + crypt "~0.0.1" + is-buffer "~1.1.1" + mdurl@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e" @@ -3535,12 +3555,29 @@ mixin-deep@^1.2.0: for-in "^1.0.2" is-extendable "^1.0.1" -mkdirp@0.5.1, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0: +mkdirp@0.5.1, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0, mkdirp@~0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" dependencies: minimist "0.0.8" +mocha-junit-reporter@^1.17.0: + version "1.17.0" + resolved "https://registry.yarnpkg.com/mocha-junit-reporter/-/mocha-junit-reporter-1.17.0.tgz#2e5149ed40fc5d2e3ca71e42db5ab1fec9c6d85c" + dependencies: + debug "^2.2.0" + md5 "^2.1.0" + mkdirp "~0.5.1" + strip-ansi "^4.0.0" + xml "^1.0.0" + +mocha-multi-reporters@^1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/mocha-multi-reporters/-/mocha-multi-reporters-1.1.7.tgz#cc7f3f4d32f478520941d852abb64d9988587d82" + dependencies: + debug "^3.1.0" + lodash "^4.16.4" + mocha@^4.0.1: version "4.1.0" resolved "https://registry.yarnpkg.com/mocha/-/mocha-4.1.0.tgz#7d86cfbcf35cb829e2754c32e17355ec05338794" @@ -5159,10 +5196,14 @@ typescript@^2.7.2: version "2.7.2" resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.7.2.tgz#2d615a1ef4aee4f574425cdff7026edf81919836" -uc.micro@^1.0.1, uc.micro@^1.0.3: +uc.micro@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-1.0.3.tgz#7ed50d5e0f9a9fb0a573379259f2a77458d50192" +uc.micro@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-1.0.5.tgz#0c65f15f815aa08b560a61ce8b4db7ffc3f45376" + uglify-es@^3.3.4: version "3.3.10" resolved "https://registry.yarnpkg.com/uglify-es/-/uglify-es-3.3.10.tgz#8b0b7992cebe20edc26de1bf325cef797b8f3fa5" @@ -5237,8 +5278,8 @@ untildify@^3.0.2: resolved "https://registry.yarnpkg.com/untildify/-/untildify-3.0.2.tgz#7f1f302055b3fea0f3e81dc78eb36766cb65e3f1" upath@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/upath/-/upath-1.0.4.tgz#ee2321ba0a786c50973db043a50b7bcba822361d" + version "1.1.0" + resolved "https://registry.yarnpkg.com/upath/-/upath-1.1.0.tgz#35256597e46a581db4793d0ce47fa9aebfc9fabd" urix@^0.1.0: version "0.1.0" @@ -5415,15 +5456,15 @@ vm-browserify@0.0.4: dependencies: indexof "0.0.1" -vscode-extension-telemetry@0.0.17: - version "0.0.17" - resolved "https://registry.yarnpkg.com/vscode-extension-telemetry/-/vscode-extension-telemetry-0.0.17.tgz#15123e7edb34e7b9724b6056f54a869bbb922cb7" +vscode-extension-telemetry@0.0.18: + version "0.0.18" + resolved "https://registry.yarnpkg.com/vscode-extension-telemetry/-/vscode-extension-telemetry-0.0.18.tgz#602ba20d8c71453aa34533a291e7638f6e5c0327" dependencies: applicationinsights "1.0.1" -vscode-nls@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/vscode-nls/-/vscode-nls-3.2.1.tgz#b1f3e04e8a94a715d5a7bcbc8339c51e6d74ca51" +vscode-nls@^3.2.4: + version "3.2.4" + resolved "https://registry.yarnpkg.com/vscode-nls/-/vscode-nls-3.2.4.tgz#2166b4183c8aea884d20727f5449e62be69fd398" vscode@^1.1.10: version "1.1.10" @@ -5565,6 +5606,10 @@ write-file-atomic@^1.2.0: imurmurhash "^0.1.4" slide "^1.1.5" +xml@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/xml/-/xml-1.0.1.tgz#78ba72020029c5bc87b8a81a3cfcd74b4a2fc1e5" + "xtend@>=4.0.0 <4.1.0-0", xtend@^4.0.0, xtend@~4.0.0, xtend@~4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" diff --git a/extensions/merge-conflict/README.md b/extensions/merge-conflict/README.md index b9e727fdef..1fa82d7b0c 100644 --- a/extensions/merge-conflict/README.md +++ b/extensions/merge-conflict/README.md @@ -1,5 +1,7 @@ # Merge Conflict -See [documentation](https://code.visualstudio.com/docs/editor/versioncontrol#_merge-conflicts). +**Notice:** This extension is bundled with SQL Operations Stuido. It can be disabled but not uninstalled. -**Notice** This is a an extension that is bundled with SQL Operations Studio. +## Features + +See [Merge Conflicts](https://code.visualstudio.com/docs/editor/versioncontrol#_merge-conflicts) to learn about features of this extension. diff --git a/extensions/merge-conflict/package.json b/extensions/merge-conflict/package.json index f58bb6f2a9..81b65c21ac 100644 --- a/extensions/merge-conflict/package.json +++ b/extensions/merge-conflict/package.json @@ -100,7 +100,7 @@ } }, "dependencies": { - "vscode-nls": "^3.2.1" + "vscode-nls": "^3.2.4" }, "devDependencies": { "@types/node": "8.0.33" diff --git a/extensions/merge-conflict/package.nls.json b/extensions/merge-conflict/package.nls.json index 66076bd7a8..ed7430674c 100644 --- a/extensions/merge-conflict/package.nls.json +++ b/extensions/merge-conflict/package.nls.json @@ -13,6 +13,6 @@ "command.previous": "Previous Conflict", "command.compare": "Compare Current Conflict", "config.title": "Merge Conflict", - "config.codeLensEnabled": "Enable/disable merge conflict block CodeLens within editor", - "config.decoratorsEnabled": "Enable/disable merge conflict decorators within editor" + "config.codeLensEnabled": "Create a Code Lens for merge conflict blocks within editor.", + "config.decoratorsEnabled": "Create decorators for merge conflict blocks within editor." } \ No newline at end of file diff --git a/extensions/merge-conflict/yarn.lock b/extensions/merge-conflict/yarn.lock index 355d778c63..5b1dccc447 100644 --- a/extensions/merge-conflict/yarn.lock +++ b/extensions/merge-conflict/yarn.lock @@ -6,6 +6,6 @@ version "8.0.33" resolved "https://registry.yarnpkg.com/@types/node/-/node-8.0.33.tgz#1126e94374014e54478092830704f6ea89df04cd" -vscode-nls@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/vscode-nls/-/vscode-nls-3.2.1.tgz#b1f3e04e8a94a715d5a7bcbc8339c51e6d74ca51" +vscode-nls@^3.2.4: + version "3.2.4" + resolved "https://registry.yarnpkg.com/vscode-nls/-/vscode-nls-3.2.4.tgz#2166b4183c8aea884d20727f5449e62be69fd398" diff --git a/extensions/package.json b/extensions/package.json index d3693f4971..8e143a8485 100644 --- a/extensions/package.json +++ b/extensions/package.json @@ -3,9 +3,9 @@ "version": "0.0.1", "description": "Dependencies shared by all extensions", "dependencies": { - "typescript": "2.8.3" + "typescript": "3.0.1" }, "scripts": { "postinstall": "node ./postinstall" } -} \ No newline at end of file +} diff --git a/extensions/powershell/language-configuration.json b/extensions/powershell/language-configuration.json index 02e7a9ddec..f30c0f5f05 100644 --- a/extensions/powershell/language-configuration.json +++ b/extensions/powershell/language-configuration.json @@ -25,8 +25,8 @@ ], "folding": { "markers": { - "start": "^\\s*#region\\b", - "end": "^\\s*#endregion\\b" + "start": "^\\s*#[rR]egion\\b", + "end": "^\\s*#[eE]nd[rR]egion\\b" } } } \ No newline at end of file diff --git a/extensions/powershell/package.json b/extensions/powershell/package.json index 5fcb928726..399f6fc560 100644 --- a/extensions/powershell/package.json +++ b/extensions/powershell/package.json @@ -10,7 +10,7 @@ "id": "powershell", "extensions": [ ".ps1", ".psm1", ".psd1", ".pssc", ".psrc" ], "aliases": [ "PowerShell", "powershell", "ps", "ps1" ], - "firstLine": "^#!/.*\\bpwsh\\b", + "firstLine": "^#!\\s*/.*\\bpwsh\\b", "configuration": "./language-configuration.json" }], "grammars": [{ diff --git a/extensions/powershell/syntaxes/powershell.tmLanguage.json b/extensions/powershell/syntaxes/powershell.tmLanguage.json index 17e3c19107..60dee137b1 100644 --- a/extensions/powershell/syntaxes/powershell.tmLanguage.json +++ b/extensions/powershell/syntaxes/powershell.tmLanguage.json @@ -4,7 +4,7 @@ "If you want to provide a fix or improvement, please create a pull request against the original repository.", "Once accepted there, we are happy to receive an update request." ], - "version": "https://github.com/PowerShell/EditorSyntax/commit/90e4b5454f2f1cc06eae4c6c8e12c33d9f5f3a8c", + "version": "https://github.com/PowerShell/EditorSyntax/commit/6f5438611c54922ea94c81532a2dcfee72190039", "name": "PowerShell", "scopeName": "source.powershell", "patterns": [ @@ -12,13 +12,13 @@ "begin": "<#", "beginCaptures": { "0": { - "name": "punctuation.start.definition.comment.block.powershell" + "name": "punctuation.definition.comment.block.begin.powershell" } }, "end": "#>", "endCaptures": { "0": { - "name": "punctuation.end.definition.comment.block.powershell" + "name": "punctuation.definition.comment.block.end.powershell" } }, "name": "comment.block.powershell", @@ -28,16 +28,6 @@ } ] }, - { - "begin": "(?&1|>>|>|<<|<|>|>\\||[1-6]>|[1-6]>>", "name": "keyword.operator.redirection.powershell" @@ -45,6 +35,9 @@ { "include": "#commands" }, + { + "include": "#commentLine" + }, { "include": "#variable" }, @@ -57,28 +50,20 @@ { "include": "#attribute" }, + { + "include": "#UsingDirective" + }, { "include": "#type" }, { - "begin": "(?&1 & set\"", - "t": "source.powershell interpolated.simple.source.powershell string.quoted.double.powershell", + "c": "::GetCurrent", + "t": "source.powershell meta.scriptblock.powershell meta.scriptblock.powershell", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string: #A31515", - "dark_vs": "string: #CE9178", - "light_vs": "string: #A31515", - "hc_black": "string: #CE9178" + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "(", + "t": "source.powershell meta.scriptblock.powershell meta.scriptblock.powershell punctuation.section.group.begin.powershell", + "r": { + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "default: #FFFFFF" } }, { "c": ")", - "t": "source.powershell keyword.other.powershell", + "t": "source.powershell meta.scriptblock.powershell meta.scriptblock.powershell punctuation.section.group.end.powershell", "r": { - "dark_plus": "keyword: #569CD6", - "light_plus": "keyword: #0000FF", - "dark_vs": "keyword: #569CD6", - "light_vs": "keyword: #0000FF", - "hc_black": "keyword: #569CD6" - } - }, - { - "c": " {", - "t": "source.powershell", - "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, { "c": " ", - "t": "source.powershell", + "t": "source.powershell meta.scriptblock.powershell meta.scriptblock.powershell", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, { - "c": "if", - "t": "source.powershell keyword.control.powershell", + "c": "$", + "t": "source.powershell meta.scriptblock.powershell meta.scriptblock.powershell keyword.other.variable.definition.powershell", "r": { - "dark_plus": "keyword.control: #C586C0", - "light_plus": "keyword.control: #AF00DB", - "dark_vs": "keyword.control: #569CD6", - "light_vs": "keyword.control: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "keyword: #569CD6" + } + }, + { + "c": "principal", + "t": "source.powershell meta.scriptblock.powershell meta.scriptblock.powershell variable.other.readwrite.powershell", + "r": { + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "variable: #9CDCFE" + } + }, + { + "c": " ", + "t": "source.powershell meta.scriptblock.powershell meta.scriptblock.powershell", + "r": { + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "=", + "t": "source.powershell meta.scriptblock.powershell meta.scriptblock.powershell keyword.operator.assignment.powershell", + "r": { + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "keyword.operator: #D4D4D4" + } + }, + { + "c": " ", + "t": "source.powershell meta.scriptblock.powershell meta.scriptblock.powershell", + "r": { + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "New-Object", + "t": "source.powershell meta.scriptblock.powershell meta.scriptblock.powershell support.function.powershell", + "r": { + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "support.function: #DCDCAA" + } + }, + { + "c": " Security.Principal.WindowsPrincipal ", + "t": "source.powershell meta.scriptblock.powershell meta.scriptblock.powershell", + "r": { + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "-", + "t": "source.powershell meta.scriptblock.powershell meta.scriptblock.powershell keyword.operator.assignment.powershell", + "r": { + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "keyword.operator: #D4D4D4" + } + }, + { + "c": "ArgumentList ", + "t": "source.powershell meta.scriptblock.powershell meta.scriptblock.powershell", + "r": { + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "$", + "t": "source.powershell meta.scriptblock.powershell meta.scriptblock.powershell keyword.other.variable.definition.powershell", + "r": { + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "keyword: #569CD6" + } + }, + { + "c": "identity", + "t": "source.powershell meta.scriptblock.powershell meta.scriptblock.powershell variable.other.readwrite.powershell", + "r": { + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "variable: #9CDCFE" + } + }, + { + "c": " ", + "t": "source.powershell meta.scriptblock.powershell meta.scriptblock.powershell", + "r": { + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "return", + "t": "source.powershell meta.scriptblock.powershell meta.scriptblock.powershell keyword.control.powershell", + "r": { + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword.control: #C586C0" } }, { "c": " ", - "t": "source.powershell", + "t": "source.powershell meta.scriptblock.powershell meta.scriptblock.powershell", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, - { - "c": "(", - "t": "source.powershell keyword.other.powershell", - "r": { - "dark_plus": "keyword: #569CD6", - "light_plus": "keyword: #0000FF", - "dark_vs": "keyword: #569CD6", - "light_vs": "keyword: #0000FF", - "hc_black": "keyword: #569CD6" - } - }, { "c": "$", - "t": "source.powershell interpolated.simple.source.powershell keyword.other.powershell", + "t": "source.powershell meta.scriptblock.powershell meta.scriptblock.powershell keyword.other.variable.definition.powershell", "r": { - "dark_plus": "keyword: #569CD6", - "light_plus": "keyword: #0000FF", - "dark_vs": "keyword: #569CD6", - "light_vs": "keyword: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword: #569CD6" } }, { - "c": "_", - "t": "source.powershell interpolated.simple.source.powershell support.constant.automatic.powershell", + "c": "principal", + "t": "source.powershell meta.scriptblock.powershell meta.scriptblock.powershell variable.other.readwrite.powershell", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "variable: #9CDCFE" + } + }, + { + "c": ".IsInRole", + "t": "source.powershell meta.scriptblock.powershell meta.scriptblock.powershell entity.name.function.invocation.powershell", + "r": { + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "entity.name.function: #DCDCAA" + } + }, + { + "c": "(", + "t": "source.powershell meta.scriptblock.powershell meta.scriptblock.powershell punctuation.section.group.begin.powershell", + "r": { + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, { "c": " ", - "t": "source.powershell interpolated.simple.source.powershell", + "t": "source.powershell meta.scriptblock.powershell meta.scriptblock.powershell interpolated.simple.source.powershell", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" - } - }, - { - "c": "-match", - "t": "source.powershell interpolated.simple.source.powershell keyword.operator.comparison.powershell", - "r": { - "dark_plus": "keyword.operator: #D4D4D4", - "light_plus": "keyword.operator: #000000", - "dark_vs": "keyword.operator: #D4D4D4", - "light_vs": "keyword.operator: #000000", - "hc_black": "keyword.operator: #D4D4D4" - } - }, - { - "c": " ", - "t": "source.powershell interpolated.simple.source.powershell", - "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" - } - }, - { - "c": "'^([^=]+)=(.*)'", - "t": "source.powershell interpolated.simple.source.powershell string.quoted.single.powershell", - "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string: #A31515", - "dark_vs": "string: #CE9178", - "light_vs": "string: #A31515", - "hc_black": "string: #CE9178" - } - }, - { - "c": ")", - "t": "source.powershell keyword.other.powershell", - "r": { - "dark_plus": "keyword: #569CD6", - "light_plus": "keyword: #0000FF", - "dark_vs": "keyword: #569CD6", - "light_vs": "keyword: #0000FF", - "hc_black": "keyword: #569CD6" - } - }, - { - "c": " {", - "t": "source.powershell", - "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" - } - }, - { - "c": " ", - "t": "source.powershell", - "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" - } - }, - { - "c": "[System.Environment]", - "t": "source.powershell entity.other.attribute-name", - "r": { - "dark_plus": "entity.other.attribute-name: #9CDCFE", - "light_plus": "entity.other.attribute-name: #FF0000", - "dark_vs": "entity.other.attribute-name: #9CDCFE", - "light_vs": "entity.other.attribute-name: #FF0000", - "hc_black": "entity.other.attribute-name: #9CDCFE" - } - }, - { - "c": "::SetEnvironmentVariable", - "t": "source.powershell", - "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" - } - }, - { - "c": "(", - "t": "source.powershell keyword.other.powershell", - "r": { - "dark_plus": "keyword: #569CD6", - "light_plus": "keyword: #0000FF", - "dark_vs": "keyword: #569CD6", - "light_vs": "keyword: #0000FF", - "hc_black": "keyword: #569CD6" - } - }, - { - "c": "$", - "t": "source.powershell interpolated.simple.source.powershell keyword.other.powershell", - "r": { - "dark_plus": "keyword: #569CD6", - "light_plus": "keyword: #0000FF", - "dark_vs": "keyword: #569CD6", - "light_vs": "keyword: #0000FF", - "hc_black": "keyword: #569CD6" - } - }, - { - "c": "matches", - "t": "source.powershell interpolated.simple.source.powershell support.constant.automatic.powershell", - "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, { "c": "[", - "t": "source.powershell interpolated.simple.source.powershell entity.other.attribute-name", + "t": "source.powershell meta.scriptblock.powershell meta.scriptblock.powershell interpolated.simple.source.powershell punctuation.section.bracket.begin.powershell", "r": { - "dark_plus": "entity.other.attribute-name: #9CDCFE", - "light_plus": "entity.other.attribute-name: #FF0000", - "dark_vs": "entity.other.attribute-name: #9CDCFE", - "light_vs": "entity.other.attribute-name: #FF0000", - "hc_black": "entity.other.attribute-name: #9CDCFE" - } - }, - { - "c": "1", - "t": "source.powershell interpolated.simple.source.powershell constant.numeric.scientific.powershell support.constant.powershell", - "r": { - "dark_plus": "constant.numeric: #B5CEA8", - "light_plus": "constant.numeric: #09885A", - "dark_vs": "constant.numeric: #B5CEA8", - "light_vs": "constant.numeric: #09885A", - "hc_black": "constant.numeric: #B5CEA8" - } - }, - { - "c": "]", - "t": "source.powershell interpolated.simple.source.powershell entity.other.attribute-name", - "r": { - "dark_plus": "entity.other.attribute-name: #9CDCFE", - "light_plus": "entity.other.attribute-name: #FF0000", - "dark_vs": "entity.other.attribute-name: #9CDCFE", - "light_vs": "entity.other.attribute-name: #FF0000", - "hc_black": "entity.other.attribute-name: #9CDCFE" - } - }, - { - "c": ",", - "t": "source.powershell interpolated.simple.source.powershell keyword.operator.other.powershell", - "r": { - "dark_plus": "keyword.operator: #D4D4D4", - "light_plus": "keyword.operator: #000000", - "dark_vs": "keyword.operator: #D4D4D4", - "light_vs": "keyword.operator: #000000", - "hc_black": "keyword.operator: #D4D4D4" - } - }, - { - "c": " ", - "t": "source.powershell interpolated.simple.source.powershell", - "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, { - "c": "$", - "t": "source.powershell interpolated.simple.source.powershell keyword.other.powershell", + "c": "Security.Principal.WindowsBuiltInRole", + "t": "source.powershell meta.scriptblock.powershell meta.scriptblock.powershell interpolated.simple.source.powershell storage.type.powershell", "r": { - "dark_plus": "keyword: #569CD6", - "light_plus": "keyword: #0000FF", - "dark_vs": "keyword: #569CD6", - "light_vs": "keyword: #0000FF", - "hc_black": "keyword: #569CD6" - } - }, - { - "c": "matches", - "t": "source.powershell interpolated.simple.source.powershell support.constant.automatic.powershell", - "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" - } - }, - { - "c": "[", - "t": "source.powershell interpolated.simple.source.powershell entity.other.attribute-name", - "r": { - "dark_plus": "entity.other.attribute-name: #9CDCFE", - "light_plus": "entity.other.attribute-name: #FF0000", - "dark_vs": "entity.other.attribute-name: #9CDCFE", - "light_vs": "entity.other.attribute-name: #FF0000", - "hc_black": "entity.other.attribute-name: #9CDCFE" - } - }, - { - "c": "2", - "t": "source.powershell interpolated.simple.source.powershell constant.numeric.scientific.powershell support.constant.powershell", - "r": { - "dark_plus": "constant.numeric: #B5CEA8", - "light_plus": "constant.numeric: #09885A", - "dark_vs": "constant.numeric: #B5CEA8", - "light_vs": "constant.numeric: #09885A", - "hc_black": "constant.numeric: #B5CEA8" + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "storage.type: #569CD6" } }, { "c": "]", - "t": "source.powershell interpolated.simple.source.powershell entity.other.attribute-name", + "t": "source.powershell meta.scriptblock.powershell meta.scriptblock.powershell interpolated.simple.source.powershell punctuation.section.bracket.end.powershell", "r": { - "dark_plus": "entity.other.attribute-name: #9CDCFE", - "light_plus": "entity.other.attribute-name: #FF0000", - "dark_vs": "entity.other.attribute-name: #9CDCFE", - "light_vs": "entity.other.attribute-name: #FF0000", - "hc_black": "entity.other.attribute-name: #9CDCFE" + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "::Administrator ", + "t": "source.powershell meta.scriptblock.powershell meta.scriptblock.powershell interpolated.simple.source.powershell", + "r": { + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "default: #FFFFFF" } }, { "c": ")", - "t": "source.powershell keyword.other.powershell", + "t": "source.powershell meta.scriptblock.powershell meta.scriptblock.powershell punctuation.section.group.end.powershell", "r": { - "dark_plus": "keyword: #569CD6", - "light_plus": "keyword: #0000FF", - "dark_vs": "keyword: #569CD6", - "light_vs": "keyword: #0000FF", - "hc_black": "keyword: #569CD6" - } - }, - { - "c": " }", - "t": "source.powershell", - "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, { - "c": " }", - "t": "source.powershell", + "c": " ", + "t": "source.powershell meta.scriptblock.powershell meta.scriptblock.powershell", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, { "c": "}", - "t": "source.powershell", + "t": "source.powershell meta.scriptblock.powershell meta.scriptblock.powershell punctuation.section.braces.end.powershell", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "default: #FFFFFF" + } + }, + { + "c": " ", + "t": "source.powershell meta.scriptblock.powershell", + "r": { + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "catch", + "t": "source.powershell meta.scriptblock.powershell keyword.control.powershell", + "r": { + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "keyword.control: #C586C0" + } + }, + { + "c": " ", + "t": "source.powershell meta.scriptblock.powershell", + "r": { + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "{", + "t": "source.powershell meta.scriptblock.powershell meta.scriptblock.powershell punctuation.section.braces.begin.powershell", + "r": { + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "default: #FFFFFF" + } + }, + { + "c": " ", + "t": "source.powershell meta.scriptblock.powershell meta.scriptblock.powershell", + "r": { + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "throw", + "t": "source.powershell meta.scriptblock.powershell meta.scriptblock.powershell keyword.control.powershell", + "r": { + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "keyword.control: #C586C0" + } + }, + { + "c": " ", + "t": "source.powershell meta.scriptblock.powershell meta.scriptblock.powershell", + "r": { + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "\"Failed to determine if the current user has elevated privileges. The error was: '{0}'.\"", + "t": "source.powershell meta.scriptblock.powershell meta.scriptblock.powershell string.quoted.double.powershell", + "r": { + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "string: #CE9178" + } + }, + { + "c": " ", + "t": "source.powershell meta.scriptblock.powershell meta.scriptblock.powershell", + "r": { + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "-f", + "t": "source.powershell meta.scriptblock.powershell meta.scriptblock.powershell keyword.operator.string-format.powershell", + "r": { + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "keyword.operator: #D4D4D4" + } + }, + { + "c": " ", + "t": "source.powershell meta.scriptblock.powershell meta.scriptblock.powershell", + "r": { + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "$", + "t": "source.powershell meta.scriptblock.powershell meta.scriptblock.powershell keyword.other.variable.definition.powershell", + "r": { + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "keyword: #569CD6" + } + }, + { + "c": "_", + "t": "source.powershell meta.scriptblock.powershell meta.scriptblock.powershell support.constant.automatic.powershell", + "r": { + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "default: #FFFFFF" + } + }, + { + "c": " ", + "t": "source.powershell meta.scriptblock.powershell meta.scriptblock.powershell", + "r": { + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "}", + "t": "source.powershell meta.scriptblock.powershell meta.scriptblock.powershell punctuation.section.braces.end.powershell", + "r": { + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "}", + "t": "source.powershell meta.scriptblock.powershell punctuation.section.braces.end.powershell", + "r": { + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "function", + "t": "source.powershell meta.function.powershell storage.type.powershell", + "r": { + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "storage.type: #569CD6" + } + }, + { + "c": " ", + "t": "source.powershell meta.function.powershell", + "r": { + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "Invoke-Environment", + "t": "source.powershell meta.function.powershell entity.name.function.powershell", + "r": { + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "entity.name.function: #DCDCAA" + } + }, + { + "c": "(", + "t": "source.powershell punctuation.section.group.begin.powershell", + "r": { + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "default: #FFFFFF" + } + }, + { + "c": ")", + "t": "source.powershell punctuation.section.group.end.powershell", + "r": { + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "{", + "t": "source.powershell meta.scriptblock.powershell punctuation.section.braces.begin.powershell", + "r": { + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "default: #FFFFFF" + } + }, + { + "c": " ", + "t": "source.powershell meta.scriptblock.powershell", + "r": { + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "param", + "t": "source.powershell meta.scriptblock.powershell keyword.control.powershell", + "r": { + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "keyword.control: #C586C0" + } + }, + { + "c": " ", + "t": "source.powershell meta.scriptblock.powershell", + "r": { + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "(", + "t": "source.powershell meta.scriptblock.powershell punctuation.section.group.begin.powershell", + "r": { + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "default: #FFFFFF" + } + }, + { + "c": " ", + "t": "source.powershell meta.scriptblock.powershell interpolated.simple.source.powershell", + "r": { + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "[", + "t": "source.powershell meta.scriptblock.powershell interpolated.simple.source.powershell meta.attribute.powershell punctuation.section.bracket.begin.powershell", + "r": { + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "Parameter", + "t": "source.powershell meta.scriptblock.powershell interpolated.simple.source.powershell meta.attribute.powershell support.function.attribute.powershell", + "r": { + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "support.function: #DCDCAA" + } + }, + { + "c": "(", + "t": "source.powershell meta.scriptblock.powershell interpolated.simple.source.powershell meta.attribute.powershell punctuation.section.group.begin.powershell", + "r": { + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "Mandatory", + "t": "source.powershell meta.scriptblock.powershell interpolated.simple.source.powershell meta.attribute.powershell variable.parameter.attribute.powershell", + "r": { + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "variable: #9CDCFE" + } + }, + { + "c": "=", + "t": "source.powershell meta.scriptblock.powershell interpolated.simple.source.powershell meta.attribute.powershell keyword.operator.assignment.powershell", + "r": { + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "keyword.operator: #D4D4D4" + } + }, + { + "c": "1", + "t": "source.powershell meta.scriptblock.powershell interpolated.simple.source.powershell meta.attribute.powershell constant.numeric.integer.powershell", + "r": { + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "constant.numeric: #B5CEA8" + } + }, + { + "c": ")", + "t": "source.powershell meta.scriptblock.powershell interpolated.simple.source.powershell meta.attribute.powershell punctuation.section.group.end.powershell", + "r": { + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "]", + "t": "source.powershell meta.scriptblock.powershell interpolated.simple.source.powershell meta.attribute.powershell punctuation.section.bracket.end.powershell", + "r": { + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "[", + "t": "source.powershell meta.scriptblock.powershell interpolated.simple.source.powershell punctuation.section.bracket.begin.powershell", + "r": { + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "string", + "t": "source.powershell meta.scriptblock.powershell interpolated.simple.source.powershell storage.type.powershell", + "r": { + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "storage.type: #569CD6" + } + }, + { + "c": "]", + "t": "source.powershell meta.scriptblock.powershell interpolated.simple.source.powershell punctuation.section.bracket.end.powershell", + "r": { + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "$", + "t": "source.powershell meta.scriptblock.powershell interpolated.simple.source.powershell keyword.other.variable.definition.powershell", + "r": { + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "keyword: #569CD6" + } + }, + { + "c": "Command", + "t": "source.powershell meta.scriptblock.powershell interpolated.simple.source.powershell variable.other.readwrite.powershell", + "r": { + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "variable: #9CDCFE" + } + }, + { + "c": " ", + "t": "source.powershell meta.scriptblock.powershell interpolated.simple.source.powershell", + "r": { + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "default: #FFFFFF" + } + }, + { + "c": ")", + "t": "source.powershell meta.scriptblock.powershell punctuation.section.group.end.powershell", + "r": { + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "default: #FFFFFF" + } + }, + { + "c": " ", + "t": "source.powershell meta.scriptblock.powershell", + "r": { + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "foreach", + "t": "source.powershell meta.scriptblock.powershell keyword.control.powershell", + "r": { + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "keyword.control: #C586C0" + } + }, + { + "c": "(", + "t": "source.powershell meta.scriptblock.powershell punctuation.section.group.begin.powershell", + "r": { + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "$", + "t": "source.powershell meta.scriptblock.powershell interpolated.simple.source.powershell keyword.other.variable.definition.powershell", + "r": { + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "keyword: #569CD6" + } + }, + { + "c": "_", + "t": "source.powershell meta.scriptblock.powershell interpolated.simple.source.powershell support.constant.automatic.powershell", + "r": { + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "default: #FFFFFF" + } + }, + { + "c": " ", + "t": "source.powershell meta.scriptblock.powershell interpolated.simple.source.powershell", + "r": { + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "in", + "t": "source.powershell meta.scriptblock.powershell interpolated.simple.source.powershell keyword.control.powershell", + "r": { + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "keyword.control: #C586C0" + } + }, + { + "c": " cmd ", + "t": "source.powershell meta.scriptblock.powershell interpolated.simple.source.powershell", + "r": { + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "/", + "t": "source.powershell meta.scriptblock.powershell interpolated.simple.source.powershell keyword.operator.assignment.powershell", + "r": { + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "keyword.operator: #D4D4D4" + } + }, + { + "c": "c ", + "t": "source.powershell meta.scriptblock.powershell interpolated.simple.source.powershell", + "r": { + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "\"", + "t": "source.powershell meta.scriptblock.powershell interpolated.simple.source.powershell string.quoted.double.powershell", + "r": { + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "string: #CE9178" + } + }, + { + "c": "$", + "t": "source.powershell meta.scriptblock.powershell interpolated.simple.source.powershell string.quoted.double.powershell keyword.other.variable.definition.powershell", + "r": { + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "keyword: #569CD6" + } + }, + { + "c": "Command", + "t": "source.powershell meta.scriptblock.powershell interpolated.simple.source.powershell string.quoted.double.powershell variable.other.readwrite.powershell", + "r": { + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "variable: #9CDCFE" + } + }, + { + "c": " 2>&1 & set\"", + "t": "source.powershell meta.scriptblock.powershell interpolated.simple.source.powershell string.quoted.double.powershell", + "r": { + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "string: #CE9178" + } + }, + { + "c": ")", + "t": "source.powershell meta.scriptblock.powershell punctuation.section.group.end.powershell", + "r": { + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "default: #FFFFFF" + } + }, + { + "c": " ", + "t": "source.powershell meta.scriptblock.powershell", + "r": { + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "{", + "t": "source.powershell meta.scriptblock.powershell meta.scriptblock.powershell punctuation.section.braces.begin.powershell", + "r": { + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "default: #FFFFFF" + } + }, + { + "c": " ", + "t": "source.powershell meta.scriptblock.powershell meta.scriptblock.powershell", + "r": { + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "if", + "t": "source.powershell meta.scriptblock.powershell meta.scriptblock.powershell keyword.control.powershell", + "r": { + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "keyword.control: #C586C0" + } + }, + { + "c": " ", + "t": "source.powershell meta.scriptblock.powershell meta.scriptblock.powershell", + "r": { + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "(", + "t": "source.powershell meta.scriptblock.powershell meta.scriptblock.powershell punctuation.section.group.begin.powershell", + "r": { + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "$", + "t": "source.powershell meta.scriptblock.powershell meta.scriptblock.powershell interpolated.simple.source.powershell keyword.other.variable.definition.powershell", + "r": { + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "keyword: #569CD6" + } + }, + { + "c": "_", + "t": "source.powershell meta.scriptblock.powershell meta.scriptblock.powershell interpolated.simple.source.powershell support.constant.automatic.powershell", + "r": { + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "default: #FFFFFF" + } + }, + { + "c": " ", + "t": "source.powershell meta.scriptblock.powershell meta.scriptblock.powershell interpolated.simple.source.powershell", + "r": { + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "-match", + "t": "source.powershell meta.scriptblock.powershell meta.scriptblock.powershell interpolated.simple.source.powershell keyword.operator.comparison.powershell", + "r": { + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "keyword.operator: #D4D4D4" + } + }, + { + "c": " ", + "t": "source.powershell meta.scriptblock.powershell meta.scriptblock.powershell interpolated.simple.source.powershell", + "r": { + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "'^([^=]+)=(.*)'", + "t": "source.powershell meta.scriptblock.powershell meta.scriptblock.powershell interpolated.simple.source.powershell string.quoted.single.powershell", + "r": { + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "string: #CE9178" + } + }, + { + "c": ")", + "t": "source.powershell meta.scriptblock.powershell meta.scriptblock.powershell punctuation.section.group.end.powershell", + "r": { + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "default: #FFFFFF" + } + }, + { + "c": " ", + "t": "source.powershell meta.scriptblock.powershell meta.scriptblock.powershell", + "r": { + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "{", + "t": "source.powershell meta.scriptblock.powershell meta.scriptblock.powershell meta.scriptblock.powershell punctuation.section.braces.begin.powershell", + "r": { + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "default: #FFFFFF" + } + }, + { + "c": " ", + "t": "source.powershell meta.scriptblock.powershell meta.scriptblock.powershell meta.scriptblock.powershell", + "r": { + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "[", + "t": "source.powershell meta.scriptblock.powershell meta.scriptblock.powershell meta.scriptblock.powershell punctuation.section.bracket.begin.powershell", + "r": { + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "System.Environment", + "t": "source.powershell meta.scriptblock.powershell meta.scriptblock.powershell meta.scriptblock.powershell storage.type.powershell", + "r": { + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "storage.type: #569CD6" + } + }, + { + "c": "]", + "t": "source.powershell meta.scriptblock.powershell meta.scriptblock.powershell meta.scriptblock.powershell punctuation.section.bracket.end.powershell", + "r": { + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "::SetEnvironmentVariable", + "t": "source.powershell meta.scriptblock.powershell meta.scriptblock.powershell meta.scriptblock.powershell", + "r": { + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "(", + "t": "source.powershell meta.scriptblock.powershell meta.scriptblock.powershell meta.scriptblock.powershell punctuation.section.group.begin.powershell", + "r": { + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "$", + "t": "source.powershell meta.scriptblock.powershell meta.scriptblock.powershell meta.scriptblock.powershell interpolated.simple.source.powershell keyword.other.variable.definition.powershell", + "r": { + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "keyword: #569CD6" + } + }, + { + "c": "matches", + "t": "source.powershell meta.scriptblock.powershell meta.scriptblock.powershell meta.scriptblock.powershell interpolated.simple.source.powershell support.constant.automatic.powershell", + "r": { + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "[", + "t": "source.powershell meta.scriptblock.powershell meta.scriptblock.powershell meta.scriptblock.powershell interpolated.simple.source.powershell punctuation.section.bracket.begin.powershell", + "r": { + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "1", + "t": "source.powershell meta.scriptblock.powershell meta.scriptblock.powershell meta.scriptblock.powershell interpolated.simple.source.powershell constant.numeric.integer.powershell", + "r": { + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "constant.numeric: #B5CEA8" + } + }, + { + "c": "]", + "t": "source.powershell meta.scriptblock.powershell meta.scriptblock.powershell meta.scriptblock.powershell interpolated.simple.source.powershell punctuation.section.bracket.end.powershell", + "r": { + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "default: #FFFFFF" + } + }, + { + "c": ",", + "t": "source.powershell meta.scriptblock.powershell meta.scriptblock.powershell meta.scriptblock.powershell interpolated.simple.source.powershell keyword.operator.other.powershell", + "r": { + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "keyword.operator: #D4D4D4" + } + }, + { + "c": " ", + "t": "source.powershell meta.scriptblock.powershell meta.scriptblock.powershell meta.scriptblock.powershell interpolated.simple.source.powershell", + "r": { + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "$", + "t": "source.powershell meta.scriptblock.powershell meta.scriptblock.powershell meta.scriptblock.powershell interpolated.simple.source.powershell keyword.other.variable.definition.powershell", + "r": { + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "keyword: #569CD6" + } + }, + { + "c": "matches", + "t": "source.powershell meta.scriptblock.powershell meta.scriptblock.powershell meta.scriptblock.powershell interpolated.simple.source.powershell support.constant.automatic.powershell", + "r": { + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "[", + "t": "source.powershell meta.scriptblock.powershell meta.scriptblock.powershell meta.scriptblock.powershell interpolated.simple.source.powershell punctuation.section.bracket.begin.powershell", + "r": { + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "2", + "t": "source.powershell meta.scriptblock.powershell meta.scriptblock.powershell meta.scriptblock.powershell interpolated.simple.source.powershell constant.numeric.integer.powershell", + "r": { + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "constant.numeric: #B5CEA8" + } + }, + { + "c": "]", + "t": "source.powershell meta.scriptblock.powershell meta.scriptblock.powershell meta.scriptblock.powershell interpolated.simple.source.powershell punctuation.section.bracket.end.powershell", + "r": { + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "default: #FFFFFF" + } + }, + { + "c": ")", + "t": "source.powershell meta.scriptblock.powershell meta.scriptblock.powershell meta.scriptblock.powershell punctuation.section.group.end.powershell", + "r": { + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "default: #FFFFFF" + } + }, + { + "c": " ", + "t": "source.powershell meta.scriptblock.powershell meta.scriptblock.powershell meta.scriptblock.powershell", + "r": { + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "}", + "t": "source.powershell meta.scriptblock.powershell meta.scriptblock.powershell meta.scriptblock.powershell punctuation.section.braces.end.powershell", + "r": { + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "default: #FFFFFF" + } + }, + { + "c": " ", + "t": "source.powershell meta.scriptblock.powershell meta.scriptblock.powershell", + "r": { + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "}", + "t": "source.powershell meta.scriptblock.powershell meta.scriptblock.powershell punctuation.section.braces.end.powershell", + "r": { + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "}", + "t": "source.powershell meta.scriptblock.powershell punctuation.section.braces.end.powershell", + "r": { + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1378,10 +1631,10 @@ "c": "Write-Host", "t": "source.powershell support.function.powershell", "r": { - "dark_plus": "support.function: #DCDCAA", - "light_plus": "support.function: #795E26", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "support.function: #DCDCAA" } }, @@ -1389,10 +1642,10 @@ "c": " ", "t": "source.powershell", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1400,10 +1653,10 @@ "c": "-", "t": "source.powershell keyword.operator.assignment.powershell", "r": { - "dark_plus": "keyword.operator: #D4D4D4", - "light_plus": "keyword.operator: #000000", - "dark_vs": "keyword.operator: #D4D4D4", - "light_vs": "keyword.operator: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword.operator: #D4D4D4" } }, @@ -1411,10 +1664,10 @@ "c": "Object ", "t": "source.powershell", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1422,10 +1675,10 @@ "c": "'Initializing Azure PowerShell environment...'", "t": "source.powershell string.quoted.single.powershell", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string: #A31515", - "dark_vs": "string: #CE9178", - "light_vs": "string: #A31515", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -1433,21 +1686,32 @@ "c": ";", "t": "source.powershell keyword.other.statement-separator.powershell", "r": { - "dark_plus": "keyword: #569CD6", - "light_plus": "keyword: #0000FF", - "dark_vs": "keyword: #569CD6", - "light_vs": "keyword: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword: #569CD6" } }, { - "c": "# PowerShell commands need elevation for dependencies installation and running tests", - "t": "source.powershell comment.line.number-sign.powershell", + "c": "#", + "t": "source.powershell comment.line.powershell punctuation.definition.comment.powershell", "r": { - "dark_plus": "comment: #608B4E", - "light_plus": "comment: #008000", - "dark_vs": "comment: #608B4E", - "light_vs": "comment: #008000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "comment: #7CA668" + } + }, + { + "c": " PowerShell commands need elevation for dependencies installation and running tests", + "t": "source.powershell comment.line.powershell", + "r": { + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "comment: #7CA668" } }, @@ -1455,10 +1719,10 @@ "c": "if", "t": "source.powershell keyword.control.powershell", "r": { - "dark_plus": "keyword.control: #C586C0", - "light_plus": "keyword.control: #AF00DB", - "dark_vs": "keyword.control: #569CD6", - "light_vs": "keyword.control: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword.control: #C586C0" } }, @@ -1466,219 +1730,219 @@ "c": " ", "t": "source.powershell", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, { "c": "(", - "t": "source.powershell keyword.other.powershell", + "t": "source.powershell punctuation.section.group.begin.powershell", "r": { - "dark_plus": "keyword: #569CD6", - "light_plus": "keyword: #0000FF", - "dark_vs": "keyword: #569CD6", - "light_vs": "keyword: #0000FF", - "hc_black": "keyword: #569CD6" + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "default: #FFFFFF" } }, { "c": "!", "t": "source.powershell interpolated.simple.source.powershell keyword.operator.unary.powershell", "r": { - "dark_plus": "keyword.operator: #D4D4D4", - "light_plus": "keyword.operator: #000000", - "dark_vs": "keyword.operator: #D4D4D4", - "light_vs": "keyword.operator: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword.operator: #D4D4D4" } }, { "c": "(", - "t": "source.powershell interpolated.simple.source.powershell keyword.other.powershell", + "t": "source.powershell interpolated.simple.source.powershell punctuation.section.group.begin.powershell", "r": { - "dark_plus": "keyword: #569CD6", - "light_plus": "keyword: #0000FF", - "dark_vs": "keyword: #569CD6", - "light_vs": "keyword: #0000FF", - "hc_black": "keyword: #569CD6" + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "default: #FFFFFF" } }, { "c": "Test-IsAdmin", "t": "source.powershell interpolated.simple.source.powershell interpolated.simple.source.powershell support.function.powershell", "r": { - "dark_plus": "support.function: #DCDCAA", - "light_plus": "support.function: #795E26", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "support.function: #DCDCAA" } }, { "c": ")", - "t": "source.powershell interpolated.simple.source.powershell keyword.other.powershell", + "t": "source.powershell interpolated.simple.source.powershell punctuation.section.group.end.powershell", "r": { - "dark_plus": "keyword: #569CD6", - "light_plus": "keyword: #0000FF", - "dark_vs": "keyword: #569CD6", - "light_vs": "keyword: #0000FF", - "hc_black": "keyword: #569CD6" + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "default: #FFFFFF" } }, { "c": ")", - "t": "source.powershell keyword.other.powershell", + "t": "source.powershell punctuation.section.group.end.powershell", "r": { - "dark_plus": "keyword: #569CD6", - "light_plus": "keyword: #0000FF", - "dark_vs": "keyword: #569CD6", - "light_vs": "keyword: #0000FF", - "hc_black": "keyword: #569CD6" + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "default: #FFFFFF" } }, { "c": "{", - "t": "source.powershell", + "t": "source.powershell meta.scriptblock.powershell punctuation.section.braces.begin.powershell", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, { "c": " ", - "t": "source.powershell", + "t": "source.powershell meta.scriptblock.powershell", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, { "c": "Write-Host", - "t": "source.powershell support.function.powershell", + "t": "source.powershell meta.scriptblock.powershell support.function.powershell", "r": { - "dark_plus": "support.function: #DCDCAA", - "light_plus": "support.function: #795E26", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "support.function: #DCDCAA" } }, { "c": " ", - "t": "source.powershell", + "t": "source.powershell meta.scriptblock.powershell", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, { "c": "-", - "t": "source.powershell keyword.operator.assignment.powershell", + "t": "source.powershell meta.scriptblock.powershell keyword.operator.assignment.powershell", "r": { - "dark_plus": "keyword.operator: #D4D4D4", - "light_plus": "keyword.operator: #000000", - "dark_vs": "keyword.operator: #D4D4D4", - "light_vs": "keyword.operator: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword.operator: #D4D4D4" } }, { "c": "Object ", - "t": "source.powershell", + "t": "source.powershell meta.scriptblock.powershell", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, { "c": "'Please launch command under administrator account. It is needed for environment setting up and unit test.'", - "t": "source.powershell string.quoted.single.powershell", + "t": "source.powershell meta.scriptblock.powershell string.quoted.single.powershell", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string: #A31515", - "dark_vs": "string: #CE9178", - "light_vs": "string: #A31515", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, { "c": " ", - "t": "source.powershell", + "t": "source.powershell meta.scriptblock.powershell", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, { "c": "-", - "t": "source.powershell keyword.operator.assignment.powershell", + "t": "source.powershell meta.scriptblock.powershell keyword.operator.assignment.powershell", "r": { - "dark_plus": "keyword.operator: #D4D4D4", - "light_plus": "keyword.operator: #000000", - "dark_vs": "keyword.operator: #D4D4D4", - "light_vs": "keyword.operator: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword.operator: #D4D4D4" } }, { "c": "ForegroundColor Red", - "t": "source.powershell", + "t": "source.powershell meta.scriptblock.powershell", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, { "c": ";", - "t": "source.powershell keyword.other.statement-separator.powershell", + "t": "source.powershell meta.scriptblock.powershell keyword.other.statement-separator.powershell", "r": { - "dark_plus": "keyword: #569CD6", - "light_plus": "keyword: #0000FF", - "dark_vs": "keyword: #569CD6", - "light_vs": "keyword: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword: #569CD6" } }, { "c": "}", - "t": "source.powershell", + "t": "source.powershell meta.scriptblock.powershell punctuation.section.braces.end.powershell", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, { "c": "$", - "t": "source.powershell keyword.other.powershell", + "t": "source.powershell keyword.other.variable.definition.powershell", "r": { - "dark_plus": "keyword: #569CD6", - "light_plus": "keyword: #0000FF", - "dark_vs": "keyword: #569CD6", - "light_vs": "keyword: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword: #569CD6" } }, @@ -1686,10 +1950,10 @@ "c": "env:", "t": "source.powershell support.variable.drive.powershell", "r": { - "dark_plus": "support.variable: #9CDCFE", - "light_plus": "support.variable: #001080", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "support.variable: #9CDCFE" } }, @@ -1697,10 +1961,10 @@ "c": "AzurePSRoot", "t": "source.powershell variable.other.readwrite.powershell", "r": { - "dark_plus": "variable: #9CDCFE", - "light_plus": "variable: #001080", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "variable: #9CDCFE" } }, @@ -1708,10 +1972,10 @@ "c": " ", "t": "source.powershell", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1719,10 +1983,10 @@ "c": "=", "t": "source.powershell keyword.operator.assignment.powershell", "r": { - "dark_plus": "keyword.operator: #D4D4D4", - "light_plus": "keyword.operator: #000000", - "dark_vs": "keyword.operator: #D4D4D4", - "light_vs": "keyword.operator: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword.operator: #D4D4D4" } }, @@ -1730,10 +1994,10 @@ "c": " ", "t": "source.powershell", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1741,10 +2005,10 @@ "c": "Split-Path", "t": "source.powershell support.function.powershell", "r": { - "dark_plus": "support.function: #DCDCAA", - "light_plus": "support.function: #795E26", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "support.function: #DCDCAA" } }, @@ -1752,10 +2016,10 @@ "c": " ", "t": "source.powershell", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1763,10 +2027,10 @@ "c": "-", "t": "source.powershell keyword.operator.assignment.powershell", "r": { - "dark_plus": "keyword.operator: #D4D4D4", - "light_plus": "keyword.operator: #000000", - "dark_vs": "keyword.operator: #D4D4D4", - "light_vs": "keyword.operator: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword.operator: #D4D4D4" } }, @@ -1774,10 +2038,10 @@ "c": "Parent ", "t": "source.powershell", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1785,10 +2049,10 @@ "c": "-", "t": "source.powershell keyword.operator.assignment.powershell", "r": { - "dark_plus": "keyword.operator: #D4D4D4", - "light_plus": "keyword.operator: #000000", - "dark_vs": "keyword.operator: #D4D4D4", - "light_vs": "keyword.operator: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword.operator: #D4D4D4" } }, @@ -1796,21 +2060,21 @@ "c": "Path ", "t": "source.powershell", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, { "c": "$", - "t": "source.powershell keyword.other.powershell", + "t": "source.powershell keyword.other.variable.definition.powershell", "r": { - "dark_plus": "keyword: #569CD6", - "light_plus": "keyword: #0000FF", - "dark_vs": "keyword: #569CD6", - "light_vs": "keyword: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword: #569CD6" } }, @@ -1818,10 +2082,10 @@ "c": "env:", "t": "source.powershell support.variable.drive.powershell", "r": { - "dark_plus": "support.variable: #9CDCFE", - "light_plus": "support.variable: #001080", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "support.variable: #9CDCFE" } }, @@ -1829,10 +2093,10 @@ "c": "AzurePSRoot", "t": "source.powershell variable.other.readwrite.powershell", "r": { - "dark_plus": "variable: #9CDCFE", - "light_plus": "variable: #001080", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "variable: #9CDCFE" } }, @@ -1840,10 +2104,10 @@ "c": ";", "t": "source.powershell keyword.other.statement-separator.powershell", "r": { - "dark_plus": "keyword: #569CD6", - "light_plus": "keyword: #0000FF", - "dark_vs": "keyword: #569CD6", - "light_vs": "keyword: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword: #569CD6" } }, @@ -1851,10 +2115,10 @@ "c": "if", "t": "source.powershell keyword.control.powershell", "r": { - "dark_plus": "keyword.control: #C586C0", - "light_plus": "keyword.control: #AF00DB", - "dark_vs": "keyword.control: #569CD6", - "light_vs": "keyword.control: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword.control: #C586C0" } }, @@ -1862,32 +2126,32 @@ "c": " ", "t": "source.powershell", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, { "c": "(", - "t": "source.powershell keyword.other.powershell", + "t": "source.powershell punctuation.section.group.begin.powershell", "r": { - "dark_plus": "keyword: #569CD6", - "light_plus": "keyword: #0000FF", - "dark_vs": "keyword: #569CD6", - "light_vs": "keyword: #0000FF", - "hc_black": "keyword: #569CD6" + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "default: #FFFFFF" } }, { "c": "Test-Path", "t": "source.powershell interpolated.simple.source.powershell support.function.powershell", "r": { - "dark_plus": "support.function: #DCDCAA", - "light_plus": "support.function: #795E26", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "support.function: #DCDCAA" } }, @@ -1895,10 +2159,10 @@ "c": " ", "t": "source.powershell interpolated.simple.source.powershell", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1906,10 +2170,10 @@ "c": "-", "t": "source.powershell interpolated.simple.source.powershell keyword.operator.assignment.powershell", "r": { - "dark_plus": "keyword.operator: #D4D4D4", - "light_plus": "keyword.operator: #000000", - "dark_vs": "keyword.operator: #D4D4D4", - "light_vs": "keyword.operator: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword.operator: #D4D4D4" } }, @@ -1917,10 +2181,10 @@ "c": "Path ", "t": "source.powershell interpolated.simple.source.powershell", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1928,21 +2192,21 @@ "c": "\"", "t": "source.powershell interpolated.simple.source.powershell string.quoted.double.powershell", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string: #A31515", - "dark_vs": "string: #CE9178", - "light_vs": "string: #A31515", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, { "c": "$", - "t": "source.powershell interpolated.simple.source.powershell string.quoted.double.powershell keyword.other.powershell", + "t": "source.powershell interpolated.simple.source.powershell string.quoted.double.powershell keyword.other.variable.definition.powershell", "r": { - "dark_plus": "keyword: #569CD6", - "light_plus": "keyword: #0000FF", - "dark_vs": "keyword: #569CD6", - "light_vs": "keyword: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword: #569CD6" } }, @@ -1950,10 +2214,10 @@ "c": "env:", "t": "source.powershell interpolated.simple.source.powershell string.quoted.double.powershell support.variable.drive.powershell", "r": { - "dark_plus": "support.variable: #9CDCFE", - "light_plus": "support.variable: #001080", - "dark_vs": "string: #CE9178", - "light_vs": "string: #A31515", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "support.variable: #9CDCFE" } }, @@ -1961,10 +2225,10 @@ "c": "ADXSDKProgramFiles", "t": "source.powershell interpolated.simple.source.powershell string.quoted.double.powershell variable.other.readwrite.powershell", "r": { - "dark_plus": "variable: #9CDCFE", - "light_plus": "variable: #001080", - "dark_vs": "string: #CE9178", - "light_vs": "string: #A31515", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "variable: #9CDCFE" } }, @@ -1972,98 +2236,120 @@ "c": "\\Microsoft Visual Studio 12.0\"", "t": "source.powershell interpolated.simple.source.powershell string.quoted.double.powershell", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string: #A31515", - "dark_vs": "string: #CE9178", - "light_vs": "string: #A31515", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, { "c": ")", - "t": "source.powershell keyword.other.powershell", + "t": "source.powershell punctuation.section.group.end.powershell", "r": { - "dark_plus": "keyword: #569CD6", - "light_plus": "keyword: #0000FF", - "dark_vs": "keyword: #569CD6", - "light_vs": "keyword: #0000FF", - "hc_black": "keyword: #569CD6" + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "default: #FFFFFF" } }, { - "c": " {", + "c": " ", "t": "source.powershell", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "{", + "t": "source.powershell meta.scriptblock.powershell punctuation.section.braces.begin.powershell", + "r": { + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, { "c": " ", - "t": "source.powershell", + "t": "source.powershell meta.scriptblock.powershell", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, { "c": "$", - "t": "source.powershell keyword.other.powershell", + "t": "source.powershell meta.scriptblock.powershell keyword.other.variable.definition.powershell", "r": { - "dark_plus": "keyword: #569CD6", - "light_plus": "keyword: #0000FF", - "dark_vs": "keyword: #569CD6", - "light_vs": "keyword: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword: #569CD6" } }, { "c": "vsVersion", - "t": "source.powershell variable.other.readwrite.powershell", + "t": "source.powershell meta.scriptblock.powershell variable.other.readwrite.powershell", "r": { - "dark_plus": "variable: #9CDCFE", - "light_plus": "variable: #001080", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "variable: #9CDCFE" } }, { "c": "=", - "t": "source.powershell keyword.operator.assignment.powershell", + "t": "source.powershell meta.scriptblock.powershell keyword.operator.assignment.powershell", "r": { - "dark_plus": "keyword.operator: #D4D4D4", - "light_plus": "keyword.operator: #000000", - "dark_vs": "keyword.operator: #D4D4D4", - "light_vs": "keyword.operator: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword.operator: #D4D4D4" } }, { "c": "\"12.0\"", - "t": "source.powershell string.quoted.double.powershell", + "t": "source.powershell meta.scriptblock.powershell string.quoted.double.powershell", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string: #A31515", - "dark_vs": "string: #CE9178", - "light_vs": "string: #A31515", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, { - "c": "} ", + "c": "}", + "t": "source.powershell meta.scriptblock.powershell punctuation.section.braces.end.powershell", + "r": { + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "default: #FFFFFF" + } + }, + { + "c": " ", "t": "source.powershell", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -2071,98 +2357,109 @@ "c": "else", "t": "source.powershell keyword.control.powershell", "r": { - "dark_plus": "keyword.control: #C586C0", - "light_plus": "keyword.control: #AF00DB", - "dark_vs": "keyword.control: #569CD6", - "light_vs": "keyword.control: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword.control: #C586C0" } }, { - "c": " {", + "c": " ", "t": "source.powershell", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "{", + "t": "source.powershell meta.scriptblock.powershell punctuation.section.braces.begin.powershell", + "r": { + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, { "c": " ", - "t": "source.powershell", + "t": "source.powershell meta.scriptblock.powershell", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, { "c": "$", - "t": "source.powershell keyword.other.powershell", + "t": "source.powershell meta.scriptblock.powershell keyword.other.variable.definition.powershell", "r": { - "dark_plus": "keyword: #569CD6", - "light_plus": "keyword: #0000FF", - "dark_vs": "keyword: #569CD6", - "light_vs": "keyword: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword: #569CD6" } }, { "c": "vsVersion", - "t": "source.powershell variable.other.readwrite.powershell", + "t": "source.powershell meta.scriptblock.powershell variable.other.readwrite.powershell", "r": { - "dark_plus": "variable: #9CDCFE", - "light_plus": "variable: #001080", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "variable: #9CDCFE" } }, { "c": "=", - "t": "source.powershell keyword.operator.assignment.powershell", + "t": "source.powershell meta.scriptblock.powershell keyword.operator.assignment.powershell", "r": { - "dark_plus": "keyword.operator: #D4D4D4", - "light_plus": "keyword.operator: #000000", - "dark_vs": "keyword.operator: #D4D4D4", - "light_vs": "keyword.operator: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword.operator: #D4D4D4" } }, { "c": "\"11.0\"", - "t": "source.powershell string.quoted.double.powershell", + "t": "source.powershell meta.scriptblock.powershell string.quoted.double.powershell", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string: #A31515", - "dark_vs": "string: #CE9178", - "light_vs": "string: #A31515", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, { "c": "}", - "t": "source.powershell", + "t": "source.powershell meta.scriptblock.powershell punctuation.section.braces.end.powershell", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, { "c": "$", - "t": "source.powershell keyword.other.powershell", + "t": "source.powershell keyword.other.variable.definition.powershell", "r": { - "dark_plus": "keyword: #569CD6", - "light_plus": "keyword: #0000FF", - "dark_vs": "keyword: #569CD6", - "light_vs": "keyword: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword: #569CD6" } }, @@ -2170,10 +2467,10 @@ "c": "setVSEnv", "t": "source.powershell variable.other.readwrite.powershell", "r": { - "dark_plus": "variable: #9CDCFE", - "light_plus": "variable: #001080", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "variable: #9CDCFE" } }, @@ -2181,10 +2478,10 @@ "c": " ", "t": "source.powershell", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -2192,10 +2489,10 @@ "c": "=", "t": "source.powershell keyword.operator.assignment.powershell", "r": { - "dark_plus": "keyword.operator: #D4D4D4", - "light_plus": "keyword.operator: #000000", - "dark_vs": "keyword.operator: #D4D4D4", - "light_vs": "keyword.operator: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword.operator: #D4D4D4" } }, @@ -2203,10 +2500,10 @@ "c": " ", "t": "source.powershell", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -2214,10 +2511,10 @@ "c": "'\"{0}\\Microsoft Visual Studio {1}\\VC\\vcvarsall.bat\" x64'", "t": "source.powershell string.quoted.single.powershell", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string: #A31515", - "dark_vs": "string: #CE9178", - "light_vs": "string: #A31515", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -2225,10 +2522,10 @@ "c": " ", "t": "source.powershell", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -2236,10 +2533,10 @@ "c": "-f", "t": "source.powershell keyword.operator.string-format.powershell", "r": { - "dark_plus": "keyword.operator: #D4D4D4", - "light_plus": "keyword.operator: #000000", - "dark_vs": "keyword.operator: #D4D4D4", - "light_vs": "keyword.operator: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword.operator: #D4D4D4" } }, @@ -2247,21 +2544,21 @@ "c": " ", "t": "source.powershell", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, { "c": "$", - "t": "source.powershell keyword.other.powershell", + "t": "source.powershell keyword.other.variable.definition.powershell", "r": { - "dark_plus": "keyword: #569CD6", - "light_plus": "keyword: #0000FF", - "dark_vs": "keyword: #569CD6", - "light_vs": "keyword: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword: #569CD6" } }, @@ -2269,10 +2566,10 @@ "c": "env:", "t": "source.powershell support.variable.drive.powershell", "r": { - "dark_plus": "support.variable: #9CDCFE", - "light_plus": "support.variable: #001080", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "support.variable: #9CDCFE" } }, @@ -2280,10 +2577,10 @@ "c": "ADXSDKProgramFiles", "t": "source.powershell variable.other.readwrite.powershell", "r": { - "dark_plus": "variable: #9CDCFE", - "light_plus": "variable: #001080", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "variable: #9CDCFE" } }, @@ -2291,10 +2588,10 @@ "c": ",", "t": "source.powershell keyword.operator.other.powershell", "r": { - "dark_plus": "keyword.operator: #D4D4D4", - "light_plus": "keyword.operator: #000000", - "dark_vs": "keyword.operator: #D4D4D4", - "light_vs": "keyword.operator: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword.operator: #D4D4D4" } }, @@ -2302,21 +2599,21 @@ "c": " ", "t": "source.powershell", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, { "c": "$", - "t": "source.powershell keyword.other.powershell", + "t": "source.powershell keyword.other.variable.definition.powershell", "r": { - "dark_plus": "keyword: #569CD6", - "light_plus": "keyword: #0000FF", - "dark_vs": "keyword: #569CD6", - "light_vs": "keyword: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword: #569CD6" } }, @@ -2324,10 +2621,10 @@ "c": "vsVersion", "t": "source.powershell variable.other.readwrite.powershell", "r": { - "dark_plus": "variable: #9CDCFE", - "light_plus": "variable: #001080", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "variable: #9CDCFE" } }, @@ -2335,10 +2632,10 @@ "c": ";", "t": "source.powershell keyword.other.statement-separator.powershell", "r": { - "dark_plus": "keyword: #569CD6", - "light_plus": "keyword: #0000FF", - "dark_vs": "keyword: #569CD6", - "light_vs": "keyword: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword: #569CD6" } }, @@ -2346,10 +2643,10 @@ "c": "Invoke-Environment", "t": "source.powershell support.function.powershell", "r": { - "dark_plus": "support.function: #DCDCAA", - "light_plus": "support.function: #795E26", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "support.function: #DCDCAA" } }, @@ -2357,10 +2654,10 @@ "c": " ", "t": "source.powershell", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -2368,10 +2665,10 @@ "c": "-", "t": "source.powershell keyword.operator.assignment.powershell", "r": { - "dark_plus": "keyword.operator: #D4D4D4", - "light_plus": "keyword.operator: #000000", - "dark_vs": "keyword.operator: #D4D4D4", - "light_vs": "keyword.operator: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword.operator: #D4D4D4" } }, @@ -2379,21 +2676,21 @@ "c": "Command ", "t": "source.powershell", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, { "c": "$", - "t": "source.powershell keyword.other.powershell", + "t": "source.powershell keyword.other.variable.definition.powershell", "r": { - "dark_plus": "keyword: #569CD6", - "light_plus": "keyword: #0000FF", - "dark_vs": "keyword: #569CD6", - "light_vs": "keyword: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword: #569CD6" } }, @@ -2401,10 +2698,10 @@ "c": "setVSEnv", "t": "source.powershell variable.other.readwrite.powershell", "r": { - "dark_plus": "variable: #9CDCFE", - "light_plus": "variable: #001080", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "variable: #9CDCFE" } }, @@ -2412,10 +2709,10 @@ "c": ";", "t": "source.powershell keyword.other.statement-separator.powershell", "r": { - "dark_plus": "keyword: #569CD6", - "light_plus": "keyword: #0000FF", - "dark_vs": "keyword: #569CD6", - "light_vs": "keyword: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword: #569CD6" } } diff --git a/extensions/python/package.json b/extensions/python/package.json index 648155758f..48151bd624 100644 --- a/extensions/python/package.json +++ b/extensions/python/package.json @@ -10,9 +10,9 @@ "contributes": { "languages": [{ "id": "python", - "extensions": [ ".py", ".rpy", ".pyw", ".cpy", ".gyp", ".gypi" ], + "extensions": [ ".py", ".rpy", ".pyw", ".cpy", ".gyp", ".gypi", ".snakefile", ".smk"], "aliases": [ "Python", "py" ], - "firstLine": "^#!/.*\\bpython[0-9.-]*\\b", + "firstLine": "^#!\\s*/.*\\bpython[0-9.-]*\\b", "configuration": "./language-configuration.json" }], "grammars": [{ diff --git a/extensions/python/test/colorize-results/test_py.json b/extensions/python/test/colorize-results/test_py.json index 235958f078..a5b9a133c7 100644 --- a/extensions/python/test/colorize-results/test_py.json +++ b/extensions/python/test/colorize-results/test_py.json @@ -3,10 +3,10 @@ "c": "from", "t": "source.python keyword.control.flow.python", "r": { - "dark_plus": "keyword.control: #C586C0", - "light_plus": "keyword.control: #AF00DB", - "dark_vs": "keyword.control: #569CD6", - "light_vs": "keyword.control: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword.control: #C586C0" } }, @@ -14,10 +14,10 @@ "c": " banana ", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -25,10 +25,10 @@ "c": "import", "t": "source.python keyword.control.import.python", "r": { - "dark_plus": "keyword.control: #C586C0", - "light_plus": "keyword.control: #AF00DB", - "dark_vs": "keyword.control: #569CD6", - "light_vs": "keyword.control: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword.control: #C586C0" } }, @@ -36,10 +36,10 @@ "c": " ", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -47,10 +47,10 @@ "c": "*", "t": "source.python keyword.operator.arithmetic.python", "r": { - "dark_plus": "keyword.operator: #D4D4D4", - "light_plus": "keyword.operator: #000000", - "dark_vs": "keyword.operator: #D4D4D4", - "light_vs": "keyword.operator: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword.operator: #D4D4D4" } }, @@ -58,10 +58,10 @@ "c": "class", "t": "source.python meta.class.python storage.type.class.python", "r": { - "dark_plus": "storage.type: #569CD6", - "light_plus": "storage.type: #0000FF", - "dark_vs": "storage.type: #569CD6", - "light_vs": "storage.type: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "storage.type: #569CD6" } }, @@ -69,10 +69,10 @@ "c": " ", "t": "source.python meta.class.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -80,10 +80,10 @@ "c": "Monkey", "t": "source.python meta.class.python entity.name.type.class.python", "r": { - "dark_plus": "entity.name.type: #4EC9B0", - "light_plus": "entity.name.type: #267F99", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "entity.name.type: #4EC9B0" } }, @@ -91,10 +91,10 @@ "c": ":", "t": "source.python meta.class.python punctuation.section.class.begin.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -102,10 +102,10 @@ "c": "\t", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -113,10 +113,10 @@ "c": "#", "t": "source.python comment.line.number-sign.python punctuation.definition.comment.python", "r": { - "dark_plus": "comment: #608B4E", - "light_plus": "comment: #008000", - "dark_vs": "comment: #608B4E", - "light_vs": "comment: #008000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "comment: #7CA668" } }, @@ -124,10 +124,10 @@ "c": " Bananas the monkey can eat.", "t": "source.python comment.line.number-sign.python", "r": { - "dark_plus": "comment: #608B4E", - "light_plus": "comment: #008000", - "dark_vs": "comment: #608B4E", - "light_vs": "comment: #008000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "comment: #7CA668" } }, @@ -135,10 +135,10 @@ "c": "\tcapacity ", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -146,10 +146,10 @@ "c": "=", "t": "source.python keyword.operator.assignment.python", "r": { - "dark_plus": "keyword.operator: #D4D4D4", - "light_plus": "keyword.operator: #000000", - "dark_vs": "keyword.operator: #D4D4D4", - "light_vs": "keyword.operator: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword.operator: #D4D4D4" } }, @@ -157,10 +157,10 @@ "c": " ", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -168,10 +168,10 @@ "c": "10", "t": "source.python constant.numeric.dec.python", "r": { - "dark_plus": "constant.numeric: #B5CEA8", - "light_plus": "constant.numeric: #09885A", - "dark_vs": "constant.numeric: #B5CEA8", - "light_vs": "constant.numeric: #09885A", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "constant.numeric: #B5CEA8" } }, @@ -179,10 +179,10 @@ "c": "\t", "t": "source.python meta.function.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -190,10 +190,10 @@ "c": "def", "t": "source.python meta.function.python storage.type.function.python", "r": { - "dark_plus": "storage.type: #569CD6", - "light_plus": "storage.type: #0000FF", - "dark_vs": "storage.type: #569CD6", - "light_vs": "storage.type: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "storage.type: #569CD6" } }, @@ -201,10 +201,10 @@ "c": " ", "t": "source.python meta.function.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -212,10 +212,10 @@ "c": "eat", "t": "source.python meta.function.python entity.name.function.python", "r": { - "dark_plus": "entity.name.function: #DCDCAA", - "light_plus": "entity.name.function: #795E26", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "entity.name.function: #DCDCAA" } }, @@ -223,10 +223,10 @@ "c": "(", "t": "source.python meta.function.python meta.function.parameters.python punctuation.definition.parameters.begin.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -234,10 +234,10 @@ "c": "self", "t": "source.python meta.function.python meta.function.parameters.python variable.parameter.function.language.python variable.parameter.function.language.special.self.python", "r": { - "dark_plus": "variable: #9CDCFE", - "light_plus": "variable: #001080", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "variable: #9CDCFE" } }, @@ -245,10 +245,10 @@ "c": ",", "t": "source.python meta.function.python meta.function.parameters.python punctuation.separator.parameters.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -256,10 +256,10 @@ "c": " ", "t": "source.python meta.function.python meta.function.parameters.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -267,10 +267,10 @@ "c": "N", "t": "source.python meta.function.python meta.function.parameters.python variable.parameter.function.language.python", "r": { - "dark_plus": "variable: #9CDCFE", - "light_plus": "variable: #001080", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "variable: #9CDCFE" } }, @@ -278,10 +278,10 @@ "c": ")", "t": "source.python meta.function.python meta.function.parameters.python punctuation.definition.parameters.end.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -289,10 +289,10 @@ "c": ":", "t": "source.python meta.function.python punctuation.section.function.begin.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -300,10 +300,10 @@ "c": "\t\t", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -311,10 +311,10 @@ "c": "'''", "t": "source.python string.quoted.docstring.multi.python punctuation.definition.string.begin.python", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string: #A31515", - "dark_vs": "string: #CE9178", - "light_vs": "string: #A31515", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -322,10 +322,10 @@ "c": "Make the monkey eat N bananas!", "t": "source.python string.quoted.docstring.multi.python", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string: #A31515", - "dark_vs": "string: #CE9178", - "light_vs": "string: #A31515", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -333,10 +333,10 @@ "c": "'''", "t": "source.python string.quoted.docstring.multi.python punctuation.definition.string.end.python", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string: #A31515", - "dark_vs": "string: #CE9178", - "light_vs": "string: #A31515", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -344,10 +344,10 @@ "c": "\t\tcapacity ", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -355,10 +355,10 @@ "c": "=", "t": "source.python keyword.operator.assignment.python", "r": { - "dark_plus": "keyword.operator: #D4D4D4", - "light_plus": "keyword.operator: #000000", - "dark_vs": "keyword.operator: #D4D4D4", - "light_vs": "keyword.operator: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword.operator: #D4D4D4" } }, @@ -366,10 +366,10 @@ "c": " capacity ", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -377,10 +377,10 @@ "c": "-", "t": "source.python keyword.operator.arithmetic.python", "r": { - "dark_plus": "keyword.operator: #D4D4D4", - "light_plus": "keyword.operator: #000000", - "dark_vs": "keyword.operator: #D4D4D4", - "light_vs": "keyword.operator: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword.operator: #D4D4D4" } }, @@ -388,10 +388,10 @@ "c": " N", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -399,10 +399,10 @@ "c": "*", "t": "source.python keyword.operator.arithmetic.python", "r": { - "dark_plus": "keyword.operator: #D4D4D4", - "light_plus": "keyword.operator: #000000", - "dark_vs": "keyword.operator: #D4D4D4", - "light_vs": "keyword.operator: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword.operator: #D4D4D4" } }, @@ -410,10 +410,10 @@ "c": "banana", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -421,10 +421,10 @@ "c": ".", "t": "source.python punctuation.separator.period.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -432,10 +432,10 @@ "c": "size", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -443,10 +443,10 @@ "c": "\t", "t": "source.python meta.function.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -454,10 +454,10 @@ "c": "def", "t": "source.python meta.function.python storage.type.function.python", "r": { - "dark_plus": "storage.type: #569CD6", - "light_plus": "storage.type: #0000FF", - "dark_vs": "storage.type: #569CD6", - "light_vs": "storage.type: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "storage.type: #569CD6" } }, @@ -465,10 +465,10 @@ "c": " ", "t": "source.python meta.function.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -476,10 +476,10 @@ "c": "feeding_frenzy", "t": "source.python meta.function.python entity.name.function.python", "r": { - "dark_plus": "entity.name.function: #DCDCAA", - "light_plus": "entity.name.function: #795E26", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "entity.name.function: #DCDCAA" } }, @@ -487,10 +487,10 @@ "c": "(", "t": "source.python meta.function.python meta.function.parameters.python punctuation.definition.parameters.begin.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -498,10 +498,10 @@ "c": "self", "t": "source.python meta.function.python meta.function.parameters.python variable.parameter.function.language.python variable.parameter.function.language.special.self.python", "r": { - "dark_plus": "variable: #9CDCFE", - "light_plus": "variable: #001080", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "variable: #9CDCFE" } }, @@ -509,10 +509,10 @@ "c": ")", "t": "source.python meta.function.python meta.function.parameters.python punctuation.definition.parameters.end.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -520,10 +520,10 @@ "c": ":", "t": "source.python meta.function.python punctuation.section.function.begin.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -531,10 +531,10 @@ "c": "\t\t", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -542,10 +542,10 @@ "c": "eat", "t": "source.python meta.function-call.python meta.function-call.generic.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -553,10 +553,10 @@ "c": "(", "t": "source.python meta.function-call.python punctuation.definition.arguments.begin.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -564,10 +564,10 @@ "c": "9.25", "t": "source.python meta.function-call.python meta.function-call.arguments.python constant.numeric.float.python", "r": { - "dark_plus": "constant.numeric: #B5CEA8", - "light_plus": "constant.numeric: #09885A", - "dark_vs": "constant.numeric: #B5CEA8", - "light_vs": "constant.numeric: #09885A", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "constant.numeric: #B5CEA8" } }, @@ -575,10 +575,10 @@ "c": ")", "t": "source.python meta.function-call.python punctuation.definition.arguments.end.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -586,10 +586,10 @@ "c": "\t\t", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -597,10 +597,10 @@ "c": "return", "t": "source.python keyword.control.flow.python", "r": { - "dark_plus": "keyword.control: #C586C0", - "light_plus": "keyword.control: #AF00DB", - "dark_vs": "keyword.control: #569CD6", - "light_vs": "keyword.control: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword.control: #C586C0" } }, @@ -608,10 +608,10 @@ "c": " ", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -619,10 +619,10 @@ "c": "\"", "t": "source.python string.quoted.single.python punctuation.definition.string.begin.python", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string: #A31515", - "dark_vs": "string: #CE9178", - "light_vs": "string: #A31515", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -630,10 +630,10 @@ "c": "Yum yum", "t": "source.python string.quoted.single.python", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string: #A31515", - "dark_vs": "string: #CE9178", - "light_vs": "string: #A31515", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -641,10 +641,10 @@ "c": "\"", "t": "source.python string.quoted.single.python punctuation.definition.string.end.python", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string: #A31515", - "dark_vs": "string: #CE9178", - "light_vs": "string: #A31515", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -652,10 +652,10 @@ "c": "\t", "t": "source.python meta.function.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -663,10 +663,10 @@ "c": "def", "t": "source.python meta.function.python storage.type.function.python", "r": { - "dark_plus": "storage.type: #569CD6", - "light_plus": "storage.type: #0000FF", - "dark_vs": "storage.type: #569CD6", - "light_vs": "storage.type: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "storage.type: #569CD6" } }, @@ -674,10 +674,10 @@ "c": " ", "t": "source.python meta.function.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -685,10 +685,10 @@ "c": "some_func", "t": "source.python meta.function.python entity.name.function.python", "r": { - "dark_plus": "entity.name.function: #DCDCAA", - "light_plus": "entity.name.function: #795E26", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "entity.name.function: #DCDCAA" } }, @@ -696,10 +696,10 @@ "c": "(", "t": "source.python meta.function.python meta.function.parameters.python punctuation.definition.parameters.begin.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -707,10 +707,10 @@ "c": "a", "t": "source.python meta.function.python meta.function.parameters.python variable.parameter.function.language.python", "r": { - "dark_plus": "variable: #9CDCFE", - "light_plus": "variable: #001080", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "variable: #9CDCFE" } }, @@ -718,10 +718,10 @@ "c": ":", "t": "source.python meta.function.python meta.function.parameters.python punctuation.separator.annotation.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -729,10 +729,10 @@ "c": "\t\t\t\t\t", "t": "source.python meta.function.python meta.function.parameters.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -740,10 +740,10 @@ "c": "lambda", "t": "source.python meta.function.python meta.function.parameters.python meta.lambda-function.python storage.type.function.lambda.python", "r": { - "dark_plus": "storage.type: #569CD6", - "light_plus": "storage.type: #0000FF", - "dark_vs": "storage.type: #569CD6", - "light_vs": "storage.type: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "storage.type: #569CD6" } }, @@ -751,10 +751,10 @@ "c": " ", "t": "source.python meta.function.python meta.function.parameters.python meta.lambda-function.python meta.function.lambda.parameters.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -762,10 +762,10 @@ "c": "x", "t": "source.python meta.function.python meta.function.parameters.python meta.lambda-function.python meta.function.lambda.parameters.python variable.parameter.function.language.python", "r": { - "dark_plus": "variable: #9CDCFE", - "light_plus": "variable: #001080", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "variable: #9CDCFE" } }, @@ -773,10 +773,10 @@ "c": "=", "t": "source.python meta.function.python meta.function.parameters.python meta.lambda-function.python meta.function.lambda.parameters.python keyword.operator.python", "r": { - "dark_plus": "keyword.operator: #D4D4D4", - "light_plus": "keyword.operator: #000000", - "dark_vs": "keyword.operator: #D4D4D4", - "light_vs": "keyword.operator: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword.operator: #D4D4D4" } }, @@ -784,10 +784,10 @@ "c": "None", "t": "source.python meta.function.python meta.function.parameters.python meta.lambda-function.python meta.function.lambda.parameters.python constant.language.python", "r": { - "dark_plus": "constant.language: #569CD6", - "light_plus": "constant.language: #0000FF", - "dark_vs": "constant.language: #569CD6", - "light_vs": "constant.language: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "constant.language: #569CD6" } }, @@ -795,10 +795,10 @@ "c": ":", "t": "source.python meta.function.python meta.function.parameters.python meta.lambda-function.python punctuation.section.function.lambda.begin.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -806,10 +806,10 @@ "c": "\t\t\t\t\t", "t": "source.python meta.function.python meta.function.parameters.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -817,10 +817,10 @@ "c": "{", "t": "source.python meta.function.python meta.function.parameters.python punctuation.definition.dict.begin.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -828,10 +828,10 @@ "c": "key", "t": "source.python meta.function.python meta.function.parameters.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -839,10 +839,10 @@ "c": ":", "t": "source.python meta.function.python meta.function.parameters.python punctuation.separator.dict.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -850,10 +850,10 @@ "c": " val", "t": "source.python meta.function.python meta.function.parameters.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -861,10 +861,10 @@ "c": "\t\t\t\t\t\t", "t": "source.python meta.function.python meta.function.parameters.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -872,10 +872,10 @@ "c": "for", "t": "source.python meta.function.python meta.function.parameters.python keyword.control.flow.python", "r": { - "dark_plus": "keyword.control: #C586C0", - "light_plus": "keyword.control: #AF00DB", - "dark_vs": "keyword.control: #569CD6", - "light_vs": "keyword.control: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword.control: #C586C0" } }, @@ -883,10 +883,10 @@ "c": " key", "t": "source.python meta.function.python meta.function.parameters.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -894,10 +894,10 @@ "c": ",", "t": "source.python meta.function.python meta.function.parameters.python punctuation.separator.element.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -905,10 +905,10 @@ "c": " val ", "t": "source.python meta.function.python meta.function.parameters.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -916,10 +916,10 @@ "c": "in", "t": "source.python meta.function.python meta.function.parameters.python keyword.operator.logical.python", "r": { - "dark_plus": "keyword.operator.logical.python: #569CD6", - "light_plus": "keyword.operator.logical.python: #0000FF", - "dark_vs": "keyword.operator.logical.python: #569CD6", - "light_vs": "keyword.operator.logical.python: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword.operator.logical.python: #569CD6" } }, @@ -927,10 +927,10 @@ "c": "\t\t\t\t\t\t\t", "t": "source.python meta.function.python meta.function.parameters.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -938,10 +938,10 @@ "c": "(", "t": "source.python meta.function.python meta.function.parameters.python punctuation.parenthesis.begin.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -949,10 +949,10 @@ "c": "x ", "t": "source.python meta.function.python meta.function.parameters.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -960,10 +960,10 @@ "c": "if", "t": "source.python meta.function.python meta.function.parameters.python keyword.control.flow.python", "r": { - "dark_plus": "keyword.control: #C586C0", - "light_plus": "keyword.control: #AF00DB", - "dark_vs": "keyword.control: #569CD6", - "light_vs": "keyword.control: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword.control: #C586C0" } }, @@ -971,10 +971,10 @@ "c": " x ", "t": "source.python meta.function.python meta.function.parameters.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -982,10 +982,10 @@ "c": "is", "t": "source.python meta.function.python meta.function.parameters.python keyword.operator.logical.python", "r": { - "dark_plus": "keyword.operator.logical.python: #569CD6", - "light_plus": "keyword.operator.logical.python: #0000FF", - "dark_vs": "keyword.operator.logical.python: #569CD6", - "light_vs": "keyword.operator.logical.python: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword.operator.logical.python: #569CD6" } }, @@ -993,10 +993,10 @@ "c": " ", "t": "source.python meta.function.python meta.function.parameters.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1004,10 +1004,10 @@ "c": "not", "t": "source.python meta.function.python meta.function.parameters.python keyword.operator.logical.python", "r": { - "dark_plus": "keyword.operator.logical.python: #569CD6", - "light_plus": "keyword.operator.logical.python: #0000FF", - "dark_vs": "keyword.operator.logical.python: #569CD6", - "light_vs": "keyword.operator.logical.python: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword.operator.logical.python: #569CD6" } }, @@ -1015,10 +1015,10 @@ "c": " ", "t": "source.python meta.function.python meta.function.parameters.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1026,10 +1026,10 @@ "c": "None", "t": "source.python meta.function.python meta.function.parameters.python constant.language.python", "r": { - "dark_plus": "constant.language: #569CD6", - "light_plus": "constant.language: #0000FF", - "dark_vs": "constant.language: #569CD6", - "light_vs": "constant.language: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "constant.language: #569CD6" } }, @@ -1037,10 +1037,10 @@ "c": " ", "t": "source.python meta.function.python meta.function.parameters.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1048,10 +1048,10 @@ "c": "else", "t": "source.python meta.function.python meta.function.parameters.python keyword.control.flow.python", "r": { - "dark_plus": "keyword.control: #C586C0", - "light_plus": "keyword.control: #AF00DB", - "dark_vs": "keyword.control: #569CD6", - "light_vs": "keyword.control: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword.control: #C586C0" } }, @@ -1059,10 +1059,10 @@ "c": " ", "t": "source.python meta.function.python meta.function.parameters.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1070,10 +1070,10 @@ "c": "[", "t": "source.python meta.function.python meta.function.parameters.python punctuation.definition.list.begin.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1081,10 +1081,10 @@ "c": "]", "t": "source.python meta.function.python meta.function.parameters.python punctuation.definition.list.end.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1092,10 +1092,10 @@ "c": ")", "t": "source.python meta.function.python meta.function.parameters.python punctuation.parenthesis.end.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1103,10 +1103,10 @@ "c": "\t\t\t\t\t", "t": "source.python meta.function.python meta.function.parameters.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1114,10 +1114,10 @@ "c": "}", "t": "source.python meta.function.python meta.function.parameters.python punctuation.definition.dict.end.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1125,10 +1125,10 @@ "c": "=", "t": "source.python meta.function.python meta.function.parameters.python keyword.operator.assignment.python", "r": { - "dark_plus": "keyword.operator: #D4D4D4", - "light_plus": "keyword.operator: #000000", - "dark_vs": "keyword.operator: #D4D4D4", - "light_vs": "keyword.operator: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword.operator: #D4D4D4" } }, @@ -1136,10 +1136,10 @@ "c": "42", "t": "source.python meta.function.python meta.function.parameters.python constant.numeric.dec.python", "r": { - "dark_plus": "constant.numeric: #B5CEA8", - "light_plus": "constant.numeric: #09885A", - "dark_vs": "constant.numeric: #B5CEA8", - "light_vs": "constant.numeric: #09885A", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "constant.numeric: #B5CEA8" } }, @@ -1147,10 +1147,10 @@ "c": ")", "t": "source.python meta.function.python meta.function.parameters.python punctuation.definition.parameters.end.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1158,10 +1158,10 @@ "c": ":", "t": "source.python meta.function.python punctuation.section.function.begin.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1169,10 +1169,10 @@ "c": "\t\t", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1180,10 +1180,10 @@ "c": "pass", "t": "source.python keyword.control.flow.python", "r": { - "dark_plus": "keyword.control: #C586C0", - "light_plus": "keyword.control: #AF00DB", - "dark_vs": "keyword.control: #569CD6", - "light_vs": "keyword.control: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword.control: #C586C0" } }, @@ -1191,10 +1191,10 @@ "c": "if", "t": "source.python keyword.control.flow.python", "r": { - "dark_plus": "keyword.control: #C586C0", - "light_plus": "keyword.control: #AF00DB", - "dark_vs": "keyword.control: #569CD6", - "light_vs": "keyword.control: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword.control: #C586C0" } }, @@ -1202,10 +1202,10 @@ "c": " ", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1213,10 +1213,10 @@ "c": "1900", "t": "source.python constant.numeric.dec.python", "r": { - "dark_plus": "constant.numeric: #B5CEA8", - "light_plus": "constant.numeric: #09885A", - "dark_vs": "constant.numeric: #B5CEA8", - "light_vs": "constant.numeric: #09885A", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "constant.numeric: #B5CEA8" } }, @@ -1224,10 +1224,10 @@ "c": " ", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1235,10 +1235,10 @@ "c": "<", "t": "source.python keyword.operator.comparison.python", "r": { - "dark_plus": "keyword.operator: #D4D4D4", - "light_plus": "keyword.operator: #000000", - "dark_vs": "keyword.operator: #D4D4D4", - "light_vs": "keyword.operator: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword.operator: #D4D4D4" } }, @@ -1246,10 +1246,10 @@ "c": " year ", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1257,10 +1257,10 @@ "c": "<", "t": "source.python keyword.operator.comparison.python", "r": { - "dark_plus": "keyword.operator: #D4D4D4", - "light_plus": "keyword.operator: #000000", - "dark_vs": "keyword.operator: #D4D4D4", - "light_vs": "keyword.operator: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword.operator: #D4D4D4" } }, @@ -1268,10 +1268,10 @@ "c": " ", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1279,10 +1279,10 @@ "c": "2100", "t": "source.python constant.numeric.dec.python", "r": { - "dark_plus": "constant.numeric: #B5CEA8", - "light_plus": "constant.numeric: #09885A", - "dark_vs": "constant.numeric: #B5CEA8", - "light_vs": "constant.numeric: #09885A", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "constant.numeric: #B5CEA8" } }, @@ -1290,10 +1290,10 @@ "c": " ", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1301,10 +1301,10 @@ "c": "and", "t": "source.python keyword.operator.logical.python", "r": { - "dark_plus": "keyword.operator.logical.python: #569CD6", - "light_plus": "keyword.operator.logical.python: #0000FF", - "dark_vs": "keyword.operator.logical.python: #569CD6", - "light_vs": "keyword.operator.logical.python: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword.operator.logical.python: #569CD6" } }, @@ -1312,10 +1312,10 @@ "c": " ", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1323,10 +1323,10 @@ "c": "1", "t": "source.python constant.numeric.dec.python", "r": { - "dark_plus": "constant.numeric: #B5CEA8", - "light_plus": "constant.numeric: #09885A", - "dark_vs": "constant.numeric: #B5CEA8", - "light_vs": "constant.numeric: #09885A", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "constant.numeric: #B5CEA8" } }, @@ -1334,10 +1334,10 @@ "c": " ", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1345,10 +1345,10 @@ "c": "<=", "t": "source.python keyword.operator.comparison.python", "r": { - "dark_plus": "keyword.operator: #D4D4D4", - "light_plus": "keyword.operator: #000000", - "dark_vs": "keyword.operator: #D4D4D4", - "light_vs": "keyword.operator: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword.operator: #D4D4D4" } }, @@ -1356,10 +1356,10 @@ "c": " month ", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1367,10 +1367,10 @@ "c": "<=", "t": "source.python keyword.operator.comparison.python", "r": { - "dark_plus": "keyword.operator: #D4D4D4", - "light_plus": "keyword.operator: #000000", - "dark_vs": "keyword.operator: #D4D4D4", - "light_vs": "keyword.operator: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword.operator: #D4D4D4" } }, @@ -1378,10 +1378,10 @@ "c": " ", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1389,10 +1389,10 @@ "c": "12", "t": "source.python constant.numeric.dec.python", "r": { - "dark_plus": "constant.numeric: #B5CEA8", - "light_plus": "constant.numeric: #09885A", - "dark_vs": "constant.numeric: #B5CEA8", - "light_vs": "constant.numeric: #09885A", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "constant.numeric: #B5CEA8" } }, @@ -1400,10 +1400,10 @@ "c": " ", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1411,10 +1411,10 @@ "c": "\\", "t": "source.python punctuation.separator.continuation.line.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1422,10 +1422,10 @@ "c": " ", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1433,10 +1433,10 @@ "c": "and", "t": "source.python keyword.operator.logical.python", "r": { - "dark_plus": "keyword.operator.logical.python: #569CD6", - "light_plus": "keyword.operator.logical.python: #0000FF", - "dark_vs": "keyword.operator.logical.python: #569CD6", - "light_vs": "keyword.operator.logical.python: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword.operator.logical.python: #569CD6" } }, @@ -1444,10 +1444,10 @@ "c": " ", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1455,10 +1455,10 @@ "c": "1", "t": "source.python constant.numeric.dec.python", "r": { - "dark_plus": "constant.numeric: #B5CEA8", - "light_plus": "constant.numeric: #09885A", - "dark_vs": "constant.numeric: #B5CEA8", - "light_vs": "constant.numeric: #09885A", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "constant.numeric: #B5CEA8" } }, @@ -1466,10 +1466,10 @@ "c": " ", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1477,10 +1477,10 @@ "c": "<=", "t": "source.python keyword.operator.comparison.python", "r": { - "dark_plus": "keyword.operator: #D4D4D4", - "light_plus": "keyword.operator: #000000", - "dark_vs": "keyword.operator: #D4D4D4", - "light_vs": "keyword.operator: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword.operator: #D4D4D4" } }, @@ -1488,10 +1488,10 @@ "c": " day ", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1499,10 +1499,10 @@ "c": "<=", "t": "source.python keyword.operator.comparison.python", "r": { - "dark_plus": "keyword.operator: #D4D4D4", - "light_plus": "keyword.operator: #000000", - "dark_vs": "keyword.operator: #D4D4D4", - "light_vs": "keyword.operator: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword.operator: #D4D4D4" } }, @@ -1510,10 +1510,10 @@ "c": " ", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1521,10 +1521,10 @@ "c": "31", "t": "source.python constant.numeric.dec.python", "r": { - "dark_plus": "constant.numeric: #B5CEA8", - "light_plus": "constant.numeric: #09885A", - "dark_vs": "constant.numeric: #B5CEA8", - "light_vs": "constant.numeric: #09885A", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "constant.numeric: #B5CEA8" } }, @@ -1532,10 +1532,10 @@ "c": " ", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1543,10 +1543,10 @@ "c": "and", "t": "source.python keyword.operator.logical.python", "r": { - "dark_plus": "keyword.operator.logical.python: #569CD6", - "light_plus": "keyword.operator.logical.python: #0000FF", - "dark_vs": "keyword.operator.logical.python: #569CD6", - "light_vs": "keyword.operator.logical.python: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword.operator.logical.python: #569CD6" } }, @@ -1554,10 +1554,10 @@ "c": " ", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1565,10 +1565,10 @@ "c": "0", "t": "source.python constant.numeric.dec.python", "r": { - "dark_plus": "constant.numeric: #B5CEA8", - "light_plus": "constant.numeric: #09885A", - "dark_vs": "constant.numeric: #B5CEA8", - "light_vs": "constant.numeric: #09885A", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "constant.numeric: #B5CEA8" } }, @@ -1576,10 +1576,10 @@ "c": " ", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1587,10 +1587,10 @@ "c": "<=", "t": "source.python keyword.operator.comparison.python", "r": { - "dark_plus": "keyword.operator: #D4D4D4", - "light_plus": "keyword.operator: #000000", - "dark_vs": "keyword.operator: #D4D4D4", - "light_vs": "keyword.operator: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword.operator: #D4D4D4" } }, @@ -1598,10 +1598,10 @@ "c": " hour ", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1609,10 +1609,10 @@ "c": "<", "t": "source.python keyword.operator.comparison.python", "r": { - "dark_plus": "keyword.operator: #D4D4D4", - "light_plus": "keyword.operator: #000000", - "dark_vs": "keyword.operator: #D4D4D4", - "light_vs": "keyword.operator: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword.operator: #D4D4D4" } }, @@ -1620,10 +1620,10 @@ "c": " ", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1631,10 +1631,10 @@ "c": "24", "t": "source.python constant.numeric.dec.python", "r": { - "dark_plus": "constant.numeric: #B5CEA8", - "light_plus": "constant.numeric: #09885A", - "dark_vs": "constant.numeric: #B5CEA8", - "light_vs": "constant.numeric: #09885A", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "constant.numeric: #B5CEA8" } }, @@ -1642,10 +1642,10 @@ "c": " ", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1653,10 +1653,10 @@ "c": "\\", "t": "source.python punctuation.separator.continuation.line.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1664,10 +1664,10 @@ "c": " ", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1675,10 +1675,10 @@ "c": "and", "t": "source.python keyword.operator.logical.python", "r": { - "dark_plus": "keyword.operator.logical.python: #569CD6", - "light_plus": "keyword.operator.logical.python: #0000FF", - "dark_vs": "keyword.operator.logical.python: #569CD6", - "light_vs": "keyword.operator.logical.python: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword.operator.logical.python: #569CD6" } }, @@ -1686,10 +1686,10 @@ "c": " ", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1697,10 +1697,10 @@ "c": "0", "t": "source.python constant.numeric.dec.python", "r": { - "dark_plus": "constant.numeric: #B5CEA8", - "light_plus": "constant.numeric: #09885A", - "dark_vs": "constant.numeric: #B5CEA8", - "light_vs": "constant.numeric: #09885A", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "constant.numeric: #B5CEA8" } }, @@ -1708,10 +1708,10 @@ "c": " ", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1719,10 +1719,10 @@ "c": "<=", "t": "source.python keyword.operator.comparison.python", "r": { - "dark_plus": "keyword.operator: #D4D4D4", - "light_plus": "keyword.operator: #000000", - "dark_vs": "keyword.operator: #D4D4D4", - "light_vs": "keyword.operator: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword.operator: #D4D4D4" } }, @@ -1730,10 +1730,10 @@ "c": " minute ", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1741,10 +1741,10 @@ "c": "<", "t": "source.python keyword.operator.comparison.python", "r": { - "dark_plus": "keyword.operator: #D4D4D4", - "light_plus": "keyword.operator: #000000", - "dark_vs": "keyword.operator: #D4D4D4", - "light_vs": "keyword.operator: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword.operator: #D4D4D4" } }, @@ -1752,10 +1752,10 @@ "c": " ", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1763,10 +1763,10 @@ "c": "60", "t": "source.python constant.numeric.dec.python", "r": { - "dark_plus": "constant.numeric: #B5CEA8", - "light_plus": "constant.numeric: #09885A", - "dark_vs": "constant.numeric: #B5CEA8", - "light_vs": "constant.numeric: #09885A", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "constant.numeric: #B5CEA8" } }, @@ -1774,10 +1774,10 @@ "c": " ", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1785,10 +1785,10 @@ "c": "and", "t": "source.python keyword.operator.logical.python", "r": { - "dark_plus": "keyword.operator.logical.python: #569CD6", - "light_plus": "keyword.operator.logical.python: #0000FF", - "dark_vs": "keyword.operator.logical.python: #569CD6", - "light_vs": "keyword.operator.logical.python: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword.operator.logical.python: #569CD6" } }, @@ -1796,10 +1796,10 @@ "c": " ", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1807,10 +1807,10 @@ "c": "0", "t": "source.python constant.numeric.dec.python", "r": { - "dark_plus": "constant.numeric: #B5CEA8", - "light_plus": "constant.numeric: #09885A", - "dark_vs": "constant.numeric: #B5CEA8", - "light_vs": "constant.numeric: #09885A", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "constant.numeric: #B5CEA8" } }, @@ -1818,10 +1818,10 @@ "c": " ", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1829,10 +1829,10 @@ "c": "<=", "t": "source.python keyword.operator.comparison.python", "r": { - "dark_plus": "keyword.operator: #D4D4D4", - "light_plus": "keyword.operator: #000000", - "dark_vs": "keyword.operator: #D4D4D4", - "light_vs": "keyword.operator: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword.operator: #D4D4D4" } }, @@ -1840,10 +1840,10 @@ "c": " second ", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1851,10 +1851,10 @@ "c": "<", "t": "source.python keyword.operator.comparison.python", "r": { - "dark_plus": "keyword.operator: #D4D4D4", - "light_plus": "keyword.operator: #000000", - "dark_vs": "keyword.operator: #D4D4D4", - "light_vs": "keyword.operator: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword.operator: #D4D4D4" } }, @@ -1862,10 +1862,10 @@ "c": " ", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1873,10 +1873,10 @@ "c": "60", "t": "source.python constant.numeric.dec.python", "r": { - "dark_plus": "constant.numeric: #B5CEA8", - "light_plus": "constant.numeric: #09885A", - "dark_vs": "constant.numeric: #B5CEA8", - "light_vs": "constant.numeric: #09885A", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "constant.numeric: #B5CEA8" } }, @@ -1884,10 +1884,10 @@ "c": ":", "t": "source.python punctuation.separator.colon.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1895,10 +1895,10 @@ "c": " ", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1906,10 +1906,10 @@ "c": "#", "t": "source.python comment.line.number-sign.python punctuation.definition.comment.python", "r": { - "dark_plus": "comment: #608B4E", - "light_plus": "comment: #008000", - "dark_vs": "comment: #608B4E", - "light_vs": "comment: #008000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "comment: #7CA668" } }, @@ -1917,10 +1917,10 @@ "c": " Looks like a valid date", "t": "source.python comment.line.number-sign.python", "r": { - "dark_plus": "comment: #608B4E", - "light_plus": "comment: #008000", - "dark_vs": "comment: #608B4E", - "light_vs": "comment: #008000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "comment: #7CA668" } }, @@ -1928,10 +1928,10 @@ "c": " ", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1939,10 +1939,10 @@ "c": "return", "t": "source.python keyword.control.flow.python", "r": { - "dark_plus": "keyword.control: #C586C0", - "light_plus": "keyword.control: #AF00DB", - "dark_vs": "keyword.control: #569CD6", - "light_vs": "keyword.control: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword.control: #C586C0" } }, @@ -1950,10 +1950,10 @@ "c": " ", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1961,10 +1961,10 @@ "c": "1", "t": "source.python constant.numeric.dec.python", "r": { - "dark_plus": "constant.numeric: #B5CEA8", - "light_plus": "constant.numeric: #09885A", - "dark_vs": "constant.numeric: #B5CEA8", - "light_vs": "constant.numeric: #09885A", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "constant.numeric: #B5CEA8" } }, @@ -1972,10 +1972,10 @@ "c": "def", "t": "source.python meta.function.python storage.type.function.python", "r": { - "dark_plus": "storage.type: #569CD6", - "light_plus": "storage.type: #0000FF", - "dark_vs": "storage.type: #569CD6", - "light_vs": "storage.type: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "storage.type: #569CD6" } }, @@ -1983,10 +1983,10 @@ "c": " ", "t": "source.python meta.function.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1994,10 +1994,10 @@ "c": "firstn", "t": "source.python meta.function.python entity.name.function.python", "r": { - "dark_plus": "entity.name.function: #DCDCAA", - "light_plus": "entity.name.function: #795E26", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "entity.name.function: #DCDCAA" } }, @@ -2005,10 +2005,10 @@ "c": "(", "t": "source.python meta.function.python meta.function.parameters.python punctuation.definition.parameters.begin.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -2016,10 +2016,10 @@ "c": "g", "t": "source.python meta.function.python meta.function.parameters.python variable.parameter.function.language.python", "r": { - "dark_plus": "variable: #9CDCFE", - "light_plus": "variable: #001080", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "variable: #9CDCFE" } }, @@ -2027,10 +2027,10 @@ "c": ",", "t": "source.python meta.function.python meta.function.parameters.python punctuation.separator.parameters.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -2038,10 +2038,10 @@ "c": " ", "t": "source.python meta.function.python meta.function.parameters.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -2049,10 +2049,10 @@ "c": "n", "t": "source.python meta.function.python meta.function.parameters.python variable.parameter.function.language.python", "r": { - "dark_plus": "variable: #9CDCFE", - "light_plus": "variable: #001080", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "variable: #9CDCFE" } }, @@ -2060,10 +2060,10 @@ "c": ")", "t": "source.python meta.function.python meta.function.parameters.python punctuation.definition.parameters.end.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -2071,10 +2071,10 @@ "c": ":", "t": "source.python meta.function.python punctuation.section.function.begin.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -2082,10 +2082,10 @@ "c": "\t", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -2093,10 +2093,10 @@ "c": "for", "t": "source.python keyword.control.flow.python", "r": { - "dark_plus": "keyword.control: #C586C0", - "light_plus": "keyword.control: #AF00DB", - "dark_vs": "keyword.control: #569CD6", - "light_vs": "keyword.control: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword.control: #C586C0" } }, @@ -2104,10 +2104,10 @@ "c": " i ", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -2115,10 +2115,10 @@ "c": "in", "t": "source.python keyword.operator.logical.python", "r": { - "dark_plus": "keyword.operator.logical.python: #569CD6", - "light_plus": "keyword.operator.logical.python: #0000FF", - "dark_vs": "keyword.operator.logical.python: #569CD6", - "light_vs": "keyword.operator.logical.python: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword.operator.logical.python: #569CD6" } }, @@ -2126,10 +2126,10 @@ "c": " ", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -2137,10 +2137,10 @@ "c": "range", "t": "source.python meta.function-call.python support.function.builtin.python", "r": { - "dark_plus": "support.function: #DCDCAA", - "light_plus": "support.function: #795E26", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "support.function: #DCDCAA" } }, @@ -2148,10 +2148,10 @@ "c": "(", "t": "source.python meta.function-call.python punctuation.definition.arguments.begin.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -2159,10 +2159,10 @@ "c": "n", "t": "source.python meta.function-call.python meta.function-call.arguments.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -2170,10 +2170,10 @@ "c": ")", "t": "source.python meta.function-call.python punctuation.definition.arguments.end.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -2181,10 +2181,10 @@ "c": ":", "t": "source.python punctuation.separator.colon.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -2192,10 +2192,10 @@ "c": "\t\t", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -2203,10 +2203,10 @@ "c": "yield", "t": "source.python keyword.control.flow.python", "r": { - "dark_plus": "keyword.control: #C586C0", - "light_plus": "keyword.control: #AF00DB", - "dark_vs": "keyword.control: #569CD6", - "light_vs": "keyword.control: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword.control: #C586C0" } }, @@ -2214,10 +2214,10 @@ "c": " g", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -2225,10 +2225,10 @@ "c": ".", "t": "source.python punctuation.separator.period.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -2236,10 +2236,10 @@ "c": "next", "t": "source.python meta.function-call.python meta.function-call.generic.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -2247,10 +2247,10 @@ "c": "(", "t": "source.python meta.function-call.python punctuation.definition.arguments.begin.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -2258,10 +2258,10 @@ "c": ")", "t": "source.python meta.function-call.python punctuation.definition.arguments.end.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -2269,10 +2269,10 @@ "c": "reduce", "t": "source.python meta.function-call.python variable.legacy.builtin.python", "r": { - "dark_plus": "variable: #9CDCFE", - "light_plus": "variable: #001080", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "variable: #9CDCFE" } }, @@ -2280,10 +2280,10 @@ "c": "(", "t": "source.python meta.function-call.python punctuation.definition.arguments.begin.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -2291,10 +2291,10 @@ "c": "lambda", "t": "source.python meta.function-call.python meta.function-call.arguments.python meta.lambda-function.python storage.type.function.lambda.python", "r": { - "dark_plus": "storage.type: #569CD6", - "light_plus": "storage.type: #0000FF", - "dark_vs": "storage.type: #569CD6", - "light_vs": "storage.type: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "storage.type: #569CD6" } }, @@ -2302,10 +2302,10 @@ "c": " ", "t": "source.python meta.function-call.python meta.function-call.arguments.python meta.lambda-function.python meta.function.lambda.parameters.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -2313,10 +2313,10 @@ "c": "x", "t": "source.python meta.function-call.python meta.function-call.arguments.python meta.lambda-function.python meta.function.lambda.parameters.python variable.parameter.function.language.python", "r": { - "dark_plus": "variable: #9CDCFE", - "light_plus": "variable: #001080", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "variable: #9CDCFE" } }, @@ -2324,10 +2324,10 @@ "c": ",", "t": "source.python meta.function-call.python meta.function-call.arguments.python meta.lambda-function.python meta.function.lambda.parameters.python punctuation.separator.parameters.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -2335,10 +2335,10 @@ "c": "y", "t": "source.python meta.function-call.python meta.function-call.arguments.python meta.lambda-function.python meta.function.lambda.parameters.python variable.parameter.function.language.python", "r": { - "dark_plus": "variable: #9CDCFE", - "light_plus": "variable: #001080", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "variable: #9CDCFE" } }, @@ -2346,10 +2346,10 @@ "c": ":", "t": "source.python meta.function-call.python meta.function-call.arguments.python meta.lambda-function.python punctuation.section.function.lambda.begin.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -2357,10 +2357,10 @@ "c": " x", "t": "source.python meta.function-call.python meta.function-call.arguments.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -2368,10 +2368,10 @@ "c": "+", "t": "source.python meta.function-call.python meta.function-call.arguments.python keyword.operator.arithmetic.python", "r": { - "dark_plus": "keyword.operator: #D4D4D4", - "light_plus": "keyword.operator: #000000", - "dark_vs": "keyword.operator: #D4D4D4", - "light_vs": "keyword.operator: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword.operator: #D4D4D4" } }, @@ -2379,10 +2379,10 @@ "c": "y", "t": "source.python meta.function-call.python meta.function-call.arguments.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -2390,10 +2390,10 @@ "c": ",", "t": "source.python meta.function-call.python meta.function-call.arguments.python punctuation.separator.arguments.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -2401,10 +2401,10 @@ "c": " ", "t": "source.python meta.function-call.python meta.function-call.arguments.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -2412,10 +2412,10 @@ "c": "[", "t": "source.python meta.function-call.python meta.function-call.arguments.python punctuation.definition.list.begin.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -2423,10 +2423,10 @@ "c": "47", "t": "source.python meta.function-call.python meta.function-call.arguments.python constant.numeric.dec.python", "r": { - "dark_plus": "constant.numeric: #B5CEA8", - "light_plus": "constant.numeric: #09885A", - "dark_vs": "constant.numeric: #B5CEA8", - "light_vs": "constant.numeric: #09885A", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "constant.numeric: #B5CEA8" } }, @@ -2434,10 +2434,10 @@ "c": ",", "t": "source.python meta.function-call.python meta.function-call.arguments.python punctuation.separator.element.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -2445,10 +2445,10 @@ "c": "11", "t": "source.python meta.function-call.python meta.function-call.arguments.python constant.numeric.dec.python", "r": { - "dark_plus": "constant.numeric: #B5CEA8", - "light_plus": "constant.numeric: #09885A", - "dark_vs": "constant.numeric: #B5CEA8", - "light_vs": "constant.numeric: #09885A", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "constant.numeric: #B5CEA8" } }, @@ -2456,10 +2456,10 @@ "c": ",", "t": "source.python meta.function-call.python meta.function-call.arguments.python punctuation.separator.element.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -2467,10 +2467,10 @@ "c": "42", "t": "source.python meta.function-call.python meta.function-call.arguments.python constant.numeric.dec.python", "r": { - "dark_plus": "constant.numeric: #B5CEA8", - "light_plus": "constant.numeric: #09885A", - "dark_vs": "constant.numeric: #B5CEA8", - "light_vs": "constant.numeric: #09885A", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "constant.numeric: #B5CEA8" } }, @@ -2478,10 +2478,10 @@ "c": ",", "t": "source.python meta.function-call.python meta.function-call.arguments.python punctuation.separator.element.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -2489,10 +2489,10 @@ "c": "13", "t": "source.python meta.function-call.python meta.function-call.arguments.python constant.numeric.dec.python", "r": { - "dark_plus": "constant.numeric: #B5CEA8", - "light_plus": "constant.numeric: #09885A", - "dark_vs": "constant.numeric: #B5CEA8", - "light_vs": "constant.numeric: #09885A", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "constant.numeric: #B5CEA8" } }, @@ -2500,10 +2500,10 @@ "c": "]", "t": "source.python meta.function-call.python meta.function-call.arguments.python punctuation.definition.list.end.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -2511,10 +2511,10 @@ "c": ")", "t": "source.python meta.function-call.python punctuation.definition.arguments.end.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -2522,10 +2522,10 @@ "c": "woerter ", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -2533,10 +2533,10 @@ "c": "=", "t": "source.python keyword.operator.assignment.python", "r": { - "dark_plus": "keyword.operator: #D4D4D4", - "light_plus": "keyword.operator: #000000", - "dark_vs": "keyword.operator: #D4D4D4", - "light_vs": "keyword.operator: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword.operator: #D4D4D4" } }, @@ -2544,10 +2544,10 @@ "c": " ", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -2555,10 +2555,10 @@ "c": "{", "t": "source.python punctuation.definition.dict.begin.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -2566,10 +2566,10 @@ "c": "\"", "t": "source.python string.quoted.single.python punctuation.definition.string.begin.python", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string: #A31515", - "dark_vs": "string: #CE9178", - "light_vs": "string: #A31515", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -2577,10 +2577,10 @@ "c": "house", "t": "source.python string.quoted.single.python", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string: #A31515", - "dark_vs": "string: #CE9178", - "light_vs": "string: #A31515", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -2588,10 +2588,10 @@ "c": "\"", "t": "source.python string.quoted.single.python punctuation.definition.string.end.python", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string: #A31515", - "dark_vs": "string: #CE9178", - "light_vs": "string: #A31515", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -2599,10 +2599,10 @@ "c": " ", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -2610,10 +2610,10 @@ "c": ":", "t": "source.python punctuation.separator.dict.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -2621,10 +2621,10 @@ "c": " ", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -2632,10 +2632,10 @@ "c": "\"", "t": "source.python string.quoted.single.python punctuation.definition.string.begin.python", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string: #A31515", - "dark_vs": "string: #CE9178", - "light_vs": "string: #A31515", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -2643,10 +2643,10 @@ "c": "Haus", "t": "source.python string.quoted.single.python", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string: #A31515", - "dark_vs": "string: #CE9178", - "light_vs": "string: #A31515", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -2654,10 +2654,10 @@ "c": "\"", "t": "source.python string.quoted.single.python punctuation.definition.string.end.python", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string: #A31515", - "dark_vs": "string: #CE9178", - "light_vs": "string: #A31515", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -2665,10 +2665,10 @@ "c": ",", "t": "source.python punctuation.separator.element.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -2676,10 +2676,10 @@ "c": " ", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -2687,10 +2687,10 @@ "c": "\"", "t": "source.python string.quoted.single.python punctuation.definition.string.begin.python", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string: #A31515", - "dark_vs": "string: #CE9178", - "light_vs": "string: #A31515", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -2698,10 +2698,10 @@ "c": "cat", "t": "source.python string.quoted.single.python", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string: #A31515", - "dark_vs": "string: #CE9178", - "light_vs": "string: #A31515", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -2709,10 +2709,10 @@ "c": "\"", "t": "source.python string.quoted.single.python punctuation.definition.string.end.python", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string: #A31515", - "dark_vs": "string: #CE9178", - "light_vs": "string: #A31515", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -2720,10 +2720,10 @@ "c": ":", "t": "source.python punctuation.separator.dict.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -2731,10 +2731,10 @@ "c": "\"", "t": "source.python string.quoted.single.python punctuation.definition.string.begin.python", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string: #A31515", - "dark_vs": "string: #CE9178", - "light_vs": "string: #A31515", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -2742,10 +2742,10 @@ "c": "Katze", "t": "source.python string.quoted.single.python", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string: #A31515", - "dark_vs": "string: #CE9178", - "light_vs": "string: #A31515", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -2753,10 +2753,10 @@ "c": "\"", "t": "source.python string.quoted.single.python punctuation.definition.string.end.python", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string: #A31515", - "dark_vs": "string: #CE9178", - "light_vs": "string: #A31515", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -2764,10 +2764,10 @@ "c": ",", "t": "source.python punctuation.separator.element.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -2775,10 +2775,10 @@ "c": " ", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -2786,10 +2786,10 @@ "c": "\"", "t": "source.python string.quoted.single.python punctuation.definition.string.begin.python", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string: #A31515", - "dark_vs": "string: #CE9178", - "light_vs": "string: #A31515", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -2797,10 +2797,10 @@ "c": "black", "t": "source.python string.quoted.single.python", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string: #A31515", - "dark_vs": "string: #CE9178", - "light_vs": "string: #A31515", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -2808,10 +2808,10 @@ "c": "\"", "t": "source.python string.quoted.single.python punctuation.definition.string.end.python", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string: #A31515", - "dark_vs": "string: #CE9178", - "light_vs": "string: #A31515", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -2819,10 +2819,10 @@ "c": ":", "t": "source.python punctuation.separator.dict.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -2830,10 +2830,10 @@ "c": "\"", "t": "source.python string.quoted.single.python punctuation.definition.string.begin.python", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string: #A31515", - "dark_vs": "string: #CE9178", - "light_vs": "string: #A31515", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -2841,10 +2841,10 @@ "c": "schwarz", "t": "source.python string.quoted.single.python", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string: #A31515", - "dark_vs": "string: #CE9178", - "light_vs": "string: #A31515", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -2852,10 +2852,10 @@ "c": "\"", "t": "source.python string.quoted.single.python punctuation.definition.string.end.python", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string: #A31515", - "dark_vs": "string: #CE9178", - "light_vs": "string: #A31515", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -2863,10 +2863,10 @@ "c": "}", "t": "source.python punctuation.definition.dict.end.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -2874,10 +2874,10 @@ "c": "mydictionary ", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -2885,10 +2885,10 @@ "c": "=", "t": "source.python keyword.operator.assignment.python", "r": { - "dark_plus": "keyword.operator: #D4D4D4", - "light_plus": "keyword.operator: #000000", - "dark_vs": "keyword.operator: #D4D4D4", - "light_vs": "keyword.operator: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword.operator: #D4D4D4" } }, @@ -2896,10 +2896,10 @@ "c": " ", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -2907,10 +2907,10 @@ "c": "{", "t": "source.python punctuation.definition.dict.begin.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -2918,10 +2918,10 @@ "c": " ", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -2929,10 +2929,10 @@ "c": "'", "t": "source.python string.quoted.single.python punctuation.definition.string.begin.python", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string: #A31515", - "dark_vs": "string: #CE9178", - "light_vs": "string: #A31515", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -2940,10 +2940,10 @@ "c": "foo", "t": "source.python string.quoted.single.python", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string: #A31515", - "dark_vs": "string: #CE9178", - "light_vs": "string: #A31515", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -2951,10 +2951,10 @@ "c": "'", "t": "source.python string.quoted.single.python punctuation.definition.string.end.python", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string: #A31515", - "dark_vs": "string: #CE9178", - "light_vs": "string: #A31515", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -2962,10 +2962,10 @@ "c": ":", "t": "source.python punctuation.separator.dict.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -2973,10 +2973,10 @@ "c": " ", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -2984,10 +2984,10 @@ "c": "23", "t": "source.python constant.numeric.dec.python", "r": { - "dark_plus": "constant.numeric: #B5CEA8", - "light_plus": "constant.numeric: #09885A", - "dark_vs": "constant.numeric: #B5CEA8", - "light_vs": "constant.numeric: #09885A", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "constant.numeric: #B5CEA8" } }, @@ -2995,10 +2995,10 @@ "c": ",", "t": "source.python punctuation.separator.element.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -3006,10 +3006,10 @@ "c": " ", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -3017,10 +3017,10 @@ "c": "#", "t": "source.python comment.line.number-sign.python punctuation.definition.comment.python", "r": { - "dark_plus": "comment: #608B4E", - "light_plus": "comment: #008000", - "dark_vs": "comment: #608B4E", - "light_vs": "comment: #008000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "comment: #7CA668" } }, @@ -3028,10 +3028,10 @@ "c": "comment", "t": "source.python comment.line.number-sign.python", "r": { - "dark_plus": "comment: #608B4E", - "light_plus": "comment: #008000", - "dark_vs": "comment: #608B4E", - "light_vs": "comment: #008000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "comment: #7CA668" } }, @@ -3039,10 +3039,10 @@ "c": " ", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -3050,10 +3050,10 @@ "c": "'", "t": "source.python string.quoted.single.python punctuation.definition.string.begin.python", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string: #A31515", - "dark_vs": "string: #CE9178", - "light_vs": "string: #A31515", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -3061,10 +3061,10 @@ "c": "bar", "t": "source.python string.quoted.single.python", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string: #A31515", - "dark_vs": "string: #CE9178", - "light_vs": "string: #A31515", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -3072,10 +3072,10 @@ "c": "'", "t": "source.python string.quoted.single.python punctuation.definition.string.end.python", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string: #A31515", - "dark_vs": "string: #CE9178", - "light_vs": "string: #A31515", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -3083,10 +3083,10 @@ "c": ":", "t": "source.python punctuation.separator.dict.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -3094,10 +3094,10 @@ "c": " ", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -3105,10 +3105,10 @@ "c": "\"", "t": "source.python string.quoted.single.python punctuation.definition.string.begin.python", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string: #A31515", - "dark_vs": "string: #CE9178", - "light_vs": "string: #A31515", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -3116,10 +3116,10 @@ "c": "hello", "t": "source.python string.quoted.single.python", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string: #A31515", - "dark_vs": "string: #CE9178", - "light_vs": "string: #A31515", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -3127,10 +3127,10 @@ "c": "\"", "t": "source.python string.quoted.single.python punctuation.definition.string.end.python", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string: #A31515", - "dark_vs": "string: #CE9178", - "light_vs": "string: #A31515", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -3138,10 +3138,10 @@ "c": " ", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -3149,10 +3149,10 @@ "c": "#", "t": "source.python comment.line.number-sign.python punctuation.definition.comment.python", "r": { - "dark_plus": "comment: #608B4E", - "light_plus": "comment: #008000", - "dark_vs": "comment: #608B4E", - "light_vs": "comment: #008000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "comment: #7CA668" } }, @@ -3160,10 +3160,10 @@ "c": "sqadsad", "t": "source.python comment.line.number-sign.python", "r": { - "dark_plus": "comment: #608B4E", - "light_plus": "comment: #008000", - "dark_vs": "comment: #608B4E", - "light_vs": "comment: #008000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "comment: #7CA668" } }, @@ -3171,10 +3171,10 @@ "c": "}", "t": "source.python punctuation.definition.dict.end.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -3182,10 +3182,10 @@ "c": "def", "t": "source.python meta.function.python storage.type.function.python", "r": { - "dark_plus": "storage.type: #569CD6", - "light_plus": "storage.type: #0000FF", - "dark_vs": "storage.type: #569CD6", - "light_vs": "storage.type: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "storage.type: #569CD6" } }, @@ -3193,10 +3193,10 @@ "c": " ", "t": "source.python meta.function.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -3204,10 +3204,10 @@ "c": "steuern", "t": "source.python meta.function.python entity.name.function.python", "r": { - "dark_plus": "entity.name.function: #DCDCAA", - "light_plus": "entity.name.function: #795E26", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "entity.name.function: #DCDCAA" } }, @@ -3215,10 +3215,10 @@ "c": "(", "t": "source.python meta.function.python meta.function.parameters.python punctuation.definition.parameters.begin.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -3226,10 +3226,10 @@ "c": "einkommen", "t": "source.python meta.function.python meta.function.parameters.python variable.parameter.function.language.python", "r": { - "dark_plus": "variable: #9CDCFE", - "light_plus": "variable: #001080", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "variable: #9CDCFE" } }, @@ -3237,10 +3237,10 @@ "c": ")", "t": "source.python meta.function.python meta.function.parameters.python punctuation.definition.parameters.end.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -3248,10 +3248,10 @@ "c": ":", "t": "source.python meta.function.python punctuation.section.function.begin.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -3259,10 +3259,10 @@ "c": " ", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -3270,10 +3270,10 @@ "c": "\"\"\"", "t": "source.python string.quoted.docstring.multi.python punctuation.definition.string.begin.python", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string: #A31515", - "dark_vs": "string: #CE9178", - "light_vs": "string: #A31515", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -3281,10 +3281,10 @@ "c": "Berechnung der zu zahlenden Steuern fuer ein zu versteuerndes Einkommen von x", "t": "source.python string.quoted.docstring.multi.python", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string: #A31515", - "dark_vs": "string: #CE9178", - "light_vs": "string: #A31515", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -3292,10 +3292,10 @@ "c": "\"\"\"", "t": "source.python string.quoted.docstring.multi.python punctuation.definition.string.end.python", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string: #A31515", - "dark_vs": "string: #CE9178", - "light_vs": "string: #A31515", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -3303,10 +3303,10 @@ "c": " ", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -3314,10 +3314,10 @@ "c": "if", "t": "source.python keyword.control.flow.python", "r": { - "dark_plus": "keyword.control: #C586C0", - "light_plus": "keyword.control: #AF00DB", - "dark_vs": "keyword.control: #569CD6", - "light_vs": "keyword.control: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword.control: #C586C0" } }, @@ -3325,10 +3325,10 @@ "c": " einkommen ", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -3336,10 +3336,10 @@ "c": "<=", "t": "source.python keyword.operator.comparison.python", "r": { - "dark_plus": "keyword.operator: #D4D4D4", - "light_plus": "keyword.operator: #000000", - "dark_vs": "keyword.operator: #D4D4D4", - "light_vs": "keyword.operator: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword.operator: #D4D4D4" } }, @@ -3347,10 +3347,10 @@ "c": " ", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -3358,10 +3358,10 @@ "c": "8004", "t": "source.python constant.numeric.dec.python", "r": { - "dark_plus": "constant.numeric: #B5CEA8", - "light_plus": "constant.numeric: #09885A", - "dark_vs": "constant.numeric: #B5CEA8", - "light_vs": "constant.numeric: #09885A", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "constant.numeric: #B5CEA8" } }, @@ -3369,10 +3369,10 @@ "c": ":", "t": "source.python punctuation.separator.colon.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -3380,10 +3380,10 @@ "c": " steuer ", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -3391,10 +3391,10 @@ "c": "=", "t": "source.python keyword.operator.assignment.python", "r": { - "dark_plus": "keyword.operator: #D4D4D4", - "light_plus": "keyword.operator: #000000", - "dark_vs": "keyword.operator: #D4D4D4", - "light_vs": "keyword.operator: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword.operator: #D4D4D4" } }, @@ -3402,10 +3402,10 @@ "c": " ", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -3413,10 +3413,10 @@ "c": "0", "t": "source.python constant.numeric.dec.python", "r": { - "dark_plus": "constant.numeric: #B5CEA8", - "light_plus": "constant.numeric: #09885A", - "dark_vs": "constant.numeric: #B5CEA8", - "light_vs": "constant.numeric: #09885A", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "constant.numeric: #B5CEA8" } }, @@ -3424,10 +3424,10 @@ "c": " ", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -3435,10 +3435,10 @@ "c": "elif", "t": "source.python keyword.control.flow.python", "r": { - "dark_plus": "keyword.control: #C586C0", - "light_plus": "keyword.control: #AF00DB", - "dark_vs": "keyword.control: #569CD6", - "light_vs": "keyword.control: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword.control: #C586C0" } }, @@ -3446,10 +3446,10 @@ "c": " einkommen ", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -3457,10 +3457,10 @@ "c": "<=", "t": "source.python keyword.operator.comparison.python", "r": { - "dark_plus": "keyword.operator: #D4D4D4", - "light_plus": "keyword.operator: #000000", - "dark_vs": "keyword.operator: #D4D4D4", - "light_vs": "keyword.operator: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword.operator: #D4D4D4" } }, @@ -3468,10 +3468,10 @@ "c": " ", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -3479,10 +3479,10 @@ "c": "13469", "t": "source.python constant.numeric.dec.python", "r": { - "dark_plus": "constant.numeric: #B5CEA8", - "light_plus": "constant.numeric: #09885A", - "dark_vs": "constant.numeric: #B5CEA8", - "light_vs": "constant.numeric: #09885A", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "constant.numeric: #B5CEA8" } }, @@ -3490,10 +3490,10 @@ "c": ":", "t": "source.python punctuation.separator.colon.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -3501,10 +3501,10 @@ "c": " y ", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -3512,10 +3512,10 @@ "c": "=", "t": "source.python keyword.operator.assignment.python", "r": { - "dark_plus": "keyword.operator: #D4D4D4", - "light_plus": "keyword.operator: #000000", - "dark_vs": "keyword.operator: #D4D4D4", - "light_vs": "keyword.operator: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword.operator: #D4D4D4" } }, @@ -3523,10 +3523,10 @@ "c": " ", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -3534,10 +3534,10 @@ "c": "(", "t": "source.python punctuation.parenthesis.begin.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -3545,10 +3545,10 @@ "c": "einkommen ", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -3556,10 +3556,10 @@ "c": "-", "t": "source.python keyword.operator.arithmetic.python", "r": { - "dark_plus": "keyword.operator: #D4D4D4", - "light_plus": "keyword.operator: #000000", - "dark_vs": "keyword.operator: #D4D4D4", - "light_vs": "keyword.operator: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword.operator: #D4D4D4" } }, @@ -3567,10 +3567,10 @@ "c": "8004.0", "t": "source.python constant.numeric.float.python", "r": { - "dark_plus": "constant.numeric: #B5CEA8", - "light_plus": "constant.numeric: #09885A", - "dark_vs": "constant.numeric: #B5CEA8", - "light_vs": "constant.numeric: #09885A", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "constant.numeric: #B5CEA8" } }, @@ -3578,10 +3578,10 @@ "c": ")", "t": "source.python punctuation.parenthesis.end.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -3589,10 +3589,10 @@ "c": "/", "t": "source.python keyword.operator.arithmetic.python", "r": { - "dark_plus": "keyword.operator: #D4D4D4", - "light_plus": "keyword.operator: #000000", - "dark_vs": "keyword.operator: #D4D4D4", - "light_vs": "keyword.operator: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword.operator: #D4D4D4" } }, @@ -3600,10 +3600,10 @@ "c": "10000.0", "t": "source.python constant.numeric.float.python", "r": { - "dark_plus": "constant.numeric: #B5CEA8", - "light_plus": "constant.numeric: #09885A", - "dark_vs": "constant.numeric: #B5CEA8", - "light_vs": "constant.numeric: #09885A", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "constant.numeric: #B5CEA8" } }, @@ -3611,10 +3611,10 @@ "c": " steuer ", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -3622,10 +3622,10 @@ "c": "=", "t": "source.python keyword.operator.assignment.python", "r": { - "dark_plus": "keyword.operator: #D4D4D4", - "light_plus": "keyword.operator: #000000", - "dark_vs": "keyword.operator: #D4D4D4", - "light_vs": "keyword.operator: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword.operator: #D4D4D4" } }, @@ -3633,10 +3633,10 @@ "c": " ", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -3644,10 +3644,10 @@ "c": "(", "t": "source.python punctuation.parenthesis.begin.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -3655,10 +3655,10 @@ "c": "912.17", "t": "source.python constant.numeric.float.python", "r": { - "dark_plus": "constant.numeric: #B5CEA8", - "light_plus": "constant.numeric: #09885A", - "dark_vs": "constant.numeric: #B5CEA8", - "light_vs": "constant.numeric: #09885A", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "constant.numeric: #B5CEA8" } }, @@ -3666,10 +3666,10 @@ "c": " ", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -3677,10 +3677,10 @@ "c": "*", "t": "source.python keyword.operator.arithmetic.python", "r": { - "dark_plus": "keyword.operator: #D4D4D4", - "light_plus": "keyword.operator: #000000", - "dark_vs": "keyword.operator: #D4D4D4", - "light_vs": "keyword.operator: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword.operator: #D4D4D4" } }, @@ -3688,10 +3688,10 @@ "c": " y ", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -3699,10 +3699,10 @@ "c": "+", "t": "source.python keyword.operator.arithmetic.python", "r": { - "dark_plus": "keyword.operator: #D4D4D4", - "light_plus": "keyword.operator: #000000", - "dark_vs": "keyword.operator: #D4D4D4", - "light_vs": "keyword.operator: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword.operator: #D4D4D4" } }, @@ -3710,10 +3710,10 @@ "c": " ", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -3721,10 +3721,10 @@ "c": "1400", "t": "source.python constant.numeric.dec.python", "r": { - "dark_plus": "constant.numeric: #B5CEA8", - "light_plus": "constant.numeric: #09885A", - "dark_vs": "constant.numeric: #B5CEA8", - "light_vs": "constant.numeric: #09885A", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "constant.numeric: #B5CEA8" } }, @@ -3732,10 +3732,10 @@ "c": ")", "t": "source.python punctuation.parenthesis.end.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -3743,10 +3743,10 @@ "c": "*", "t": "source.python keyword.operator.arithmetic.python", "r": { - "dark_plus": "keyword.operator: #D4D4D4", - "light_plus": "keyword.operator: #000000", - "dark_vs": "keyword.operator: #D4D4D4", - "light_vs": "keyword.operator: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword.operator: #D4D4D4" } }, @@ -3754,10 +3754,10 @@ "c": "y", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -3765,10 +3765,10 @@ "c": " ", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -3776,10 +3776,10 @@ "c": "else", "t": "source.python keyword.control.flow.python", "r": { - "dark_plus": "keyword.control: #C586C0", - "light_plus": "keyword.control: #AF00DB", - "dark_vs": "keyword.control: #569CD6", - "light_vs": "keyword.control: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword.control: #C586C0" } }, @@ -3787,10 +3787,10 @@ "c": ":", "t": "source.python punctuation.separator.colon.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -3798,10 +3798,10 @@ "c": " steuer ", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -3809,10 +3809,10 @@ "c": "=", "t": "source.python keyword.operator.assignment.python", "r": { - "dark_plus": "keyword.operator: #D4D4D4", - "light_plus": "keyword.operator: #000000", - "dark_vs": "keyword.operator: #D4D4D4", - "light_vs": "keyword.operator: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword.operator: #D4D4D4" } }, @@ -3820,10 +3820,10 @@ "c": " einkommen ", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -3831,10 +3831,10 @@ "c": "*", "t": "source.python keyword.operator.arithmetic.python", "r": { - "dark_plus": "keyword.operator: #D4D4D4", - "light_plus": "keyword.operator: #000000", - "dark_vs": "keyword.operator: #D4D4D4", - "light_vs": "keyword.operator: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword.operator: #D4D4D4" } }, @@ -3842,10 +3842,10 @@ "c": " ", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -3853,10 +3853,10 @@ "c": "0.44", "t": "source.python constant.numeric.float.python", "r": { - "dark_plus": "constant.numeric: #B5CEA8", - "light_plus": "constant.numeric: #09885A", - "dark_vs": "constant.numeric: #B5CEA8", - "light_vs": "constant.numeric: #09885A", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "constant.numeric: #B5CEA8" } }, @@ -3864,10 +3864,10 @@ "c": " ", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -3875,10 +3875,10 @@ "c": "-", "t": "source.python keyword.operator.arithmetic.python", "r": { - "dark_plus": "keyword.operator: #D4D4D4", - "light_plus": "keyword.operator: #000000", - "dark_vs": "keyword.operator: #D4D4D4", - "light_vs": "keyword.operator: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword.operator: #D4D4D4" } }, @@ -3886,10 +3886,10 @@ "c": " ", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -3897,10 +3897,10 @@ "c": "15694", "t": "source.python constant.numeric.dec.python", "r": { - "dark_plus": "constant.numeric: #B5CEA8", - "light_plus": "constant.numeric: #09885A", - "dark_vs": "constant.numeric: #B5CEA8", - "light_vs": "constant.numeric: #09885A", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "constant.numeric: #B5CEA8" } }, @@ -3908,10 +3908,10 @@ "c": " ", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -3919,10 +3919,10 @@ "c": "return", "t": "source.python keyword.control.flow.python", "r": { - "dark_plus": "keyword.control: #C586C0", - "light_plus": "keyword.control: #AF00DB", - "dark_vs": "keyword.control: #569CD6", - "light_vs": "keyword.control: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword.control: #C586C0" } }, @@ -3930,10 +3930,10 @@ "c": " steuer", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -3941,10 +3941,10 @@ "c": "def", "t": "source.python meta.function.python storage.type.function.python", "r": { - "dark_plus": "storage.type: #569CD6", - "light_plus": "storage.type: #0000FF", - "dark_vs": "storage.type: #569CD6", - "light_vs": "storage.type: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "storage.type: #569CD6" } }, @@ -3952,10 +3952,10 @@ "c": " ", "t": "source.python meta.function.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -3963,10 +3963,10 @@ "c": "beliebig", "t": "source.python meta.function.python entity.name.function.python", "r": { - "dark_plus": "entity.name.function: #DCDCAA", - "light_plus": "entity.name.function: #795E26", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "entity.name.function: #DCDCAA" } }, @@ -3974,10 +3974,10 @@ "c": "(", "t": "source.python meta.function.python meta.function.parameters.python punctuation.definition.parameters.begin.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -3985,10 +3985,10 @@ "c": "x", "t": "source.python meta.function.python meta.function.parameters.python variable.parameter.function.language.python", "r": { - "dark_plus": "variable: #9CDCFE", - "light_plus": "variable: #001080", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "variable: #9CDCFE" } }, @@ -3996,10 +3996,10 @@ "c": ",", "t": "source.python meta.function.python meta.function.parameters.python punctuation.separator.parameters.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -4007,10 +4007,10 @@ "c": " ", "t": "source.python meta.function.python meta.function.parameters.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -4018,10 +4018,10 @@ "c": "y", "t": "source.python meta.function.python meta.function.parameters.python variable.parameter.function.language.python", "r": { - "dark_plus": "variable: #9CDCFE", - "light_plus": "variable: #001080", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "variable: #9CDCFE" } }, @@ -4029,10 +4029,10 @@ "c": ",", "t": "source.python meta.function.python meta.function.parameters.python punctuation.separator.parameters.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -4040,10 +4040,10 @@ "c": " ", "t": "source.python meta.function.python meta.function.parameters.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -4051,10 +4051,10 @@ "c": "*", "t": "source.python meta.function.python meta.function.parameters.python keyword.operator.unpacking.parameter.python", "r": { - "dark_plus": "keyword.operator: #D4D4D4", - "light_plus": "keyword.operator: #000000", - "dark_vs": "keyword.operator: #D4D4D4", - "light_vs": "keyword.operator: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword.operator: #D4D4D4" } }, @@ -4062,10 +4062,10 @@ "c": "mehr", "t": "source.python meta.function.python meta.function.parameters.python variable.parameter.function.language.python", "r": { - "dark_plus": "variable: #9CDCFE", - "light_plus": "variable: #001080", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "variable: #9CDCFE" } }, @@ -4073,10 +4073,10 @@ "c": ")", "t": "source.python meta.function.python meta.function.parameters.python punctuation.definition.parameters.end.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -4084,10 +4084,10 @@ "c": ":", "t": "source.python meta.function.python punctuation.section.function.begin.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -4095,10 +4095,10 @@ "c": " ", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -4106,10 +4106,10 @@ "c": "print", "t": "source.python support.function.builtin.python", "r": { - "dark_plus": "support.function: #DCDCAA", - "light_plus": "support.function: #795E26", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "support.function: #DCDCAA" } }, @@ -4117,10 +4117,10 @@ "c": " ", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -4128,10 +4128,10 @@ "c": "\"", "t": "source.python string.quoted.single.python punctuation.definition.string.begin.python", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string: #A31515", - "dark_vs": "string: #CE9178", - "light_vs": "string: #A31515", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -4139,10 +4139,10 @@ "c": "x=", "t": "source.python string.quoted.single.python", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string: #A31515", - "dark_vs": "string: #CE9178", - "light_vs": "string: #A31515", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -4150,10 +4150,10 @@ "c": "\"", "t": "source.python string.quoted.single.python punctuation.definition.string.end.python", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string: #A31515", - "dark_vs": "string: #CE9178", - "light_vs": "string: #A31515", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -4161,10 +4161,10 @@ "c": ",", "t": "source.python punctuation.separator.element.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -4172,10 +4172,10 @@ "c": " x", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -4183,10 +4183,10 @@ "c": ",", "t": "source.python punctuation.separator.element.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -4194,10 +4194,10 @@ "c": " ", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -4205,10 +4205,10 @@ "c": "\"", "t": "source.python string.quoted.single.python punctuation.definition.string.begin.python", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string: #A31515", - "dark_vs": "string: #CE9178", - "light_vs": "string: #A31515", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -4216,10 +4216,10 @@ "c": ", x=", "t": "source.python string.quoted.single.python", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string: #A31515", - "dark_vs": "string: #CE9178", - "light_vs": "string: #A31515", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -4227,10 +4227,10 @@ "c": "\"", "t": "source.python string.quoted.single.python punctuation.definition.string.end.python", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string: #A31515", - "dark_vs": "string: #CE9178", - "light_vs": "string: #A31515", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -4238,10 +4238,10 @@ "c": ",", "t": "source.python punctuation.separator.element.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -4249,10 +4249,10 @@ "c": " y", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -4260,10 +4260,10 @@ "c": " ", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -4271,10 +4271,10 @@ "c": "print", "t": "source.python support.function.builtin.python", "r": { - "dark_plus": "support.function: #DCDCAA", - "light_plus": "support.function: #795E26", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "support.function: #DCDCAA" } }, @@ -4282,10 +4282,10 @@ "c": " ", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -4293,10 +4293,10 @@ "c": "\"", "t": "source.python string.quoted.single.python punctuation.definition.string.begin.python", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string: #A31515", - "dark_vs": "string: #CE9178", - "light_vs": "string: #A31515", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -4304,10 +4304,10 @@ "c": "mehr: ", "t": "source.python string.quoted.single.python", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string: #A31515", - "dark_vs": "string: #CE9178", - "light_vs": "string: #A31515", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -4315,10 +4315,10 @@ "c": "\"", "t": "source.python string.quoted.single.python punctuation.definition.string.end.python", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string: #A31515", - "dark_vs": "string: #CE9178", - "light_vs": "string: #A31515", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -4326,10 +4326,10 @@ "c": ",", "t": "source.python punctuation.separator.element.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -4337,10 +4337,10 @@ "c": " mehr", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -4348,10 +4348,10 @@ "c": "class", "t": "source.python meta.class.python storage.type.class.python", "r": { - "dark_plus": "storage.type: #569CD6", - "light_plus": "storage.type: #0000FF", - "dark_vs": "storage.type: #569CD6", - "light_vs": "storage.type: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "storage.type: #569CD6" } }, @@ -4359,10 +4359,10 @@ "c": " ", "t": "source.python meta.class.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -4370,10 +4370,10 @@ "c": "Memoize", "t": "source.python meta.class.python entity.name.type.class.python", "r": { - "dark_plus": "entity.name.type: #4EC9B0", - "light_plus": "entity.name.type: #267F99", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "entity.name.type: #4EC9B0" } }, @@ -4381,10 +4381,10 @@ "c": ":", "t": "source.python meta.class.python punctuation.section.class.begin.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -4392,10 +4392,10 @@ "c": " ", "t": "source.python meta.function.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -4403,10 +4403,10 @@ "c": "def", "t": "source.python meta.function.python storage.type.function.python", "r": { - "dark_plus": "storage.type: #569CD6", - "light_plus": "storage.type: #0000FF", - "dark_vs": "storage.type: #569CD6", - "light_vs": "storage.type: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "storage.type: #569CD6" } }, @@ -4414,10 +4414,10 @@ "c": " ", "t": "source.python meta.function.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -4425,10 +4425,10 @@ "c": "__init__", "t": "source.python meta.function.python support.function.magic.python", "r": { - "dark_plus": "support.function: #DCDCAA", - "light_plus": "support.function: #795E26", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "support.function: #DCDCAA" } }, @@ -4436,10 +4436,10 @@ "c": "(", "t": "source.python meta.function.python meta.function.parameters.python punctuation.definition.parameters.begin.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -4447,10 +4447,10 @@ "c": "self", "t": "source.python meta.function.python meta.function.parameters.python variable.parameter.function.language.python variable.parameter.function.language.special.self.python", "r": { - "dark_plus": "variable: #9CDCFE", - "light_plus": "variable: #001080", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "variable: #9CDCFE" } }, @@ -4458,10 +4458,10 @@ "c": ",", "t": "source.python meta.function.python meta.function.parameters.python punctuation.separator.parameters.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -4469,10 +4469,10 @@ "c": " ", "t": "source.python meta.function.python meta.function.parameters.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -4480,10 +4480,10 @@ "c": "fn", "t": "source.python meta.function.python meta.function.parameters.python variable.parameter.function.language.python", "r": { - "dark_plus": "variable: #9CDCFE", - "light_plus": "variable: #001080", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "variable: #9CDCFE" } }, @@ -4491,10 +4491,10 @@ "c": ")", "t": "source.python meta.function.python meta.function.parameters.python punctuation.definition.parameters.end.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -4502,10 +4502,10 @@ "c": ":", "t": "source.python meta.function.python punctuation.section.function.begin.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -4513,10 +4513,10 @@ "c": " ", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -4524,10 +4524,10 @@ "c": "self", "t": "source.python variable.language.special.self.python", "r": { - "dark_plus": "variable.language: #569CD6", - "light_plus": "variable.language: #0000FF", - "dark_vs": "variable.language: #569CD6", - "light_vs": "variable.language: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "variable: #9CDCFE" } }, @@ -4535,10 +4535,10 @@ "c": ".", "t": "source.python punctuation.separator.period.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -4546,10 +4546,10 @@ "c": "fn ", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -4557,10 +4557,10 @@ "c": "=", "t": "source.python keyword.operator.assignment.python", "r": { - "dark_plus": "keyword.operator: #D4D4D4", - "light_plus": "keyword.operator: #000000", - "dark_vs": "keyword.operator: #D4D4D4", - "light_vs": "keyword.operator: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword.operator: #D4D4D4" } }, @@ -4568,10 +4568,10 @@ "c": " fn", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -4579,10 +4579,10 @@ "c": " ", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -4590,10 +4590,10 @@ "c": "self", "t": "source.python variable.language.special.self.python", "r": { - "dark_plus": "variable.language: #569CD6", - "light_plus": "variable.language: #0000FF", - "dark_vs": "variable.language: #569CD6", - "light_vs": "variable.language: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "variable: #9CDCFE" } }, @@ -4601,10 +4601,10 @@ "c": ".", "t": "source.python punctuation.separator.period.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -4612,10 +4612,10 @@ "c": "memo ", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -4623,10 +4623,10 @@ "c": "=", "t": "source.python keyword.operator.assignment.python", "r": { - "dark_plus": "keyword.operator: #D4D4D4", - "light_plus": "keyword.operator: #000000", - "dark_vs": "keyword.operator: #D4D4D4", - "light_vs": "keyword.operator: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword.operator: #D4D4D4" } }, @@ -4634,10 +4634,10 @@ "c": " ", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -4645,10 +4645,10 @@ "c": "{", "t": "source.python punctuation.definition.dict.begin.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -4656,10 +4656,10 @@ "c": "}", "t": "source.python punctuation.definition.dict.end.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -4667,10 +4667,10 @@ "c": " ", "t": "source.python meta.function.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -4678,10 +4678,10 @@ "c": "def", "t": "source.python meta.function.python storage.type.function.python", "r": { - "dark_plus": "storage.type: #569CD6", - "light_plus": "storage.type: #0000FF", - "dark_vs": "storage.type: #569CD6", - "light_vs": "storage.type: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "storage.type: #569CD6" } }, @@ -4689,10 +4689,10 @@ "c": " ", "t": "source.python meta.function.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -4700,10 +4700,10 @@ "c": "__call__", "t": "source.python meta.function.python support.function.magic.python", "r": { - "dark_plus": "support.function: #DCDCAA", - "light_plus": "support.function: #795E26", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "support.function: #DCDCAA" } }, @@ -4711,10 +4711,10 @@ "c": "(", "t": "source.python meta.function.python meta.function.parameters.python punctuation.definition.parameters.begin.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -4722,10 +4722,10 @@ "c": "self", "t": "source.python meta.function.python meta.function.parameters.python variable.parameter.function.language.python variable.parameter.function.language.special.self.python", "r": { - "dark_plus": "variable: #9CDCFE", - "light_plus": "variable: #001080", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "variable: #9CDCFE" } }, @@ -4733,10 +4733,10 @@ "c": ",", "t": "source.python meta.function.python meta.function.parameters.python punctuation.separator.parameters.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -4744,10 +4744,10 @@ "c": " ", "t": "source.python meta.function.python meta.function.parameters.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -4755,10 +4755,10 @@ "c": "*", "t": "source.python meta.function.python meta.function.parameters.python keyword.operator.unpacking.parameter.python", "r": { - "dark_plus": "keyword.operator: #D4D4D4", - "light_plus": "keyword.operator: #000000", - "dark_vs": "keyword.operator: #D4D4D4", - "light_vs": "keyword.operator: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword.operator: #D4D4D4" } }, @@ -4766,10 +4766,10 @@ "c": "args", "t": "source.python meta.function.python meta.function.parameters.python variable.parameter.function.language.python", "r": { - "dark_plus": "variable: #9CDCFE", - "light_plus": "variable: #001080", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "variable: #9CDCFE" } }, @@ -4777,10 +4777,10 @@ "c": ")", "t": "source.python meta.function.python meta.function.parameters.python punctuation.definition.parameters.end.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -4788,10 +4788,10 @@ "c": ":", "t": "source.python meta.function.python punctuation.section.function.begin.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -4799,10 +4799,10 @@ "c": " ", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -4810,10 +4810,10 @@ "c": "if", "t": "source.python keyword.control.flow.python", "r": { - "dark_plus": "keyword.control: #C586C0", - "light_plus": "keyword.control: #AF00DB", - "dark_vs": "keyword.control: #569CD6", - "light_vs": "keyword.control: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword.control: #C586C0" } }, @@ -4821,10 +4821,10 @@ "c": " args ", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -4832,10 +4832,10 @@ "c": "not", "t": "source.python keyword.operator.logical.python", "r": { - "dark_plus": "keyword.operator.logical.python: #569CD6", - "light_plus": "keyword.operator.logical.python: #0000FF", - "dark_vs": "keyword.operator.logical.python: #569CD6", - "light_vs": "keyword.operator.logical.python: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword.operator.logical.python: #569CD6" } }, @@ -4843,10 +4843,10 @@ "c": " ", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -4854,10 +4854,10 @@ "c": "in", "t": "source.python keyword.operator.logical.python", "r": { - "dark_plus": "keyword.operator.logical.python: #569CD6", - "light_plus": "keyword.operator.logical.python: #0000FF", - "dark_vs": "keyword.operator.logical.python: #569CD6", - "light_vs": "keyword.operator.logical.python: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword.operator.logical.python: #569CD6" } }, @@ -4865,10 +4865,10 @@ "c": " ", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -4876,10 +4876,10 @@ "c": "self", "t": "source.python variable.language.special.self.python", "r": { - "dark_plus": "variable.language: #569CD6", - "light_plus": "variable.language: #0000FF", - "dark_vs": "variable.language: #569CD6", - "light_vs": "variable.language: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "variable: #9CDCFE" } }, @@ -4887,10 +4887,10 @@ "c": ".", "t": "source.python punctuation.separator.period.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -4898,10 +4898,10 @@ "c": "memo", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -4909,10 +4909,10 @@ "c": ":", "t": "source.python punctuation.separator.colon.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -4920,10 +4920,10 @@ "c": " ", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -4931,10 +4931,10 @@ "c": "self", "t": "source.python variable.language.special.self.python", "r": { - "dark_plus": "variable.language: #569CD6", - "light_plus": "variable.language: #0000FF", - "dark_vs": "variable.language: #569CD6", - "light_vs": "variable.language: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "variable: #9CDCFE" } }, @@ -4942,10 +4942,10 @@ "c": ".", "t": "source.python punctuation.separator.period.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -4953,10 +4953,10 @@ "c": "memo", "t": "source.python meta.item-access.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -4964,10 +4964,10 @@ "c": "[", "t": "source.python meta.item-access.python punctuation.definition.arguments.begin.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -4975,10 +4975,10 @@ "c": "args", "t": "source.python meta.item-access.python meta.item-access.arguments.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -4986,10 +4986,10 @@ "c": "]", "t": "source.python meta.item-access.python punctuation.definition.arguments.end.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -4997,10 +4997,10 @@ "c": " ", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -5008,10 +5008,10 @@ "c": "=", "t": "source.python keyword.operator.assignment.python", "r": { - "dark_plus": "keyword.operator: #D4D4D4", - "light_plus": "keyword.operator: #000000", - "dark_vs": "keyword.operator: #D4D4D4", - "light_vs": "keyword.operator: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword.operator: #D4D4D4" } }, @@ -5019,10 +5019,10 @@ "c": " ", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -5030,10 +5030,10 @@ "c": "self", "t": "source.python variable.language.special.self.python", "r": { - "dark_plus": "variable.language: #569CD6", - "light_plus": "variable.language: #0000FF", - "dark_vs": "variable.language: #569CD6", - "light_vs": "variable.language: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "variable: #9CDCFE" } }, @@ -5041,10 +5041,10 @@ "c": ".", "t": "source.python punctuation.separator.period.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -5052,10 +5052,10 @@ "c": "fn", "t": "source.python meta.function-call.python meta.function-call.generic.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -5063,10 +5063,10 @@ "c": "(", "t": "source.python meta.function-call.python punctuation.definition.arguments.begin.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -5074,10 +5074,10 @@ "c": "*", "t": "source.python meta.function-call.python keyword.operator.unpacking.arguments.python", "r": { - "dark_plus": "keyword.operator: #D4D4D4", - "light_plus": "keyword.operator: #000000", - "dark_vs": "keyword.operator: #D4D4D4", - "light_vs": "keyword.operator: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword.operator: #D4D4D4" } }, @@ -5085,10 +5085,10 @@ "c": "args", "t": "source.python meta.function-call.python meta.function-call.arguments.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -5096,10 +5096,10 @@ "c": ")", "t": "source.python meta.function-call.python punctuation.definition.arguments.end.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -5107,10 +5107,10 @@ "c": " ", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -5118,10 +5118,10 @@ "c": "return", "t": "source.python keyword.control.flow.python", "r": { - "dark_plus": "keyword.control: #C586C0", - "light_plus": "keyword.control: #AF00DB", - "dark_vs": "keyword.control: #569CD6", - "light_vs": "keyword.control: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword.control: #C586C0" } }, @@ -5129,10 +5129,10 @@ "c": " ", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -5140,10 +5140,10 @@ "c": "self", "t": "source.python variable.language.special.self.python", "r": { - "dark_plus": "variable.language: #569CD6", - "light_plus": "variable.language: #0000FF", - "dark_vs": "variable.language: #569CD6", - "light_vs": "variable.language: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "variable: #9CDCFE" } }, @@ -5151,10 +5151,10 @@ "c": ".", "t": "source.python punctuation.separator.period.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -5162,10 +5162,10 @@ "c": "memo", "t": "source.python meta.item-access.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -5173,10 +5173,10 @@ "c": "[", "t": "source.python meta.item-access.python punctuation.definition.arguments.begin.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -5184,10 +5184,10 @@ "c": "args", "t": "source.python meta.item-access.python meta.item-access.arguments.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -5195,10 +5195,10 @@ "c": "]", "t": "source.python meta.item-access.python punctuation.definition.arguments.end.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -5206,10 +5206,10 @@ "c": "res ", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -5217,10 +5217,10 @@ "c": "=", "t": "source.python keyword.operator.assignment.python", "r": { - "dark_plus": "keyword.operator: #D4D4D4", - "light_plus": "keyword.operator: #000000", - "dark_vs": "keyword.operator: #D4D4D4", - "light_vs": "keyword.operator: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword.operator: #D4D4D4" } }, @@ -5228,10 +5228,10 @@ "c": " re", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -5239,10 +5239,10 @@ "c": ".", "t": "source.python punctuation.separator.period.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -5250,10 +5250,10 @@ "c": "search", "t": "source.python meta.function-call.python meta.function-call.generic.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -5261,10 +5261,10 @@ "c": "(", "t": "source.python meta.function-call.python punctuation.definition.arguments.begin.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -5272,10 +5272,10 @@ "c": "r", "t": "source.python meta.function-call.python meta.function-call.arguments.python string.regexp.quoted.single.python storage.type.string.python", "r": { - "dark_plus": "storage.type: #569CD6", - "light_plus": "storage.type: #0000FF", - "dark_vs": "storage.type: #569CD6", - "light_vs": "storage.type: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "storage.type: #569CD6" } }, @@ -5283,10 +5283,10 @@ "c": "\"", "t": "source.python meta.function-call.python meta.function-call.arguments.python string.regexp.quoted.single.python punctuation.definition.string.begin.python", "r": { - "dark_plus": "string.regexp: #D16969", - "light_plus": "string.regexp: #811F3F", - "dark_vs": "string.regexp: #D16969", - "light_vs": "string.regexp: #811F3F", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string.regexp: #D16969" } }, @@ -5294,10 +5294,10 @@ "c": "(", "t": "source.python meta.function-call.python meta.function-call.arguments.python string.regexp.quoted.single.python support.other.parenthesis.regexp punctuation.parenthesis.begin.regexp", "r": { - "dark_plus": "support.other.parenthesis.regexp: #CE9178", - "light_plus": "support.other.parenthesis.regexp: #D16969", - "dark_vs": "string.regexp: #D16969", - "light_vs": "string.regexp: #811F3F", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string.regexp: #D16969" } }, @@ -5305,10 +5305,10 @@ "c": "[", "t": "source.python meta.function-call.python meta.function-call.arguments.python string.regexp.quoted.single.python meta.character.set.regexp punctuation.character.set.begin.regexp constant.other.set.regexp", "r": { - "dark_plus": "punctuation.character.set.begin.regexp: #CE9178", - "light_plus": "punctuation.character.set.begin.regexp: #D16969", - "dark_vs": "string.regexp: #D16969", - "light_vs": "string.regexp: #811F3F", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string.regexp: #D16969" } }, @@ -5316,10 +5316,10 @@ "c": "0-9-", "t": "source.python meta.function-call.python meta.function-call.arguments.python string.regexp.quoted.single.python meta.character.set.regexp constant.character.set.regexp", "r": { - "dark_plus": "constant.character.set.regexp: #D16969", - "light_plus": "constant.character.set.regexp: #811F3F", - "dark_vs": "string.regexp: #D16969", - "light_vs": "string.regexp: #811F3F", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "constant.character: #569CD6" } }, @@ -5327,10 +5327,10 @@ "c": "]", "t": "source.python meta.function-call.python meta.function-call.arguments.python string.regexp.quoted.single.python meta.character.set.regexp punctuation.character.set.end.regexp constant.other.set.regexp", "r": { - "dark_plus": "punctuation.character.set.end.regexp: #CE9178", - "light_plus": "punctuation.character.set.end.regexp: #D16969", - "dark_vs": "string.regexp: #D16969", - "light_vs": "string.regexp: #811F3F", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string.regexp: #D16969" } }, @@ -5338,10 +5338,10 @@ "c": "*", "t": "source.python meta.function-call.python meta.function-call.arguments.python string.regexp.quoted.single.python keyword.operator.quantifier.regexp", "r": { - "dark_plus": "keyword.operator.quantifier.regexp: #D7BA7D", - "light_plus": "keyword.operator.quantifier.regexp: #000000", - "dark_vs": "keyword.operator: #D4D4D4", - "light_vs": "keyword.operator: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword.operator: #D4D4D4" } }, @@ -5349,10 +5349,10 @@ "c": ")", "t": "source.python meta.function-call.python meta.function-call.arguments.python string.regexp.quoted.single.python support.other.parenthesis.regexp punctuation.parenthesis.end.regexp", "r": { - "dark_plus": "support.other.parenthesis.regexp: #CE9178", - "light_plus": "support.other.parenthesis.regexp: #D16969", - "dark_vs": "string.regexp: #D16969", - "light_vs": "string.regexp: #811F3F", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string.regexp: #D16969" } }, @@ -5360,10 +5360,10 @@ "c": "\\s", "t": "source.python meta.function-call.python meta.function-call.arguments.python string.regexp.quoted.single.python support.other.escape.special.regexp", "r": { - "dark_plus": "string.regexp: #D16969", - "light_plus": "string.regexp: #811F3F", - "dark_vs": "string.regexp: #D16969", - "light_vs": "string.regexp: #811F3F", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string.regexp: #D16969" } }, @@ -5371,10 +5371,10 @@ "c": "*", "t": "source.python meta.function-call.python meta.function-call.arguments.python string.regexp.quoted.single.python keyword.operator.quantifier.regexp", "r": { - "dark_plus": "keyword.operator.quantifier.regexp: #D7BA7D", - "light_plus": "keyword.operator.quantifier.regexp: #000000", - "dark_vs": "keyword.operator: #D4D4D4", - "light_vs": "keyword.operator: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword.operator: #D4D4D4" } }, @@ -5382,10 +5382,10 @@ "c": "(", "t": "source.python meta.function-call.python meta.function-call.arguments.python string.regexp.quoted.single.python support.other.parenthesis.regexp punctuation.parenthesis.begin.regexp", "r": { - "dark_plus": "support.other.parenthesis.regexp: #CE9178", - "light_plus": "support.other.parenthesis.regexp: #D16969", - "dark_vs": "string.regexp: #D16969", - "light_vs": "string.regexp: #811F3F", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string.regexp: #D16969" } }, @@ -5393,10 +5393,10 @@ "c": "[", "t": "source.python meta.function-call.python meta.function-call.arguments.python string.regexp.quoted.single.python meta.character.set.regexp punctuation.character.set.begin.regexp constant.other.set.regexp", "r": { - "dark_plus": "punctuation.character.set.begin.regexp: #CE9178", - "light_plus": "punctuation.character.set.begin.regexp: #D16969", - "dark_vs": "string.regexp: #D16969", - "light_vs": "string.regexp: #811F3F", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string.regexp: #D16969" } }, @@ -5404,10 +5404,10 @@ "c": "A-Za-z", "t": "source.python meta.function-call.python meta.function-call.arguments.python string.regexp.quoted.single.python meta.character.set.regexp constant.character.set.regexp", "r": { - "dark_plus": "constant.character.set.regexp: #D16969", - "light_plus": "constant.character.set.regexp: #811F3F", - "dark_vs": "string.regexp: #D16969", - "light_vs": "string.regexp: #811F3F", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "constant.character: #569CD6" } }, @@ -5415,10 +5415,10 @@ "c": "]", "t": "source.python meta.function-call.python meta.function-call.arguments.python string.regexp.quoted.single.python meta.character.set.regexp punctuation.character.set.end.regexp constant.other.set.regexp", "r": { - "dark_plus": "punctuation.character.set.end.regexp: #CE9178", - "light_plus": "punctuation.character.set.end.regexp: #D16969", - "dark_vs": "string.regexp: #D16969", - "light_vs": "string.regexp: #811F3F", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string.regexp: #D16969" } }, @@ -5426,10 +5426,10 @@ "c": "+", "t": "source.python meta.function-call.python meta.function-call.arguments.python string.regexp.quoted.single.python keyword.operator.quantifier.regexp", "r": { - "dark_plus": "keyword.operator.quantifier.regexp: #D7BA7D", - "light_plus": "keyword.operator.quantifier.regexp: #000000", - "dark_vs": "keyword.operator: #D4D4D4", - "light_vs": "keyword.operator: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword.operator: #D4D4D4" } }, @@ -5437,10 +5437,10 @@ "c": ")", "t": "source.python meta.function-call.python meta.function-call.arguments.python string.regexp.quoted.single.python support.other.parenthesis.regexp punctuation.parenthesis.end.regexp", "r": { - "dark_plus": "support.other.parenthesis.regexp: #CE9178", - "light_plus": "support.other.parenthesis.regexp: #D16969", - "dark_vs": "string.regexp: #D16969", - "light_vs": "string.regexp: #811F3F", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string.regexp: #D16969" } }, @@ -5448,10 +5448,10 @@ "c": ",", "t": "source.python meta.function-call.python meta.function-call.arguments.python string.regexp.quoted.single.python", "r": { - "dark_plus": "string.regexp: #D16969", - "light_plus": "string.regexp: #811F3F", - "dark_vs": "string.regexp: #D16969", - "light_vs": "string.regexp: #811F3F", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string.regexp: #D16969" } }, @@ -5459,10 +5459,10 @@ "c": "\\s", "t": "source.python meta.function-call.python meta.function-call.arguments.python string.regexp.quoted.single.python support.other.escape.special.regexp", "r": { - "dark_plus": "string.regexp: #D16969", - "light_plus": "string.regexp: #811F3F", - "dark_vs": "string.regexp: #D16969", - "light_vs": "string.regexp: #811F3F", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string.regexp: #D16969" } }, @@ -5470,10 +5470,10 @@ "c": "+", "t": "source.python meta.function-call.python meta.function-call.arguments.python string.regexp.quoted.single.python keyword.operator.quantifier.regexp", "r": { - "dark_plus": "keyword.operator.quantifier.regexp: #D7BA7D", - "light_plus": "keyword.operator.quantifier.regexp: #000000", - "dark_vs": "keyword.operator: #D4D4D4", - "light_vs": "keyword.operator: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword.operator: #D4D4D4" } }, @@ -5481,10 +5481,10 @@ "c": "(", "t": "source.python meta.function-call.python meta.function-call.arguments.python string.regexp.quoted.single.python support.other.parenthesis.regexp punctuation.parenthesis.begin.regexp", "r": { - "dark_plus": "support.other.parenthesis.regexp: #CE9178", - "light_plus": "support.other.parenthesis.regexp: #D16969", - "dark_vs": "string.regexp: #D16969", - "light_vs": "string.regexp: #811F3F", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string.regexp: #D16969" } }, @@ -5492,10 +5492,10 @@ "c": ".", "t": "source.python meta.function-call.python meta.function-call.arguments.python string.regexp.quoted.single.python support.other.match.any.regexp", "r": { - "dark_plus": "string.regexp: #D16969", - "light_plus": "string.regexp: #811F3F", - "dark_vs": "string.regexp: #D16969", - "light_vs": "string.regexp: #811F3F", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string.regexp: #D16969" } }, @@ -5503,10 +5503,10 @@ "c": "*", "t": "source.python meta.function-call.python meta.function-call.arguments.python string.regexp.quoted.single.python keyword.operator.quantifier.regexp", "r": { - "dark_plus": "keyword.operator.quantifier.regexp: #D7BA7D", - "light_plus": "keyword.operator.quantifier.regexp: #000000", - "dark_vs": "keyword.operator: #D4D4D4", - "light_vs": "keyword.operator: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword.operator: #D4D4D4" } }, @@ -5514,10 +5514,10 @@ "c": ")", "t": "source.python meta.function-call.python meta.function-call.arguments.python string.regexp.quoted.single.python support.other.parenthesis.regexp punctuation.parenthesis.end.regexp", "r": { - "dark_plus": "support.other.parenthesis.regexp: #CE9178", - "light_plus": "support.other.parenthesis.regexp: #D16969", - "dark_vs": "string.regexp: #D16969", - "light_vs": "string.regexp: #811F3F", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string.regexp: #D16969" } }, @@ -5525,10 +5525,10 @@ "c": "\"", "t": "source.python meta.function-call.python meta.function-call.arguments.python string.regexp.quoted.single.python punctuation.definition.string.end.python", "r": { - "dark_plus": "string.regexp: #D16969", - "light_plus": "string.regexp: #811F3F", - "dark_vs": "string.regexp: #D16969", - "light_vs": "string.regexp: #811F3F", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string.regexp: #D16969" } }, @@ -5536,10 +5536,10 @@ "c": ",", "t": "source.python meta.function-call.python meta.function-call.arguments.python punctuation.separator.arguments.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -5547,10 +5547,10 @@ "c": " i", "t": "source.python meta.function-call.python meta.function-call.arguments.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -5558,10 +5558,10 @@ "c": ")", "t": "source.python meta.function-call.python punctuation.definition.arguments.end.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -5569,10 +5569,10 @@ "c": "while", "t": "source.python keyword.control.flow.python", "r": { - "dark_plus": "keyword.control: #C586C0", - "light_plus": "keyword.control: #AF00DB", - "dark_vs": "keyword.control: #569CD6", - "light_vs": "keyword.control: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword.control: #C586C0" } }, @@ -5580,10 +5580,10 @@ "c": " ", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -5591,10 +5591,10 @@ "c": "True", "t": "source.python constant.language.python", "r": { - "dark_plus": "constant.language: #569CD6", - "light_plus": "constant.language: #0000FF", - "dark_vs": "constant.language: #569CD6", - "light_vs": "constant.language: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "constant.language: #569CD6" } }, @@ -5602,10 +5602,10 @@ "c": ":", "t": "source.python punctuation.separator.colon.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -5613,10 +5613,10 @@ "c": " ", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -5624,10 +5624,10 @@ "c": "try", "t": "source.python keyword.control.flow.python", "r": { - "dark_plus": "keyword.control: #C586C0", - "light_plus": "keyword.control: #AF00DB", - "dark_vs": "keyword.control: #569CD6", - "light_vs": "keyword.control: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword.control: #C586C0" } }, @@ -5635,10 +5635,10 @@ "c": ":", "t": "source.python punctuation.separator.colon.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -5646,10 +5646,10 @@ "c": " n ", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -5657,10 +5657,10 @@ "c": "=", "t": "source.python keyword.operator.assignment.python", "r": { - "dark_plus": "keyword.operator: #D4D4D4", - "light_plus": "keyword.operator: #000000", - "dark_vs": "keyword.operator: #D4D4D4", - "light_vs": "keyword.operator: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword.operator: #D4D4D4" } }, @@ -5668,10 +5668,10 @@ "c": " ", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -5679,10 +5679,10 @@ "c": "raw_input", "t": "source.python meta.function-call.python variable.legacy.builtin.python", "r": { - "dark_plus": "variable: #9CDCFE", - "light_plus": "variable: #001080", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "variable: #9CDCFE" } }, @@ -5690,10 +5690,10 @@ "c": "(", "t": "source.python meta.function-call.python punctuation.definition.arguments.begin.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -5701,10 +5701,10 @@ "c": "\"", "t": "source.python meta.function-call.python meta.function-call.arguments.python string.quoted.single.python punctuation.definition.string.begin.python", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string: #A31515", - "dark_vs": "string: #CE9178", - "light_vs": "string: #A31515", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -5712,10 +5712,10 @@ "c": "Number: ", "t": "source.python meta.function-call.python meta.function-call.arguments.python string.quoted.single.python", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string: #A31515", - "dark_vs": "string: #CE9178", - "light_vs": "string: #A31515", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -5723,10 +5723,10 @@ "c": "\"", "t": "source.python meta.function-call.python meta.function-call.arguments.python string.quoted.single.python punctuation.definition.string.end.python", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string: #A31515", - "dark_vs": "string: #CE9178", - "light_vs": "string: #A31515", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -5734,10 +5734,10 @@ "c": ")", "t": "source.python meta.function-call.python punctuation.definition.arguments.end.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -5745,10 +5745,10 @@ "c": " n ", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -5756,10 +5756,10 @@ "c": "=", "t": "source.python keyword.operator.assignment.python", "r": { - "dark_plus": "keyword.operator: #D4D4D4", - "light_plus": "keyword.operator: #000000", - "dark_vs": "keyword.operator: #D4D4D4", - "light_vs": "keyword.operator: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword.operator: #D4D4D4" } }, @@ -5767,10 +5767,10 @@ "c": " ", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -5778,10 +5778,10 @@ "c": "int", "t": "source.python meta.function-call.python support.type.python", "r": { - "dark_plus": "support.type: #4EC9B0", - "light_plus": "support.type: #267F99", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "support.type: #4EC9B0" } }, @@ -5789,10 +5789,10 @@ "c": "(", "t": "source.python meta.function-call.python punctuation.definition.arguments.begin.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -5800,10 +5800,10 @@ "c": "n", "t": "source.python meta.function-call.python meta.function-call.arguments.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -5811,10 +5811,10 @@ "c": ")", "t": "source.python meta.function-call.python punctuation.definition.arguments.end.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -5822,10 +5822,10 @@ "c": " ", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -5833,10 +5833,10 @@ "c": "break", "t": "source.python keyword.control.flow.python", "r": { - "dark_plus": "keyword.control: #C586C0", - "light_plus": "keyword.control: #AF00DB", - "dark_vs": "keyword.control: #569CD6", - "light_vs": "keyword.control: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword.control: #C586C0" } }, @@ -5844,10 +5844,10 @@ "c": " ", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -5855,10 +5855,10 @@ "c": "except", "t": "source.python keyword.control.flow.python", "r": { - "dark_plus": "keyword.control: #C586C0", - "light_plus": "keyword.control: #AF00DB", - "dark_vs": "keyword.control: #569CD6", - "light_vs": "keyword.control: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword.control: #C586C0" } }, @@ -5866,10 +5866,10 @@ "c": " ", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -5877,10 +5877,10 @@ "c": "ValueError", "t": "source.python support.type.exception.python", "r": { - "dark_plus": "support.type: #4EC9B0", - "light_plus": "support.type: #267F99", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "support.type: #4EC9B0" } }, @@ -5888,10 +5888,10 @@ "c": ":", "t": "source.python punctuation.separator.colon.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -5899,10 +5899,10 @@ "c": " ", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -5910,10 +5910,10 @@ "c": "print", "t": "source.python meta.function-call.python support.function.builtin.python", "r": { - "dark_plus": "support.function: #DCDCAA", - "light_plus": "support.function: #795E26", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "support.function: #DCDCAA" } }, @@ -5921,10 +5921,10 @@ "c": "(", "t": "source.python meta.function-call.python punctuation.definition.arguments.begin.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -5932,10 +5932,10 @@ "c": "\"", "t": "source.python meta.function-call.python meta.function-call.arguments.python string.quoted.single.python punctuation.definition.string.begin.python", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string: #A31515", - "dark_vs": "string: #CE9178", - "light_vs": "string: #A31515", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -5943,10 +5943,10 @@ "c": "Not a number", "t": "source.python meta.function-call.python meta.function-call.arguments.python string.quoted.single.python", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string: #A31515", - "dark_vs": "string: #CE9178", - "light_vs": "string: #A31515", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -5954,10 +5954,10 @@ "c": "\"", "t": "source.python meta.function-call.python meta.function-call.arguments.python string.quoted.single.python punctuation.definition.string.end.python", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string: #A31515", - "dark_vs": "string: #CE9178", - "light_vs": "string: #A31515", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -5965,10 +5965,10 @@ "c": ")", "t": "source.python meta.function-call.python punctuation.definition.arguments.end.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -5976,10 +5976,10 @@ "c": "async", "t": "source.python keyword.control.flow.python", "r": { - "dark_plus": "keyword.control: #C586C0", - "light_plus": "keyword.control: #AF00DB", - "dark_vs": "keyword.control: #569CD6", - "light_vs": "keyword.control: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword.control: #C586C0" } }, @@ -5987,10 +5987,10 @@ "c": " ", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -5998,10 +5998,10 @@ "c": "with", "t": "source.python keyword.control.flow.python", "r": { - "dark_plus": "keyword.control: #C586C0", - "light_plus": "keyword.control: #AF00DB", - "dark_vs": "keyword.control: #569CD6", - "light_vs": "keyword.control: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword.control: #C586C0" } }, @@ -6009,10 +6009,10 @@ "c": " ", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -6020,10 +6020,10 @@ "c": "EXPR", "t": "source.python constant.other.caps.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -6031,10 +6031,10 @@ "c": " ", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -6042,10 +6042,10 @@ "c": "as", "t": "source.python keyword.control.flow.python", "r": { - "dark_plus": "keyword.control: #C586C0", - "light_plus": "keyword.control: #AF00DB", - "dark_vs": "keyword.control: #569CD6", - "light_vs": "keyword.control: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword.control: #C586C0" } }, @@ -6053,10 +6053,10 @@ "c": " ", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -6064,10 +6064,10 @@ "c": "VAR", "t": "source.python constant.other.caps.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -6075,10 +6075,10 @@ "c": ":", "t": "source.python punctuation.separator.colon.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -6086,10 +6086,10 @@ "c": " ", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -6097,10 +6097,10 @@ "c": "BLOCK", "t": "source.python constant.other.caps.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -6108,10 +6108,10 @@ "c": "#", "t": "source.python comment.line.number-sign.python punctuation.definition.comment.python", "r": { - "dark_plus": "comment: #608B4E", - "light_plus": "comment: #008000", - "dark_vs": "comment: #608B4E", - "light_vs": "comment: #008000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "comment: #7CA668" } }, @@ -6119,10 +6119,10 @@ "c": " Comments in dictionary items should be colorized accordingly", "t": "source.python comment.line.number-sign.python", "r": { - "dark_plus": "comment: #608B4E", - "light_plus": "comment: #008000", - "dark_vs": "comment: #608B4E", - "light_vs": "comment: #008000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "comment: #7CA668" } }, @@ -6130,10 +6130,10 @@ "c": "my_dictionary ", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -6141,10 +6141,10 @@ "c": "=", "t": "source.python keyword.operator.assignment.python", "r": { - "dark_plus": "keyword.operator: #D4D4D4", - "light_plus": "keyword.operator: #000000", - "dark_vs": "keyword.operator: #D4D4D4", - "light_vs": "keyword.operator: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword.operator: #D4D4D4" } }, @@ -6152,10 +6152,10 @@ "c": " ", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -6163,10 +6163,10 @@ "c": "{", "t": "source.python punctuation.definition.dict.begin.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -6174,10 +6174,10 @@ "c": " ", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -6185,10 +6185,10 @@ "c": "'", "t": "source.python string.quoted.single.python punctuation.definition.string.begin.python", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string: #A31515", - "dark_vs": "string: #CE9178", - "light_vs": "string: #A31515", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -6196,10 +6196,10 @@ "c": "foo", "t": "source.python string.quoted.single.python", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string: #A31515", - "dark_vs": "string: #CE9178", - "light_vs": "string: #A31515", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -6207,10 +6207,10 @@ "c": "'", "t": "source.python string.quoted.single.python punctuation.definition.string.end.python", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string: #A31515", - "dark_vs": "string: #CE9178", - "light_vs": "string: #A31515", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -6218,10 +6218,10 @@ "c": ":", "t": "source.python punctuation.separator.dict.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -6229,10 +6229,10 @@ "c": "23", "t": "source.python constant.numeric.dec.python", "r": { - "dark_plus": "constant.numeric: #B5CEA8", - "light_plus": "constant.numeric: #09885A", - "dark_vs": "constant.numeric: #B5CEA8", - "light_vs": "constant.numeric: #09885A", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "constant.numeric: #B5CEA8" } }, @@ -6240,10 +6240,10 @@ "c": ",", "t": "source.python punctuation.separator.element.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -6251,10 +6251,10 @@ "c": " ", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -6262,10 +6262,10 @@ "c": "#", "t": "source.python comment.line.number-sign.python punctuation.definition.comment.python", "r": { - "dark_plus": "comment: #608B4E", - "light_plus": "comment: #008000", - "dark_vs": "comment: #608B4E", - "light_vs": "comment: #008000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "comment: #7CA668" } }, @@ -6273,10 +6273,10 @@ "c": " this should be colorized as comment", "t": "source.python comment.line.number-sign.python", "r": { - "dark_plus": "comment: #608B4E", - "light_plus": "comment: #008000", - "dark_vs": "comment: #608B4E", - "light_vs": "comment: #008000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "comment: #7CA668" } }, @@ -6284,10 +6284,10 @@ "c": " ", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -6295,10 +6295,10 @@ "c": "'", "t": "source.python string.quoted.single.python punctuation.definition.string.begin.python", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string: #A31515", - "dark_vs": "string: #CE9178", - "light_vs": "string: #A31515", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -6306,10 +6306,10 @@ "c": "bar", "t": "source.python string.quoted.single.python", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string: #A31515", - "dark_vs": "string: #CE9178", - "light_vs": "string: #A31515", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -6317,10 +6317,10 @@ "c": "'", "t": "source.python string.quoted.single.python punctuation.definition.string.end.python", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string: #A31515", - "dark_vs": "string: #CE9178", - "light_vs": "string: #A31515", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -6328,10 +6328,10 @@ "c": ":", "t": "source.python punctuation.separator.dict.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -6339,10 +6339,10 @@ "c": "\"", "t": "source.python string.quoted.single.python punctuation.definition.string.begin.python", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string: #A31515", - "dark_vs": "string: #CE9178", - "light_vs": "string: #A31515", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -6350,10 +6350,10 @@ "c": "foobar", "t": "source.python string.quoted.single.python", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string: #A31515", - "dark_vs": "string: #CE9178", - "light_vs": "string: #A31515", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -6361,10 +6361,10 @@ "c": "\"", "t": "source.python string.quoted.single.python punctuation.definition.string.end.python", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string: #A31515", - "dark_vs": "string: #CE9178", - "light_vs": "string: #A31515", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -6372,10 +6372,10 @@ "c": " ", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -6383,10 +6383,10 @@ "c": "#", "t": "source.python comment.line.number-sign.python punctuation.definition.comment.python", "r": { - "dark_plus": "comment: #608B4E", - "light_plus": "comment: #008000", - "dark_vs": "comment: #608B4E", - "light_vs": "comment: #008000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "comment: #7CA668" } }, @@ -6394,10 +6394,10 @@ "c": "this should be colorized as comment", "t": "source.python comment.line.number-sign.python", "r": { - "dark_plus": "comment: #608B4E", - "light_plus": "comment: #008000", - "dark_vs": "comment: #608B4E", - "light_vs": "comment: #008000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "comment: #7CA668" } }, @@ -6405,10 +6405,10 @@ "c": "}", "t": "source.python punctuation.definition.dict.end.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -6416,10 +6416,10 @@ "c": "#", "t": "source.python comment.line.number-sign.python punctuation.definition.comment.python", "r": { - "dark_plus": "comment: #608B4E", - "light_plus": "comment: #008000", - "dark_vs": "comment: #608B4E", - "light_vs": "comment: #008000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "comment: #7CA668" } }, @@ -6427,10 +6427,10 @@ "c": " test raw strings", "t": "source.python comment.line.number-sign.python", "r": { - "dark_plus": "comment: #608B4E", - "light_plus": "comment: #008000", - "dark_vs": "comment: #608B4E", - "light_vs": "comment: #008000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "comment: #7CA668" } }, @@ -6438,10 +6438,10 @@ "c": "text ", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -6449,10 +6449,10 @@ "c": "=", "t": "source.python keyword.operator.assignment.python", "r": { - "dark_plus": "keyword.operator: #D4D4D4", - "light_plus": "keyword.operator: #000000", - "dark_vs": "keyword.operator: #D4D4D4", - "light_vs": "keyword.operator: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword.operator: #D4D4D4" } }, @@ -6460,10 +6460,10 @@ "c": " ", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -6471,10 +6471,10 @@ "c": "r", "t": "source.python string.regexp.quoted.multi.python storage.type.string.python", "r": { - "dark_plus": "storage.type: #569CD6", - "light_plus": "storage.type: #0000FF", - "dark_vs": "storage.type: #569CD6", - "light_vs": "storage.type: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "storage.type: #569CD6" } }, @@ -6482,10 +6482,10 @@ "c": "\"\"\"", "t": "source.python string.regexp.quoted.multi.python punctuation.definition.string.begin.python", "r": { - "dark_plus": "string.regexp: #D16969", - "light_plus": "string.regexp: #811F3F", - "dark_vs": "string.regexp: #D16969", - "light_vs": "string.regexp: #811F3F", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string.regexp: #D16969" } }, @@ -6493,10 +6493,10 @@ "c": "interval ``", "t": "source.python string.regexp.quoted.multi.python", "r": { - "dark_plus": "string.regexp: #D16969", - "light_plus": "string.regexp: #811F3F", - "dark_vs": "string.regexp: #D16969", - "light_vs": "string.regexp: #811F3F", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string.regexp: #D16969" } }, @@ -6504,10 +6504,10 @@ "c": "[", "t": "source.python string.regexp.quoted.multi.python meta.character.set.regexp punctuation.character.set.begin.regexp constant.other.set.regexp", "r": { - "dark_plus": "punctuation.character.set.begin.regexp: #CE9178", - "light_plus": "punctuation.character.set.begin.regexp: #D16969", - "dark_vs": "string.regexp: #D16969", - "light_vs": "string.regexp: #811F3F", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string.regexp: #D16969" } }, @@ -6515,10 +6515,10 @@ "c": "1,2)`` leads to", "t": "source.python string.regexp.quoted.multi.python meta.character.set.regexp constant.character.set.regexp", "r": { - "dark_plus": "constant.character.set.regexp: #D16969", - "light_plus": "constant.character.set.regexp: #811F3F", - "dark_vs": "string.regexp: #D16969", - "light_vs": "string.regexp: #811F3F", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "constant.character: #569CD6" } }, @@ -6526,10 +6526,10 @@ "c": "\"\"\"", "t": "source.python string.regexp.quoted.multi.python punctuation.definition.string.end.python", "r": { - "dark_plus": "string.regexp: #D16969", - "light_plus": "string.regexp: #811F3F", - "dark_vs": "string.regexp: #D16969", - "light_vs": "string.regexp: #811F3F", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string.regexp: #D16969" } }, @@ -6537,10 +6537,10 @@ "c": "highlight_error ", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -6548,10 +6548,10 @@ "c": "=", "t": "source.python keyword.operator.assignment.python", "r": { - "dark_plus": "keyword.operator: #D4D4D4", - "light_plus": "keyword.operator: #000000", - "dark_vs": "keyword.operator: #D4D4D4", - "light_vs": "keyword.operator: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword.operator: #D4D4D4" } }, @@ -6559,10 +6559,10 @@ "c": " ", "t": "source.python", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -6570,10 +6570,10 @@ "c": "True", "t": "source.python constant.language.python", "r": { - "dark_plus": "constant.language: #569CD6", - "light_plus": "constant.language: #0000FF", - "dark_vs": "constant.language: #569CD6", - "light_vs": "constant.language: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "constant.language: #569CD6" } }, @@ -6581,10 +6581,10 @@ "c": "#", "t": "source.python comment.line.number-sign.python punctuation.definition.comment.python", "r": { - "dark_plus": "comment: #608B4E", - "light_plus": "comment: #008000", - "dark_vs": "comment: #608B4E", - "light_vs": "comment: #008000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "comment: #7CA668" } }, @@ -6592,10 +6592,10 @@ "c": " highlight doctests", "t": "source.python comment.line.number-sign.python", "r": { - "dark_plus": "comment: #608B4E", - "light_plus": "comment: #008000", - "dark_vs": "comment: #608B4E", - "light_vs": "comment: #008000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "comment: #7CA668" } }, @@ -6603,10 +6603,10 @@ "c": "r", "t": "source.python string.quoted.docstring.raw.multi.python storage.type.string.python", "r": { - "dark_plus": "storage.type: #569CD6", - "light_plus": "storage.type: #0000FF", - "dark_vs": "storage.type: #569CD6", - "light_vs": "storage.type: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "storage.type: #569CD6" } }, @@ -6614,10 +6614,10 @@ "c": "'''", "t": "source.python string.quoted.docstring.raw.multi.python punctuation.definition.string.begin.python", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string: #A31515", - "dark_vs": "string: #CE9178", - "light_vs": "string: #A31515", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -6625,10 +6625,10 @@ "c": "Module docstring", "t": "source.python string.quoted.docstring.raw.multi.python", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string: #A31515", - "dark_vs": "string: #CE9178", - "light_vs": "string: #A31515", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -6636,10 +6636,10 @@ "c": " Some text followed by code sample:", "t": "source.python string.quoted.docstring.raw.multi.python", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string: #A31515", - "dark_vs": "string: #CE9178", - "light_vs": "string: #A31515", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -6647,10 +6647,10 @@ "c": " ", "t": "source.python string.quoted.docstring.raw.multi.python", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string: #A31515", - "dark_vs": "string: #CE9178", - "light_vs": "string: #A31515", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -6658,10 +6658,10 @@ "c": ">>> ", "t": "source.python string.quoted.docstring.raw.multi.python keyword.control.flow.python", "r": { - "dark_plus": "keyword.control: #C586C0", - "light_plus": "keyword.control: #AF00DB", - "dark_vs": "keyword.control: #569CD6", - "light_vs": "keyword.control: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword.control: #C586C0" } }, @@ -6669,10 +6669,10 @@ "c": "for a in foo(2, b=1,", "t": "source.python string.quoted.docstring.raw.multi.python", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string: #A31515", - "dark_vs": "string: #CE9178", - "light_vs": "string: #A31515", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -6680,10 +6680,10 @@ "c": " ", "t": "source.python string.quoted.docstring.raw.multi.python", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string: #A31515", - "dark_vs": "string: #CE9178", - "light_vs": "string: #A31515", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -6691,10 +6691,10 @@ "c": "... ", "t": "source.python string.quoted.docstring.raw.multi.python keyword.control.flow.python", "r": { - "dark_plus": "keyword.control: #C586C0", - "light_plus": "keyword.control: #AF00DB", - "dark_vs": "keyword.control: #569CD6", - "light_vs": "keyword.control: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword.control: #C586C0" } }, @@ -6702,10 +6702,10 @@ "c": " c=3):", "t": "source.python string.quoted.docstring.raw.multi.python", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string: #A31515", - "dark_vs": "string: #CE9178", - "light_vs": "string: #A31515", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -6713,10 +6713,10 @@ "c": " ", "t": "source.python string.quoted.docstring.raw.multi.python", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string: #A31515", - "dark_vs": "string: #CE9178", - "light_vs": "string: #A31515", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -6724,10 +6724,10 @@ "c": "... ", "t": "source.python string.quoted.docstring.raw.multi.python keyword.control.flow.python", "r": { - "dark_plus": "keyword.control: #C586C0", - "light_plus": "keyword.control: #AF00DB", - "dark_vs": "keyword.control: #569CD6", - "light_vs": "keyword.control: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword.control: #C586C0" } }, @@ -6735,10 +6735,10 @@ "c": " print(a)", "t": "source.python string.quoted.docstring.raw.multi.python", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string: #A31515", - "dark_vs": "string: #CE9178", - "light_vs": "string: #A31515", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -6746,10 +6746,10 @@ "c": " 0", "t": "source.python string.quoted.docstring.raw.multi.python", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string: #A31515", - "dark_vs": "string: #CE9178", - "light_vs": "string: #A31515", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -6757,10 +6757,10 @@ "c": " 1", "t": "source.python string.quoted.docstring.raw.multi.python", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string: #A31515", - "dark_vs": "string: #CE9178", - "light_vs": "string: #A31515", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -6768,10 +6768,10 @@ "c": "'''", "t": "source.python string.quoted.docstring.raw.multi.python punctuation.definition.string.end.python", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string: #A31515", - "dark_vs": "string: #CE9178", - "light_vs": "string: #A31515", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } } diff --git a/extensions/r/test/colorize-results/test_r.json b/extensions/r/test/colorize-results/test_r.json index d9dfb68a0e..81c0e0c882 100644 --- a/extensions/r/test/colorize-results/test_r.json +++ b/extensions/r/test/colorize-results/test_r.json @@ -3,10 +3,10 @@ "c": "#", "t": "source.r comment.line.number-sign.r punctuation.definition.comment.r", "r": { - "dark_plus": "comment: #608B4E", - "light_plus": "comment: #008000", - "dark_vs": "comment: #608B4E", - "light_vs": "comment: #008000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "comment: #7CA668" } }, @@ -14,10 +14,10 @@ "c": " © Microsoft. All rights reserved.", "t": "source.r comment.line.number-sign.r", "r": { - "dark_plus": "comment: #608B4E", - "light_plus": "comment: #008000", - "dark_vs": "comment: #608B4E", - "light_vs": "comment: #008000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "comment: #7CA668" } }, @@ -25,10 +25,10 @@ "c": "#'", "t": "source.r comment.line.roxygen.r punctuation.definition.comment.r", "r": { - "dark_plus": "comment: #608B4E", - "light_plus": "comment: #008000", - "dark_vs": "comment: #608B4E", - "light_vs": "comment: #008000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "comment: #7CA668" } }, @@ -36,10 +36,10 @@ "c": " Add together two numbers.", "t": "source.r comment.line.roxygen.r", "r": { - "dark_plus": "comment: #608B4E", - "light_plus": "comment: #008000", - "dark_vs": "comment: #608B4E", - "light_vs": "comment: #008000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "comment: #7CA668" } }, @@ -47,10 +47,10 @@ "c": "#'", "t": "source.r comment.line.roxygen.r punctuation.definition.comment.r", "r": { - "dark_plus": "comment: #608B4E", - "light_plus": "comment: #008000", - "dark_vs": "comment: #608B4E", - "light_vs": "comment: #008000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "comment: #7CA668" } }, @@ -58,10 +58,10 @@ "c": "#'", "t": "source.r comment.line.roxygen.r punctuation.definition.comment.r", "r": { - "dark_plus": "comment: #608B4E", - "light_plus": "comment: #008000", - "dark_vs": "comment: #608B4E", - "light_vs": "comment: #008000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "comment: #7CA668" } }, @@ -69,10 +69,10 @@ "c": " ", "t": "source.r comment.line.roxygen.r", "r": { - "dark_plus": "comment: #608B4E", - "light_plus": "comment: #008000", - "dark_vs": "comment: #608B4E", - "light_vs": "comment: #008000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "comment: #7CA668" } }, @@ -80,10 +80,10 @@ "c": "@param", "t": "source.r comment.line.roxygen.r keyword.other.r", "r": { - "dark_plus": "keyword: #569CD6", - "light_plus": "keyword: #0000FF", - "dark_vs": "keyword: #569CD6", - "light_vs": "keyword: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword: #569CD6" } }, @@ -91,10 +91,10 @@ "c": " ", "t": "source.r comment.line.roxygen.r", "r": { - "dark_plus": "comment: #608B4E", - "light_plus": "comment: #008000", - "dark_vs": "comment: #608B4E", - "light_vs": "comment: #008000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "comment: #7CA668" } }, @@ -102,10 +102,10 @@ "c": "x", "t": "source.r comment.line.roxygen.r variable.parameter.r", "r": { - "dark_plus": "variable: #9CDCFE", - "light_plus": "variable: #001080", - "dark_vs": "comment: #608B4E", - "light_vs": "comment: #008000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "variable: #9CDCFE" } }, @@ -113,10 +113,10 @@ "c": " A number.", "t": "source.r comment.line.roxygen.r", "r": { - "dark_plus": "comment: #608B4E", - "light_plus": "comment: #008000", - "dark_vs": "comment: #608B4E", - "light_vs": "comment: #008000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "comment: #7CA668" } }, @@ -124,10 +124,10 @@ "c": "#'", "t": "source.r comment.line.roxygen.r punctuation.definition.comment.r", "r": { - "dark_plus": "comment: #608B4E", - "light_plus": "comment: #008000", - "dark_vs": "comment: #608B4E", - "light_vs": "comment: #008000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "comment: #7CA668" } }, @@ -135,10 +135,10 @@ "c": " ", "t": "source.r comment.line.roxygen.r", "r": { - "dark_plus": "comment: #608B4E", - "light_plus": "comment: #008000", - "dark_vs": "comment: #608B4E", - "light_vs": "comment: #008000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "comment: #7CA668" } }, @@ -146,10 +146,10 @@ "c": "@param", "t": "source.r comment.line.roxygen.r keyword.other.r", "r": { - "dark_plus": "keyword: #569CD6", - "light_plus": "keyword: #0000FF", - "dark_vs": "keyword: #569CD6", - "light_vs": "keyword: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword: #569CD6" } }, @@ -157,10 +157,10 @@ "c": " ", "t": "source.r comment.line.roxygen.r", "r": { - "dark_plus": "comment: #608B4E", - "light_plus": "comment: #008000", - "dark_vs": "comment: #608B4E", - "light_vs": "comment: #008000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "comment: #7CA668" } }, @@ -168,10 +168,10 @@ "c": "y", "t": "source.r comment.line.roxygen.r variable.parameter.r", "r": { - "dark_plus": "variable: #9CDCFE", - "light_plus": "variable: #001080", - "dark_vs": "comment: #608B4E", - "light_vs": "comment: #008000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "variable: #9CDCFE" } }, @@ -179,10 +179,10 @@ "c": " A number.", "t": "source.r comment.line.roxygen.r", "r": { - "dark_plus": "comment: #608B4E", - "light_plus": "comment: #008000", - "dark_vs": "comment: #608B4E", - "light_vs": "comment: #008000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "comment: #7CA668" } }, @@ -190,10 +190,10 @@ "c": "#'", "t": "source.r comment.line.roxygen.r punctuation.definition.comment.r", "r": { - "dark_plus": "comment: #608B4E", - "light_plus": "comment: #008000", - "dark_vs": "comment: #608B4E", - "light_vs": "comment: #008000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "comment: #7CA668" } }, @@ -201,10 +201,10 @@ "c": " ", "t": "source.r comment.line.roxygen.r", "r": { - "dark_plus": "comment: #608B4E", - "light_plus": "comment: #008000", - "dark_vs": "comment: #608B4E", - "light_vs": "comment: #008000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "comment: #7CA668" } }, @@ -212,10 +212,10 @@ "c": "@return", "t": "source.r comment.line.roxygen.r keyword.other.r", "r": { - "dark_plus": "keyword: #569CD6", - "light_plus": "keyword: #0000FF", - "dark_vs": "keyword: #569CD6", - "light_vs": "keyword: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword: #569CD6" } }, @@ -223,10 +223,10 @@ "c": " The sum of \\code{x} and \\code{y}.", "t": "source.r comment.line.roxygen.r", "r": { - "dark_plus": "comment: #608B4E", - "light_plus": "comment: #008000", - "dark_vs": "comment: #608B4E", - "light_vs": "comment: #008000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "comment: #7CA668" } }, @@ -234,10 +234,10 @@ "c": "#'", "t": "source.r comment.line.roxygen.r punctuation.definition.comment.r", "r": { - "dark_plus": "comment: #608B4E", - "light_plus": "comment: #008000", - "dark_vs": "comment: #608B4E", - "light_vs": "comment: #008000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "comment: #7CA668" } }, @@ -245,10 +245,10 @@ "c": " ", "t": "source.r comment.line.roxygen.r", "r": { - "dark_plus": "comment: #608B4E", - "light_plus": "comment: #008000", - "dark_vs": "comment: #608B4E", - "light_vs": "comment: #008000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "comment: #7CA668" } }, @@ -256,10 +256,10 @@ "c": "@examples", "t": "source.r comment.line.roxygen.r keyword.other.r", "r": { - "dark_plus": "keyword: #569CD6", - "light_plus": "keyword: #0000FF", - "dark_vs": "keyword: #569CD6", - "light_vs": "keyword: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword: #569CD6" } }, @@ -267,10 +267,10 @@ "c": "#'", "t": "source.r comment.line.roxygen.r punctuation.definition.comment.r", "r": { - "dark_plus": "comment: #608B4E", - "light_plus": "comment: #008000", - "dark_vs": "comment: #608B4E", - "light_vs": "comment: #008000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "comment: #7CA668" } }, @@ -278,10 +278,10 @@ "c": " add(1, 1)", "t": "source.r comment.line.roxygen.r", "r": { - "dark_plus": "comment: #608B4E", - "light_plus": "comment: #008000", - "dark_vs": "comment: #608B4E", - "light_vs": "comment: #008000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "comment: #7CA668" } }, @@ -289,10 +289,10 @@ "c": "#'", "t": "source.r comment.line.roxygen.r punctuation.definition.comment.r", "r": { - "dark_plus": "comment: #608B4E", - "light_plus": "comment: #008000", - "dark_vs": "comment: #608B4E", - "light_vs": "comment: #008000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "comment: #7CA668" } }, @@ -300,10 +300,10 @@ "c": " add(10, 1)", "t": "source.r comment.line.roxygen.r", "r": { - "dark_plus": "comment: #608B4E", - "light_plus": "comment: #008000", - "dark_vs": "comment: #608B4E", - "light_vs": "comment: #008000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "comment: #7CA668" } }, @@ -311,10 +311,10 @@ "c": "add", "t": "source.r meta.function.r entity.name.function.r", "r": { - "dark_plus": "entity.name.function: #DCDCAA", - "light_plus": "entity.name.function: #795E26", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "entity.name.function: #DCDCAA" } }, @@ -322,10 +322,10 @@ "c": " ", "t": "source.r meta.function.r", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -333,10 +333,10 @@ "c": "<-", "t": "source.r meta.function.r keyword.operator.assignment.r", "r": { - "dark_plus": "keyword.operator: #D4D4D4", - "light_plus": "keyword.operator: #000000", - "dark_vs": "keyword.operator: #D4D4D4", - "light_vs": "keyword.operator: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword.operator: #D4D4D4" } }, @@ -344,10 +344,10 @@ "c": " ", "t": "source.r meta.function.r", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -355,10 +355,10 @@ "c": "function", "t": "source.r meta.function.r meta.function.r keyword.control.r", "r": { - "dark_plus": "keyword.control: #C586C0", - "light_plus": "keyword.control: #AF00DB", - "dark_vs": "keyword.control: #569CD6", - "light_vs": "keyword.control: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword.control: #C586C0" } }, @@ -366,10 +366,10 @@ "c": "(", "t": "source.r meta.function.r meta.function.r punctuation.section.parens.begin.r", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -377,10 +377,10 @@ "c": "x", "t": "source.r meta.function.r meta.function.r meta.function.parameters.r variable.parameter.r", "r": { - "dark_plus": "variable: #9CDCFE", - "light_plus": "variable: #001080", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "variable: #9CDCFE" } }, @@ -388,10 +388,10 @@ "c": ",", "t": "source.r meta.function.r meta.function.r meta.function.parameters.r punctuation.separator.parameters.r", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -399,10 +399,10 @@ "c": " ", "t": "source.r meta.function.r meta.function.r meta.function.parameters.r", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -410,10 +410,10 @@ "c": "y", "t": "source.r meta.function.r meta.function.r meta.function.parameters.r variable.parameter.r", "r": { - "dark_plus": "variable: #9CDCFE", - "light_plus": "variable: #001080", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "variable: #9CDCFE" } }, @@ -421,10 +421,10 @@ "c": ")", "t": "source.r meta.function.r meta.function.r punctuation.section.parens.end.r", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -432,10 +432,10 @@ "c": " ", "t": "source.r", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -443,10 +443,10 @@ "c": "{", "t": "source.r punctuation.section.braces.begin.r", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -454,10 +454,10 @@ "c": " ", "t": "source.r", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -465,10 +465,10 @@ "c": "x", "t": "source.r variable.other.r", "r": { - "dark_plus": "variable: #9CDCFE", - "light_plus": "variable: #001080", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "variable: #9CDCFE" } }, @@ -476,10 +476,10 @@ "c": " ", "t": "source.r", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -487,10 +487,10 @@ "c": "+", "t": "source.r keyword.operator.arithmetic.r", "r": { - "dark_plus": "keyword.operator: #D4D4D4", - "light_plus": "keyword.operator: #000000", - "dark_vs": "keyword.operator: #D4D4D4", - "light_vs": "keyword.operator: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword.operator: #D4D4D4" } }, @@ -498,10 +498,10 @@ "c": " ", "t": "source.r", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -509,10 +509,10 @@ "c": "y", "t": "source.r variable.other.r", "r": { - "dark_plus": "variable: #9CDCFE", - "light_plus": "variable: #001080", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "variable: #9CDCFE" } }, @@ -520,10 +520,10 @@ "c": "}", "t": "source.r punctuation.section.braces.end.r", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -531,10 +531,10 @@ "c": "add", "t": "source.r meta.function-call.r variable.function.r", "r": { - "dark_plus": "variable: #9CDCFE", - "light_plus": "variable: #001080", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "variable: #9CDCFE" } }, @@ -542,10 +542,10 @@ "c": "(", "t": "source.r meta.function-call.r punctuation.section.parens.begin.r", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -553,10 +553,10 @@ "c": "1", "t": "source.r meta.function-call.r meta.function-call.arguments.r constant.numeric.float.decimal.r", "r": { - "dark_plus": "constant.numeric: #B5CEA8", - "light_plus": "constant.numeric: #09885A", - "dark_vs": "constant.numeric: #B5CEA8", - "light_vs": "constant.numeric: #09885A", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "constant.numeric: #B5CEA8" } }, @@ -564,10 +564,10 @@ "c": ",", "t": "source.r meta.function-call.r meta.function-call.arguments.r punctuation.separator.parameters.r", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -575,10 +575,10 @@ "c": " ", "t": "source.r meta.function-call.r meta.function-call.arguments.r", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -586,10 +586,10 @@ "c": "-", "t": "source.r meta.function-call.r meta.function-call.arguments.r keyword.operator.arithmetic.r", "r": { - "dark_plus": "keyword.operator: #D4D4D4", - "light_plus": "keyword.operator: #000000", - "dark_vs": "keyword.operator: #D4D4D4", - "light_vs": "keyword.operator: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword.operator: #D4D4D4" } }, @@ -597,10 +597,10 @@ "c": "2", "t": "source.r meta.function-call.r meta.function-call.arguments.r constant.numeric.float.decimal.r", "r": { - "dark_plus": "constant.numeric: #B5CEA8", - "light_plus": "constant.numeric: #09885A", - "dark_vs": "constant.numeric: #B5CEA8", - "light_vs": "constant.numeric: #09885A", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "constant.numeric: #B5CEA8" } }, @@ -608,10 +608,10 @@ "c": ",", "t": "source.r meta.function-call.r meta.function-call.arguments.r punctuation.separator.parameters.r", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -619,10 +619,10 @@ "c": " ", "t": "source.r meta.function-call.r meta.function-call.arguments.r", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -630,10 +630,10 @@ "c": "2.0", "t": "source.r meta.function-call.r meta.function-call.arguments.r constant.numeric.float.decimal.r", "r": { - "dark_plus": "constant.numeric: #B5CEA8", - "light_plus": "constant.numeric: #09885A", - "dark_vs": "constant.numeric: #B5CEA8", - "light_vs": "constant.numeric: #09885A", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "constant.numeric: #B5CEA8" } }, @@ -641,10 +641,10 @@ "c": ")", "t": "source.r meta.function-call.r punctuation.definition.parameters.r", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -652,10 +652,10 @@ "c": "add", "t": "source.r meta.function-call.r variable.function.r", "r": { - "dark_plus": "variable: #9CDCFE", - "light_plus": "variable: #001080", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "variable: #9CDCFE" } }, @@ -663,10 +663,10 @@ "c": "(", "t": "source.r meta.function-call.r punctuation.section.parens.begin.r", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -674,10 +674,10 @@ "c": "1.0e10", "t": "source.r meta.function-call.r meta.function-call.arguments.r constant.numeric.float.decimal.r", "r": { - "dark_plus": "constant.numeric: #B5CEA8", - "light_plus": "constant.numeric: #09885A", - "dark_vs": "constant.numeric: #B5CEA8", - "light_vs": "constant.numeric: #09885A", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "constant.numeric: #B5CEA8" } }, @@ -685,10 +685,10 @@ "c": ",", "t": "source.r meta.function-call.r meta.function-call.arguments.r punctuation.separator.parameters.r", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -696,10 +696,10 @@ "c": " ", "t": "source.r meta.function-call.r meta.function-call.arguments.r", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -707,10 +707,10 @@ "c": "2.0e10", "t": "source.r meta.function-call.r meta.function-call.arguments.r constant.numeric.float.decimal.r", "r": { - "dark_plus": "constant.numeric: #B5CEA8", - "light_plus": "constant.numeric: #09885A", - "dark_vs": "constant.numeric: #B5CEA8", - "light_vs": "constant.numeric: #09885A", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "constant.numeric: #B5CEA8" } }, @@ -718,10 +718,10 @@ "c": ")", "t": "source.r meta.function-call.r punctuation.definition.parameters.r", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -729,10 +729,10 @@ "c": "paste", "t": "source.r support.function.r", "r": { - "dark_plus": "support.function: #DCDCAA", - "light_plus": "support.function: #795E26", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "support.function: #DCDCAA" } }, @@ -740,10 +740,10 @@ "c": "(", "t": "source.r", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -751,10 +751,10 @@ "c": "\"", "t": "source.r string.quoted.double.r punctuation.definition.string.begin.r", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string: #A31515", - "dark_vs": "string: #CE9178", - "light_vs": "string: #A31515", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -762,10 +762,10 @@ "c": "one", "t": "source.r string.quoted.double.r", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string: #A31515", - "dark_vs": "string: #CE9178", - "light_vs": "string: #A31515", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -773,10 +773,10 @@ "c": "\"", "t": "source.r string.quoted.double.r punctuation.definition.string.end.r", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string: #A31515", - "dark_vs": "string: #CE9178", - "light_vs": "string: #A31515", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -784,10 +784,10 @@ "c": ", ", "t": "source.r", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -795,10 +795,10 @@ "c": "NULL", "t": "source.r constant.language.r", "r": { - "dark_plus": "constant.language: #569CD6", - "light_plus": "constant.language: #0000FF", - "dark_vs": "constant.language: #569CD6", - "light_vs": "constant.language: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "constant.language: #569CD6" } }, @@ -806,10 +806,10 @@ "c": ")", "t": "source.r", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -817,10 +817,10 @@ "c": "paste", "t": "source.r support.function.r", "r": { - "dark_plus": "support.function: #DCDCAA", - "light_plus": "support.function: #795E26", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "support.function: #DCDCAA" } }, @@ -828,10 +828,10 @@ "c": "(", "t": "source.r", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -839,10 +839,10 @@ "c": "NA", "t": "source.r constant.language.r", "r": { - "dark_plus": "constant.language: #569CD6", - "light_plus": "constant.language: #0000FF", - "dark_vs": "constant.language: #569CD6", - "light_vs": "constant.language: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "constant.language: #569CD6" } }, @@ -850,10 +850,10 @@ "c": ", ", "t": "source.r", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -861,10 +861,10 @@ "c": "'", "t": "source.r string.quoted.single.r punctuation.definition.string.begin.r", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string: #A31515", - "dark_vs": "string: #CE9178", - "light_vs": "string: #A31515", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -872,10 +872,10 @@ "c": "two", "t": "source.r string.quoted.single.r", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string: #A31515", - "dark_vs": "string: #CE9178", - "light_vs": "string: #A31515", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -883,10 +883,10 @@ "c": "'", "t": "source.r string.quoted.single.r punctuation.definition.string.end.r", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string: #A31515", - "dark_vs": "string: #CE9178", - "light_vs": "string: #A31515", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -894,10 +894,10 @@ "c": ")", "t": "source.r", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -905,10 +905,10 @@ "c": "paste", "t": "source.r support.function.r", "r": { - "dark_plus": "support.function: #DCDCAA", - "light_plus": "support.function: #795E26", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "support.function: #DCDCAA" } }, @@ -916,10 +916,10 @@ "c": "(", "t": "source.r", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -927,10 +927,10 @@ "c": "\"", "t": "source.r string.quoted.double.r punctuation.definition.string.begin.r", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string: #A31515", - "dark_vs": "string: #CE9178", - "light_vs": "string: #A31515", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -938,10 +938,10 @@ "c": "multi-", "t": "source.r string.quoted.double.r", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string: #A31515", - "dark_vs": "string: #CE9178", - "light_vs": "string: #A31515", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -949,10 +949,10 @@ "c": " line", "t": "source.r string.quoted.double.r", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string: #A31515", - "dark_vs": "string: #CE9178", - "light_vs": "string: #A31515", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -960,10 +960,10 @@ "c": "\"", "t": "source.r string.quoted.double.r punctuation.definition.string.end.r", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string: #A31515", - "dark_vs": "string: #CE9178", - "light_vs": "string: #A31515", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -971,10 +971,10 @@ "c": ",", "t": "source.r", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -982,10 +982,10 @@ "c": " ", "t": "source.r", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -993,10 +993,10 @@ "c": "'", "t": "source.r string.quoted.single.r punctuation.definition.string.begin.r", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string: #A31515", - "dark_vs": "string: #CE9178", - "light_vs": "string: #A31515", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -1004,10 +1004,10 @@ "c": "multi-", "t": "source.r string.quoted.single.r", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string: #A31515", - "dark_vs": "string: #CE9178", - "light_vs": "string: #A31515", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -1015,10 +1015,10 @@ "c": " line", "t": "source.r string.quoted.single.r", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string: #A31515", - "dark_vs": "string: #CE9178", - "light_vs": "string: #A31515", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -1026,10 +1026,10 @@ "c": "'", "t": "source.r string.quoted.single.r punctuation.definition.string.end.r", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string: #A31515", - "dark_vs": "string: #CE9178", - "light_vs": "string: #A31515", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -1037,10 +1037,10 @@ "c": ")", "t": "source.r", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } } diff --git a/extensions/search-rg/.vscodeignore b/extensions/search-rg/.vscodeignore new file mode 100644 index 0000000000..d257eda277 --- /dev/null +++ b/extensions/search-rg/.vscodeignore @@ -0,0 +1,4 @@ +build/** +src/** +test/** +tsconfig.json \ No newline at end of file diff --git a/extensions/search-rg/package.json b/extensions/search-rg/package.json new file mode 100644 index 0000000000..c4621670df --- /dev/null +++ b/extensions/search-rg/package.json @@ -0,0 +1,44 @@ +{ + "name": "search-rg", + "description": "%description%", + "displayName": "%displayName%", + "version": "1.0.0", + "author": "vscode", + "publisher": "vscode", + "license": "MIT", + "aiKey": "AIF-d9b70cd4-b9f9-4d70-929b-a071c400b217", + "enableProposedApi": true, + "engines": { + "vscode": "*" + }, + "categories": [], + "dependencies": { + "vscode-extension-telemetry": "0.0.18", + "vscode-nls": "^3.2.4", + "vscode-ripgrep": "^1.0.1" + }, + "devDependencies": { + "@types/node": "8.0.33", + "@types/semver": "5.4.0", + "vscode": "^1.1.17" + }, + "scripts": {}, + "activationEvents": [ + "onSearch:file", + "*" + ], + "main": "./out/extension", + "contributes": { + "configuration": { + "title": "Search (ripgrep)", + "properties": { + "searchRipgrep.enable": { + "type": "boolean", + "default": false, + "scope": "window", + "description": "%searchRipgrep.enable.description%" + } + } + } + } +} diff --git a/extensions/search-rg/package.nls.json b/extensions/search-rg/package.nls.json new file mode 100644 index 0000000000..30173a4734 --- /dev/null +++ b/extensions/search-rg/package.nls.json @@ -0,0 +1,5 @@ +{ + "displayName": "Search (ripgrep)", + "description": "Provides search using Ripgrep.", + "searchRipgrep.enable.description": "(Experimental) Enable this experimental search provider extension. When enabled, it takes precedence over vscode's built-in search." +} \ No newline at end of file diff --git a/extensions/search-rg/src/extension.ts b/extensions/search-rg/src/extension.ts new file mode 100644 index 0000000000..a1fa0fb2a4 --- /dev/null +++ b/extensions/search-rg/src/extension.ts @@ -0,0 +1,57 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the Source EULA. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import * as vscode from 'vscode'; +import { RipgrepFileSearchEngine } from './ripgrepFileSearch'; +import { RipgrepTextSearchEngine } from './ripgrepTextSearch'; +import { joinPath } from './utils'; + +export function activate(): void { + if (vscode.workspace.getConfiguration('searchRipgrep').get('enable')) { + const outputChannel = vscode.window.createOutputChannel('search-rg'); + + const provider = new RipgrepSearchProvider(outputChannel); + vscode.workspace.registerFileIndexProvider('file', provider); + vscode.workspace.registerTextSearchProvider('file', provider); + } +} + +type SearchEngine = RipgrepFileSearchEngine | RipgrepTextSearchEngine; + +class RipgrepSearchProvider implements vscode.FileIndexProvider, vscode.TextSearchProvider { + private inProgress: Set = new Set(); + + constructor(private outputChannel: vscode.OutputChannel) { + process.once('exit', () => this.dispose()); + } + + provideTextSearchResults(query: vscode.TextSearchQuery, options: vscode.TextSearchOptions, progress: vscode.Progress, token: vscode.CancellationToken): Thenable { + const engine = new RipgrepTextSearchEngine(this.outputChannel); + return this.withEngine(engine, () => engine.provideTextSearchResults(query, options, progress, token)); + } + + provideFileIndex(options: vscode.FileSearchOptions, token: vscode.CancellationToken): Thenable { + const engine = new RipgrepFileSearchEngine(this.outputChannel); + + const results: vscode.Uri[] = []; + const onResult = relativePathMatch => { + results.push(joinPath(options.folder, relativePathMatch)); + }; + + return this.withEngine(engine, () => engine.provideFileSearchResults(options, { report: onResult }, token)) + .then(() => results); + } + + private withEngine(engine: SearchEngine, fn: () => Thenable): Thenable { + this.inProgress.add(engine); + return fn().then(() => { + this.inProgress.delete(engine); + }); + } + + private dispose() { + this.inProgress.forEach(engine => engine.cancel()); + } +} \ No newline at end of file diff --git a/extensions/search-rg/src/normalization.ts b/extensions/search-rg/src/normalization.ts new file mode 100644 index 0000000000..98fcef6556 --- /dev/null +++ b/extensions/search-rg/src/normalization.ts @@ -0,0 +1,36 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the Source EULA. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +/** + * The normalize() method returns the Unicode Normalization Form of a given string. The form will be + * the Normalization Form Canonical Composition. + * + * @see {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/normalize} + */ +export const canNormalize = typeof (('').normalize) === 'function'; + +export function normalizeNFC(str: string): string { + return normalize(str, 'NFC'); +} + +export function normalizeNFD(str: string): string { + return normalize(str, 'NFD'); +} + +const nonAsciiCharactersPattern = /[^\u0000-\u0080]/; +function normalize(str: string, form: string): string { + if (!canNormalize || !str) { + return str; + } + + let res: string; + if (nonAsciiCharactersPattern.test(str)) { + res = (str).normalize(form); + } else { + res = str; + } + + return res; +} diff --git a/src/vs/workbench/browser/parts/editor/media/editorpart.css b/extensions/search-rg/src/ripgrep.ts similarity index 66% rename from src/vs/workbench/browser/parts/editor/media/editorpart.css rename to extensions/search-rg/src/ripgrep.ts index c4d41675ad..f28953a68d 100644 --- a/src/vs/workbench/browser/parts/editor/media/editorpart.css +++ b/extensions/search-rg/src/ripgrep.ts @@ -3,9 +3,8 @@ * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -/** Letter press styling for empty editor */ -.monaco-workbench > .part.editor.empty { - background-repeat: no-repeat; - background-position: 50% 50%; - background-size: 260px 260px; -} \ No newline at end of file +'use strict'; + +import { rgPath } from 'vscode-ripgrep'; + +export { rgPath }; \ No newline at end of file diff --git a/extensions/search-rg/src/ripgrepFileSearch.ts b/extensions/search-rg/src/ripgrepFileSearch.ts new file mode 100644 index 0000000000..732249b710 --- /dev/null +++ b/extensions/search-rg/src/ripgrepFileSearch.ts @@ -0,0 +1,213 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the Source EULA. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import * as cp from 'child_process'; +import { Readable } from 'stream'; +import { NodeStringDecoder, StringDecoder } from 'string_decoder'; +import * as vscode from 'vscode'; +import { normalizeNFC, normalizeNFD } from './normalization'; +import { rgPath } from './ripgrep'; +import { rgErrorMsgForDisplay } from './ripgrepTextSearch'; +import { anchorGlob } from './utils'; + +const isMac = process.platform === 'darwin'; + +// If vscode-ripgrep is in an .asar file, then the binary is unpacked. +const rgDiskPath = rgPath.replace(/\bnode_modules\.asar\b/, 'node_modules.asar.unpacked'); + +export class RipgrepFileSearchEngine { + private rgProc: cp.ChildProcess; + private isDone: boolean; + + constructor(private outputChannel: vscode.OutputChannel) { } + + cancel() { + this.isDone = true; + if (this.rgProc) { + this.rgProc.kill(); + } + } + + provideFileSearchResults(options: vscode.FileSearchOptions, progress: vscode.Progress, token: vscode.CancellationToken): Thenable { + this.outputChannel.appendLine(`provideFileSearchResults ${JSON.stringify({ + ...options, + ...{ + folder: options.folder.toString() + } + })}`); + + return new Promise((resolve, reject) => { + token.onCancellationRequested(() => this.cancel()); + + const rgArgs = getRgArgs(options); + + const cwd = options.folder.fsPath; + + const escapedArgs = rgArgs + .map(arg => arg.match(/^-/) ? arg : `'${arg}'`) + .join(' '); + this.outputChannel.appendLine(`rg ${escapedArgs}\n - cwd: ${cwd}\n`); + + this.rgProc = cp.spawn(rgDiskPath, rgArgs, { cwd }); + + this.rgProc.on('error', e => { + console.log(e); + reject(e); + }); + + let leftover = ''; + this.collectStdout(this.rgProc, (err, stdout, last) => { + if (err) { + reject(err); + return; + } + + // Mac: uses NFD unicode form on disk, but we want NFC + const normalized = leftover + (isMac ? normalizeNFC(stdout) : stdout); + const relativeFiles = normalized.split('\n'); + + if (last) { + const n = relativeFiles.length; + relativeFiles[n - 1] = relativeFiles[n - 1].trim(); + if (!relativeFiles[n - 1]) { + relativeFiles.pop(); + } + } else { + leftover = relativeFiles.pop(); + } + + if (relativeFiles.length && relativeFiles[0].indexOf('\n') !== -1) { + reject(new Error('Splitting up files failed')); + return; + } + + relativeFiles.forEach(relativeFile => { + progress.report(relativeFile); + }); + + if (last) { + if (this.isDone) { + resolve(); + } else { + // Trigger last result + this.rgProc = null; + if (err) { + reject(err); + } else { + resolve(); + } + } + } + }); + }); + } + + private collectStdout(cmd: cp.ChildProcess, cb: (err: Error, stdout?: string, last?: boolean) => void): void { + let onData = (err: Error, stdout?: string, last?: boolean) => { + if (err || last) { + onData = () => { }; + } + + cb(err, stdout, last); + }; + + let gotData = false; + if (cmd.stdout) { + // Should be non-null, but #38195 + this.forwardData(cmd.stdout, onData); + cmd.stdout.once('data', () => gotData = true); + } else { + this.outputChannel.appendLine('stdout is null'); + } + + let stderr: Buffer[]; + if (cmd.stderr) { + // Should be non-null, but #38195 + stderr = this.collectData(cmd.stderr); + } else { + this.outputChannel.appendLine('stderr is null'); + } + + cmd.on('error', (err: Error) => { + onData(err); + }); + + cmd.on('close', (code: number) => { + // ripgrep returns code=1 when no results are found + let stderrText, displayMsg: string; + if (!gotData && (stderrText = this.decodeData(stderr)) && (displayMsg = rgErrorMsgForDisplay(stderrText))) { + onData(new Error(`command failed with error code ${code}: ${displayMsg}`)); + } else { + onData(null, '', true); + } + }); + } + + private forwardData(stream: Readable, cb: (err: Error, stdout?: string) => void): NodeStringDecoder { + const decoder = new StringDecoder(); + stream.on('data', (data: Buffer) => { + cb(null, decoder.write(data)); + }); + return decoder; + } + + private collectData(stream: Readable): Buffer[] { + const buffers: Buffer[] = []; + stream.on('data', (data: Buffer) => { + buffers.push(data); + }); + return buffers; + } + + private decodeData(buffers: Buffer[]): string { + const decoder = new StringDecoder(); + return buffers.map(buffer => decoder.write(buffer)).join(''); + } +} + +function getRgArgs(options: vscode.FileSearchOptions): string[] { + const args = ['--files', '--hidden', '--case-sensitive']; + + options.includes.forEach(globArg => { + const inclusion = anchorGlob(globArg); + args.push('-g', inclusion); + if (isMac) { + const normalized = normalizeNFD(inclusion); + if (normalized !== inclusion) { + args.push('-g', normalized); + } + } + }); + + options.excludes.forEach(globArg => { + const exclusion = `!${anchorGlob(globArg)}`; + args.push('-g', exclusion); + if (isMac) { + const normalized = normalizeNFD(exclusion); + if (normalized !== exclusion) { + args.push('-g', normalized); + } + } + }); + + if (options.useIgnoreFiles) { + args.push('--no-ignore-parent'); + } else { + // Don't use .gitignore or .ignore + args.push('--no-ignore'); + } + + // Follow symlinks + if (options.followSymlinks) { + args.push('--follow'); + } + + // Folder to search + args.push('--'); + + args.push('.'); + + return args; +} diff --git a/extensions/search-rg/src/ripgrepTextSearch.ts b/extensions/search-rg/src/ripgrepTextSearch.ts new file mode 100644 index 0000000000..df0da7d741 --- /dev/null +++ b/extensions/search-rg/src/ripgrepTextSearch.ts @@ -0,0 +1,448 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the Source EULA. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +'use strict'; + +import * as cp from 'child_process'; +import { EventEmitter } from 'events'; +import * as path from 'path'; +import { NodeStringDecoder, StringDecoder } from 'string_decoder'; +import * as vscode from 'vscode'; +import { rgPath } from './ripgrep'; +import { anchorGlob } from './utils'; + +// If vscode-ripgrep is in an .asar file, then the binary is unpacked. +const rgDiskPath = rgPath.replace(/\bnode_modules\.asar\b/, 'node_modules.asar.unpacked'); + +// TODO@roblou move to SearchService +const MAX_TEXT_RESULTS = 10000; + +export class RipgrepTextSearchEngine { + private isDone = false; + private rgProc: cp.ChildProcess; + + private ripgrepParser: RipgrepParser; + + constructor(private outputChannel: vscode.OutputChannel) { } + + cancel() { + this.isDone = true; + + if (this.rgProc) { + this.rgProc.kill(); + } + + if (this.ripgrepParser) { + this.ripgrepParser.cancel(); + } + } + + provideTextSearchResults(query: vscode.TextSearchQuery, options: vscode.TextSearchOptions, progress: vscode.Progress, token: vscode.CancellationToken): Thenable { + this.outputChannel.appendLine(`provideTextSearchResults ${query.pattern}, ${JSON.stringify({ + ...options, + ...{ + folder: options.folder.toString() + } + })}`); + + return new Promise((resolve, reject) => { + token.onCancellationRequested(() => this.cancel()); + + const rgArgs = getRgArgs(query, options); + + const cwd = options.folder.fsPath; + + const escapedArgs = rgArgs + .map(arg => arg.match(/^-/) ? arg : `'${arg}'`) + .join(' '); + this.outputChannel.appendLine(`rg ${escapedArgs}\n - cwd: ${cwd}`); + + this.rgProc = cp.spawn(rgDiskPath, rgArgs, { cwd }); + this.rgProc.on('error', e => { + console.error(e); + this.outputChannel.append('Error: ' + (e && e.message)); + reject(e); + }); + + let gotResult = false; + this.ripgrepParser = new RipgrepParser(MAX_TEXT_RESULTS, cwd); + this.ripgrepParser.on('result', (match: vscode.TextSearchResult) => { + gotResult = true; + progress.report(match); + }); + + this.ripgrepParser.on('hitLimit', () => { + this.cancel(); + }); + + this.rgProc.stdout.on('data', data => { + this.ripgrepParser.handleData(data); + }); + + let gotData = false; + this.rgProc.stdout.once('data', () => gotData = true); + + let stderr = ''; + this.rgProc.stderr.on('data', data => { + const message = data.toString(); + this.outputChannel.append(message); + stderr += message; + }); + + this.rgProc.on('close', code => { + this.outputChannel.appendLine(gotData ? 'Got data from stdout' : 'No data from stdout'); + this.outputChannel.appendLine(gotResult ? 'Got result from parser' : 'No result from parser'); + this.outputChannel.appendLine(''); + if (this.isDone) { + resolve(); + } else { + // Trigger last result + this.ripgrepParser.flush(); + this.rgProc = null; + let displayMsg: string; + if (stderr && !gotData && (displayMsg = rgErrorMsgForDisplay(stderr))) { + reject(new Error(displayMsg)); + } else { + resolve(); + } + } + }); + }); + } +} + +/** + * Read the first line of stderr and return an error for display or undefined, based on a whitelist. + * Ripgrep produces stderr output which is not from a fatal error, and we only want the search to be + * "failed" when a fatal error was produced. + */ +export function rgErrorMsgForDisplay(msg: string): string | undefined { + const firstLine = msg.split('\n')[0].trim(); + + if (firstLine.startsWith('Error parsing regex')) { + return firstLine; + } + + if (firstLine.startsWith('error parsing glob') || + firstLine.startsWith('unsupported encoding')) { + // Uppercase first letter + return firstLine.charAt(0).toUpperCase() + firstLine.substr(1); + } + + if (firstLine === `Literal '\\n' not allowed.`) { + // I won't localize this because none of the Ripgrep error messages are localized + return `Literal '\\n' currently not supported`; + } + + if (firstLine.startsWith('Literal ')) { + // Other unsupported chars + return firstLine; + } + + return undefined; +} + +export class RipgrepParser extends EventEmitter { + private static readonly RESULT_REGEX = /^\u001b\[0m(\d+)\u001b\[0m:(.*)(\r?)/; + private static readonly FILE_REGEX = /^\u001b\[0m(.+)\u001b\[0m$/; + private static readonly ESC_CODE = '\u001b'.charCodeAt(0); + + // public for test + public static readonly MATCH_START_MARKER = '\u001b[0m\u001b[31m'; + public static readonly MATCH_END_MARKER = '\u001b[0m'; + + private currentFile: string; + private remainder: string; + private isDone: boolean; + private stringDecoder: NodeStringDecoder; + + private numResults = 0; + + constructor(private maxResults: number, private rootFolder: string) { + super(); + this.stringDecoder = new StringDecoder(); + } + + public cancel(): void { + this.isDone = true; + } + + public flush(): void { + this.handleDecodedData(this.stringDecoder.end()); + } + + public handleData(data: Buffer | string): void { + const dataStr = typeof data === 'string' ? data : this.stringDecoder.write(data); + this.handleDecodedData(dataStr); + } + + private handleDecodedData(decodedData: string): void { + // If the previous data chunk didn't end in a newline, prepend it to this chunk + const dataStr = this.remainder ? + this.remainder + decodedData : + decodedData; + + const dataLines: string[] = dataStr.split(/\r\n|\n/); + this.remainder = dataLines[dataLines.length - 1] ? dataLines.pop() : null; + + for (let l = 0; l < dataLines.length; l++) { + const outputLine = dataLines[l].trim(); + if (this.isDone) { + break; + } + + let r: RegExpMatchArray; + if (r = outputLine.match(RipgrepParser.RESULT_REGEX)) { + const lineNum = parseInt(r[1]) - 1; + let matchText = r[2]; + + // workaround https://github.com/BurntSushi/ripgrep/issues/416 + // If the match line ended with \r, append a match end marker so the match isn't lost + if (r[3]) { + matchText += RipgrepParser.MATCH_END_MARKER; + } + + // Line is a result - add to collected results for the current file path + this.handleMatchLine(outputLine, lineNum, matchText); + } else if (r = outputLine.match(RipgrepParser.FILE_REGEX)) { + this.currentFile = r[1]; + } else { + // Line is empty (or malformed) + } + } + } + + private handleMatchLine(outputLine: string, lineNum: number, lineText: string): void { + if (lineNum === 0) { + lineText = stripUTF8BOM(lineText); + } + + // if (!this.currentFile) { + // // When searching a single file and no folderQueries, rg does not print the file line, so create it here + // const singleFile = this.extraSearchFiles[0]; + // if (!singleFile) { + // throw new Error('Got match line for unknown file'); + // } + + // this.currentFile = this.getFileUri(singleFile); + // } + + let lastMatchEndPos = 0; + let matchTextStartPos = -1; + + // Track positions with color codes subtracted - offsets in the final text preview result + let matchTextStartRealIdx = -1; + let textRealIdx = 0; + let hitLimit = false; + + const realTextParts: string[] = []; + + const lineMatches: vscode.Range[] = []; + + for (let i = 0; i < lineText.length - (RipgrepParser.MATCH_END_MARKER.length - 1);) { + if (lineText.charCodeAt(i) === RipgrepParser.ESC_CODE) { + if (lineText.substr(i, RipgrepParser.MATCH_START_MARKER.length) === RipgrepParser.MATCH_START_MARKER) { + // Match start + const chunk = lineText.slice(lastMatchEndPos, i); + realTextParts.push(chunk); + i += RipgrepParser.MATCH_START_MARKER.length; + matchTextStartPos = i; + matchTextStartRealIdx = textRealIdx; + } else if (lineText.substr(i, RipgrepParser.MATCH_END_MARKER.length) === RipgrepParser.MATCH_END_MARKER) { + // Match end + const chunk = lineText.slice(matchTextStartPos, i); + realTextParts.push(chunk); + if (!hitLimit) { + const startCol = matchTextStartRealIdx; + const endCol = textRealIdx; + + // actually have to finish parsing the line, and use the real ones + lineMatches.push(new vscode.Range(lineNum, startCol, lineNum, endCol)); + } + + matchTextStartPos = -1; + matchTextStartRealIdx = -1; + i += RipgrepParser.MATCH_END_MARKER.length; + lastMatchEndPos = i; + this.numResults++; + + // Check hit maxResults limit + if (this.numResults >= this.maxResults) { + // Finish the line, then report the result below + hitLimit = true; + } + } else { + // ESC char in file + i++; + textRealIdx++; + } + } else { + // Some other char + i++; + textRealIdx++; + } + } + + const chunk = lineText.slice(lastMatchEndPos); + realTextParts.push(chunk); + + // Get full real text line without color codes + const preview = realTextParts.join(''); + + lineMatches + .map(range => { + return { + uri: vscode.Uri.file(path.join(this.rootFolder, this.currentFile)), + range, + preview: { + text: preview, + match: new vscode.Range(0, range.start.character, 0, range.end.character) + } + }; + }) + .forEach(match => this.onResult(match)); + + if (hitLimit) { + this.cancel(); + this.emit('hitLimit'); + } + } + + private onResult(match: vscode.TextSearchResult): void { + this.emit('result', match); + } +} + +function getRgArgs(query: vscode.TextSearchQuery, options: vscode.TextSearchOptions): string[] { + const args = ['--hidden', '--heading', '--line-number', '--color', 'ansi', '--colors', 'path:none', '--colors', 'line:none', '--colors', 'match:fg:red', '--colors', 'match:style:nobold']; + args.push(query.isCaseSensitive ? '--case-sensitive' : '--ignore-case'); + + options.includes + .map(anchorGlob) + .forEach(globArg => args.push('-g', globArg)); + + options.excludes + .map(anchorGlob) + .forEach(rgGlob => args.push('-g', `!${rgGlob}`)); + + if (options.maxFileSize) { + args.push('--max-filesize', options.maxFileSize + ''); + } + + if (options.useIgnoreFiles) { + args.push('--no-ignore-parent'); + } else { + // Don't use .gitignore or .ignore + args.push('--no-ignore'); + } + + if (options.followSymlinks) { + args.push('--follow'); + } + + if (options.encoding) { + args.push('--encoding', options.encoding); + } + + // Ripgrep handles -- as a -- arg separator. Only --. + // - is ok, --- is ok, --some-flag is handled as query text. Need to special case. + if (query.pattern === '--') { + query.isRegExp = true; + query.pattern = '\\-\\-'; + } + + let searchPatternAfterDoubleDashes: string; + if (query.isWordMatch) { + const regexp = createRegExp(query.pattern, query.isRegExp, { wholeWord: query.isWordMatch }); + const regexpStr = regexp.source.replace(/\\\//g, '/'); // RegExp.source arbitrarily returns escaped slashes. Search and destroy. + args.push('--regexp', regexpStr); + } else if (query.isRegExp) { + args.push('--regexp', fixRegexEndingPattern(query.pattern)); + } else { + searchPatternAfterDoubleDashes = query.pattern; + args.push('--fixed-strings'); + } + + args.push('--no-config'); + + // Folder to search + args.push('--'); + + if (searchPatternAfterDoubleDashes) { + // Put the query after --, in case the query starts with a dash + args.push(searchPatternAfterDoubleDashes); + } + + args.push('.'); + + return args; +} + +// TODO@roblou organize away + +interface RegExpOptions { + matchCase?: boolean; + wholeWord?: boolean; + multiline?: boolean; + global?: boolean; +} + +function createRegExp(searchString: string, isRegex: boolean, options: RegExpOptions = {}): RegExp { + if (!searchString) { + throw new Error('Cannot create regex from empty string'); + } + if (!isRegex) { + searchString = escapeRegExpCharacters(searchString); + } + if (options.wholeWord) { + if (!/\B/.test(searchString.charAt(0))) { + searchString = '\\b' + searchString; + } + if (!/\B/.test(searchString.charAt(searchString.length - 1))) { + searchString = searchString + '\\b'; + } + } + let modifiers = ''; + if (options.global) { + modifiers += 'g'; + } + if (!options.matchCase) { + modifiers += 'i'; + } + if (options.multiline) { + modifiers += 'm'; + } + + return new RegExp(searchString, modifiers); +} + +/** + * Escapes regular expression characters in a given string + */ +function escapeRegExpCharacters(value: string): string { + return value.replace(/[\-\\\{\}\*\+\?\|\^\$\.\[\]\(\)\#]/g, '\\$&'); +} + +// -- UTF-8 BOM + +const UTF8_BOM = 65279; + +const UTF8_BOM_CHARACTER = String.fromCharCode(UTF8_BOM); + +function startsWithUTF8BOM(str: string): boolean { + return (str && str.length > 0 && str.charCodeAt(0) === UTF8_BOM); +} + +function stripUTF8BOM(str: string): string { + return startsWithUTF8BOM(str) ? str.substr(1) : str; +} + +function fixRegexEndingPattern(pattern: string): string { + // Replace an unescaped $ at the end of the pattern with \r?$ + // Match $ preceeded by none or even number of literal \ + return pattern.match(/([^\\]|^)(\\\\)*\$$/) ? + pattern.replace(/\$$/, '\\r?$') : + pattern; +} \ No newline at end of file diff --git a/extensions/search-rg/src/test/index.ts b/extensions/search-rg/src/test/index.ts new file mode 100644 index 0000000000..cd9d72c91c --- /dev/null +++ b/extensions/search-rg/src/test/index.ts @@ -0,0 +1,28 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the Source EULA. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +// +// PLEASE DO NOT MODIFY / DELETE UNLESS YOU KNOW WHAT YOU ARE DOING +// +// This file is providing the test runner to use when running extension tests. +// By default the test runner in use is Mocha based. +// +// You can provide your own test runner if you want to override it by exporting +// a function run(testRoot: string, clb: (error:Error) => void) that the extension +// host can call to run the tests. The test runner is expected to use console.log +// to report the results back to the caller. When the tests are finished, return +// a possible error to the callback or null if none. + +const testRunner = require('vscode/lib/testrunner'); + +// You can directly control Mocha options by uncommenting the following lines +// See https://github.com/mochajs/mocha/wiki/Using-mocha-programmatically#set-options for more info +testRunner.configure({ + ui: 'tdd', // the TDD UI is being used in extension.test.ts (suite, test, etc.) + useColors: process.platform !== 'win32', // colored output from test results (only windows cannot handle) + timeout: 60000 +}); + +export = testRunner; diff --git a/extensions/search-rg/src/typings/ref.d.ts b/extensions/search-rg/src/typings/ref.d.ts new file mode 100644 index 0000000000..37d9f00e11 --- /dev/null +++ b/extensions/search-rg/src/typings/ref.d.ts @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the Source EULA. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +/// +/// +/// diff --git a/extensions/search-rg/src/utils.ts b/extensions/search-rg/src/utils.ts new file mode 100644 index 0000000000..1a0ea9d3a9 --- /dev/null +++ b/extensions/search-rg/src/utils.ts @@ -0,0 +1,25 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the Source EULA. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +'use strict'; + +import * as path from 'path'; +import * as vscode from 'vscode'; + +export function fixDriveC(_path: string): string { + const root = path.parse(_path).root; + return root.toLowerCase() === 'c:/' ? + _path.replace(/^c:[/\\]/i, '/') : + _path; +} + +export function anchorGlob(glob: string): string { + return glob.startsWith('**') || glob.startsWith('/') ? glob : `/${glob}`; +} + +export function joinPath(resource: vscode.Uri, pathFragment: string): vscode.Uri { + const joinedPath = path.join(resource.fsPath || '/', pathFragment); + return vscode.Uri.file(joinedPath); +} diff --git a/extensions/search-rg/tsconfig.json b/extensions/search-rg/tsconfig.json new file mode 100644 index 0000000000..572f8ef91d --- /dev/null +++ b/extensions/search-rg/tsconfig.json @@ -0,0 +1,15 @@ +{ + "compilerOptions": { + "target": "es5", + "module": "commonjs", + "lib": [ + "es6", + "es2015.promise" + ], + "outDir": "./out", + "experimentalDecorators": true + }, + "include": [ + "src/**/*" + ] +} \ No newline at end of file diff --git a/extensions/search-rg/yarn.lock b/extensions/search-rg/yarn.lock new file mode 100644 index 0000000000..1be6ca92db --- /dev/null +++ b/extensions/search-rg/yarn.lock @@ -0,0 +1,1598 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@types/node@8.0.33": + version "8.0.33" + resolved "https://registry.yarnpkg.com/@types/node/-/node-8.0.33.tgz#1126e94374014e54478092830704f6ea89df04cd" + +"@types/semver@5.4.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@types/semver/-/semver-5.4.0.tgz#f3658535af7f1f502acd6da7daf405ffeb1f7ee4" + +ajv@^5.1.0: + version "5.5.2" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965" + dependencies: + co "^4.6.0" + fast-deep-equal "^1.0.0" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.3.0" + +ansi-cyan@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/ansi-cyan/-/ansi-cyan-0.1.1.tgz#538ae528af8982f28ae30d86f2f17456d2609873" + dependencies: + ansi-wrap "0.1.0" + +ansi-gray@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/ansi-gray/-/ansi-gray-0.1.1.tgz#2962cf54ec9792c48510a3deb524436861ef7251" + dependencies: + ansi-wrap "0.1.0" + +ansi-red@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/ansi-red/-/ansi-red-0.1.1.tgz#8c638f9d1080800a353c9c28c8a81ca4705d946c" + dependencies: + ansi-wrap "0.1.0" + +ansi-regex@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + +ansi-styles@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" + +ansi-wrap@0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/ansi-wrap/-/ansi-wrap-0.1.0.tgz#a82250ddb0015e9a27ca82e82ea603bbfa45efaf" + +applicationinsights@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/applicationinsights/-/applicationinsights-1.0.1.tgz#53446b830fe8d5d619eee2a278b31d3d25030927" + dependencies: + diagnostic-channel "0.2.0" + diagnostic-channel-publishers "0.2.1" + zone.js "0.7.6" + +arr-diff@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-1.1.0.tgz#687c32758163588fef7de7b36fabe495eb1a399a" + dependencies: + arr-flatten "^1.0.1" + array-slice "^0.2.3" + +arr-diff@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" + dependencies: + arr-flatten "^1.0.1" + +arr-flatten@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" + +arr-union@^2.0.1: + version "2.1.0" + resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-2.1.0.tgz#20f9eab5ec70f5c7d215b1077b1c39161d292c7d" + +array-differ@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-1.0.0.tgz#eff52e3758249d33be402b8bb8e564bb2b5d4031" + +array-slice@^0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/array-slice/-/array-slice-0.2.3.tgz#dd3cfb80ed7973a75117cdac69b0b99ec86186f5" + +array-union@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" + dependencies: + array-uniq "^1.0.1" + +array-uniq@^1.0.1, array-uniq@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" + +array-unique@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" + +arrify@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" + +asn1@~0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" + +assert-plus@1.0.0, assert-plus@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + +aws-sign2@~0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" + +aws4@^1.6.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.7.0.tgz#d4d0e9b9dbfca77bf08eeb0a8a471550fe39e289" + +balanced-match@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" + +bcrypt-pbkdf@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d" + dependencies: + tweetnacl "^0.14.3" + +beeper@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/beeper/-/beeper-1.1.1.tgz#e6d5ea8c5dad001304a70b22638447f69cb2f809" + +block-stream@*: + version "0.0.9" + resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" + dependencies: + inherits "~2.0.0" + +boom@4.x.x: + version "4.3.1" + resolved "https://registry.yarnpkg.com/boom/-/boom-4.3.1.tgz#4f8a3005cb4a7e3889f749030fd25b96e01d2e31" + dependencies: + hoek "4.x.x" + +boom@5.x.x: + version "5.2.0" + resolved "https://registry.yarnpkg.com/boom/-/boom-5.2.0.tgz#5dd9da6ee3a5f302077436290cb717d3f4a54e02" + dependencies: + hoek "4.x.x" + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^1.8.2: + version "1.8.5" + resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" + dependencies: + expand-range "^1.8.1" + preserve "^0.2.0" + repeat-element "^1.1.2" + +browser-stdout@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.0.tgz#f351d32969d32fa5d7a5567154263d928ae3bd1f" + +buffer-crc32@~0.2.3: + version "0.2.13" + resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" + +buffer-from@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.0.0.tgz#4cb8832d23612589b0406e9e2956c17f06fdf531" + +caseless@~0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + +chalk@^1.0.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" + dependencies: + ansi-styles "^2.2.1" + escape-string-regexp "^1.0.2" + has-ansi "^2.0.0" + strip-ansi "^3.0.0" + supports-color "^2.0.0" + +clone-buffer@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/clone-buffer/-/clone-buffer-1.0.0.tgz#e3e25b207ac4e701af721e2cb5a16792cac3dc58" + +clone-stats@^0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/clone-stats/-/clone-stats-0.0.1.tgz#b88f94a82cf38b8791d58046ea4029ad88ca99d1" + +clone-stats@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/clone-stats/-/clone-stats-1.0.0.tgz#b3782dff8bb5474e18b9b6bf0fdfe782f8777680" + +clone@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/clone/-/clone-0.2.0.tgz#c6126a90ad4f72dbf5acdb243cc37724fe93fc1f" + +clone@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" + +clone@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.1.tgz#d217d1e961118e3ac9a4b8bba3285553bf647cdb" + +cloneable-readable@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/cloneable-readable/-/cloneable-readable-1.1.2.tgz#d591dee4a8f8bc15da43ce97dceeba13d43e2a65" + dependencies: + inherits "^2.0.1" + process-nextick-args "^2.0.0" + readable-stream "^2.3.5" + +co@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + +color-support@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2" + +combined-stream@1.0.6, combined-stream@~1.0.5: + version "1.0.6" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.6.tgz#723e7df6e801ac5613113a7e445a9b69cb632818" + dependencies: + delayed-stream "~1.0.0" + +commander@2.11.0: + version "2.11.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.11.0.tgz#157152fd1e7a6c8d98a5b715cf376df928004563" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + +convert-source-map@^1.1.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.1.tgz#b8278097b9bc229365de5c62cf5fcaed8b5599e5" + +core-util-is@1.0.2, core-util-is@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + +cryptiles@3.x.x: + version "3.1.2" + resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-3.1.2.tgz#a89fbb220f5ce25ec56e8c4aa8a4fd7b5b0d29fe" + dependencies: + boom "5.x.x" + +dashdash@^1.12.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + dependencies: + assert-plus "^1.0.0" + +dateformat@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-2.2.0.tgz#4065e2013cf9fb916ddfd82efb506ad4c6769062" + +debug@3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" + dependencies: + ms "2.0.0" + +deep-assign@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/deep-assign/-/deep-assign-1.0.0.tgz#b092743be8427dc621ea0067cdec7e70dd19f37b" + dependencies: + is-obj "^1.0.0" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + +diagnostic-channel-publishers@0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/diagnostic-channel-publishers/-/diagnostic-channel-publishers-0.2.1.tgz#8e2d607a8b6d79fe880b548bc58cc6beb288c4f3" + +diagnostic-channel@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/diagnostic-channel/-/diagnostic-channel-0.2.0.tgz#cc99af9612c23fb1fff13612c72f2cbfaa8d5a17" + dependencies: + semver "^5.3.0" + +diff@3.3.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/diff/-/diff-3.3.1.tgz#aa8567a6eed03c531fc89d3f711cd0e5259dec75" + +duplexer2@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.0.2.tgz#c614dcf67e2fb14995a91711e5a617e8a60a31db" + dependencies: + readable-stream "~1.1.9" + +duplexer@~0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1" + +duplexify@^3.2.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.6.0.tgz#592903f5d80b38d037220541264d69a198fb3410" + dependencies: + end-of-stream "^1.0.0" + inherits "^2.0.1" + readable-stream "^2.0.0" + stream-shift "^1.0.0" + +ecc-jsbn@~0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505" + dependencies: + jsbn "~0.1.0" + +end-of-stream@^1.0.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43" + dependencies: + once "^1.4.0" + +escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + +event-stream@^3.3.1, event-stream@^3.3.4, event-stream@~3.3.4: + version "3.3.4" + resolved "http://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz#4ab4c9a0f5a54db9338b4c34d86bfce8f4b35571" + dependencies: + duplexer "~0.1.1" + from "~0" + map-stream "~0.1.0" + pause-stream "0.0.11" + split "0.3" + stream-combiner "~0.0.4" + through "~2.3.1" + +expand-brackets@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" + dependencies: + is-posix-bracket "^0.1.0" + +expand-range@^1.8.1: + version "1.8.2" + resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" + dependencies: + fill-range "^2.1.0" + +extend-shallow@^1.1.2: + version "1.1.4" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-1.1.4.tgz#19d6bf94dfc09d76ba711f39b872d21ff4dd9071" + dependencies: + kind-of "^1.1.0" + +extend-shallow@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + dependencies: + is-extendable "^0.1.0" + +extend@^3.0.0, extend@~3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" + +extglob@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" + dependencies: + is-extglob "^1.0.0" + +extsprintf@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" + +extsprintf@^1.2.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" + +fancy-log@^1.1.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/fancy-log/-/fancy-log-1.3.2.tgz#f41125e3d84f2e7d89a43d06d958c8f78be16be1" + dependencies: + ansi-gray "^0.1.1" + color-support "^1.1.3" + time-stamp "^1.0.0" + +fast-deep-equal@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz#c053477817c86b51daa853c81e059b733d023614" + +fast-json-stable-stringify@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" + +fd-slicer@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.0.1.tgz#8b5bcbd9ec327c5041bf9ab023fd6750f1177e65" + dependencies: + pend "~1.2.0" + +filename-regex@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" + +fill-range@^2.1.0: + version "2.2.4" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.4.tgz#eb1e773abb056dcd8df2bfdf6af59b8b3a936565" + dependencies: + is-number "^2.1.0" + isobject "^2.0.0" + randomatic "^3.0.0" + repeat-element "^1.1.2" + repeat-string "^1.5.2" + +first-chunk-stream@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz#59bfb50cd905f60d7c394cd3d9acaab4e6ad934e" + +for-in@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" + +for-own@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" + dependencies: + for-in "^1.0.1" + +forever-agent@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + +form-data@~2.3.1: + version "2.3.2" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.2.tgz#4970498be604c20c005d4f5c23aecd21d6b49099" + dependencies: + asynckit "^0.4.0" + combined-stream "1.0.6" + mime-types "^2.1.12" + +from@~0: + version "0.1.7" + resolved "https://registry.yarnpkg.com/from/-/from-0.1.7.tgz#83c60afc58b9c56997007ed1a768b3ab303a44fe" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + +fstream@^1.0.2: + version "1.0.11" + resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.11.tgz#5c1fb1f117477114f0632a0eb4b71b3cb0fd3171" + dependencies: + graceful-fs "^4.1.2" + inherits "~2.0.0" + mkdirp ">=0.5 0" + rimraf "2" + +getpass@^0.1.1: + version "0.1.7" + resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + dependencies: + assert-plus "^1.0.0" + +glob-base@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" + dependencies: + glob-parent "^2.0.0" + is-glob "^2.0.0" + +glob-parent@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" + dependencies: + is-glob "^2.0.0" + +glob-parent@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" + dependencies: + is-glob "^3.1.0" + path-dirname "^1.0.0" + +glob-stream@^5.3.2: + version "5.3.5" + resolved "https://registry.yarnpkg.com/glob-stream/-/glob-stream-5.3.5.tgz#a55665a9a8ccdc41915a87c701e32d4e016fad22" + dependencies: + extend "^3.0.0" + glob "^5.0.3" + glob-parent "^3.0.0" + micromatch "^2.3.7" + ordered-read-streams "^0.3.0" + through2 "^0.6.0" + to-absolute-glob "^0.1.1" + unique-stream "^2.0.2" + +glob@7.1.2, glob@^7.0.5, glob@^7.1.2: + version "7.1.2" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" + dependencies: + 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" + +glob@^5.0.3: + version "5.0.15" + resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" + dependencies: + inflight "^1.0.4" + inherits "2" + minimatch "2 || 3" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glogg@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/glogg/-/glogg-1.0.1.tgz#dcf758e44789cc3f3d32c1f3562a3676e6a34810" + dependencies: + sparkles "^1.0.0" + +graceful-fs@^4.0.0, graceful-fs@^4.1.2: + version "4.1.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" + +growl@1.10.3: + version "1.10.3" + resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.3.tgz#1926ba90cf3edfe2adb4927f5880bc22c66c790f" + +gulp-chmod@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/gulp-chmod/-/gulp-chmod-2.0.0.tgz#00c390b928a0799b251accf631aa09e01cc6299c" + dependencies: + deep-assign "^1.0.0" + stat-mode "^0.2.0" + through2 "^2.0.0" + +gulp-filter@^5.0.1: + version "5.1.0" + resolved "https://registry.yarnpkg.com/gulp-filter/-/gulp-filter-5.1.0.tgz#a05e11affb07cf7dcf41a7de1cb7b63ac3783e73" + dependencies: + multimatch "^2.0.0" + plugin-error "^0.1.2" + streamfilter "^1.0.5" + +gulp-gunzip@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/gulp-gunzip/-/gulp-gunzip-1.0.0.tgz#15b741145e83a9c6f50886241b57cc5871f151a9" + dependencies: + through2 "~0.6.5" + vinyl "~0.4.6" + +gulp-remote-src-vscode@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/gulp-remote-src-vscode/-/gulp-remote-src-vscode-0.5.0.tgz#71785553bc491880088ad971f90910c4b2d80a99" + dependencies: + event-stream "^3.3.4" + node.extend "^1.1.2" + request "^2.79.0" + through2 "^2.0.3" + vinyl "^2.0.1" + +gulp-sourcemaps@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/gulp-sourcemaps/-/gulp-sourcemaps-1.6.0.tgz#b86ff349d801ceb56e1d9e7dc7bbcb4b7dee600c" + dependencies: + convert-source-map "^1.1.1" + graceful-fs "^4.1.2" + strip-bom "^2.0.0" + through2 "^2.0.0" + vinyl "^1.0.0" + +gulp-symdest@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/gulp-symdest/-/gulp-symdest-1.1.0.tgz#c165320732d192ce56fd94271ffa123234bf2ae0" + dependencies: + event-stream "^3.3.1" + mkdirp "^0.5.1" + queue "^3.1.0" + vinyl-fs "^2.4.3" + +gulp-untar@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/gulp-untar/-/gulp-untar-0.0.6.tgz#d6bdefde7e9a8e054c9f162385a0782c4be74000" + dependencies: + event-stream "~3.3.4" + gulp-util "~3.0.8" + streamifier "~0.1.1" + tar "^2.2.1" + through2 "~2.0.3" + +gulp-util@~3.0.8: + version "3.0.8" + resolved "https://registry.yarnpkg.com/gulp-util/-/gulp-util-3.0.8.tgz#0054e1e744502e27c04c187c3ecc505dd54bbb4f" + dependencies: + array-differ "^1.0.0" + array-uniq "^1.0.2" + beeper "^1.0.0" + chalk "^1.0.0" + dateformat "^2.0.0" + fancy-log "^1.1.0" + gulplog "^1.0.0" + has-gulplog "^0.1.0" + lodash._reescape "^3.0.0" + lodash._reevaluate "^3.0.0" + lodash._reinterpolate "^3.0.0" + lodash.template "^3.0.0" + minimist "^1.1.0" + multipipe "^0.1.2" + object-assign "^3.0.0" + replace-ext "0.0.1" + through2 "^2.0.0" + vinyl "^0.5.0" + +gulp-vinyl-zip@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/gulp-vinyl-zip/-/gulp-vinyl-zip-2.1.0.tgz#24e40685dc05b7149995245099e0590263be8dad" + dependencies: + event-stream "^3.3.1" + queue "^4.2.1" + through2 "^2.0.3" + vinyl "^2.0.2" + vinyl-fs "^2.0.0" + yauzl "^2.2.1" + yazl "^2.2.1" + +gulplog@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/gulplog/-/gulplog-1.0.0.tgz#e28c4d45d05ecbbed818363ce8f9c5926229ffe5" + dependencies: + glogg "^1.0.0" + +har-schema@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" + +har-validator@~5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.0.3.tgz#ba402c266194f15956ef15e0fcf242993f6a7dfd" + dependencies: + ajv "^5.1.0" + har-schema "^2.0.0" + +has-ansi@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" + dependencies: + ansi-regex "^2.0.0" + +has-flag@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51" + +has-gulplog@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/has-gulplog/-/has-gulplog-0.1.0.tgz#6414c82913697da51590397dafb12f22967811ce" + dependencies: + sparkles "^1.0.0" + +hawk@~6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/hawk/-/hawk-6.0.2.tgz#af4d914eb065f9b5ce4d9d11c1cb2126eecc3038" + dependencies: + boom "4.x.x" + cryptiles "3.x.x" + hoek "4.x.x" + sntp "2.x.x" + +he@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/he/-/he-1.1.1.tgz#93410fd21b009735151f8868c2f271f3427e23fd" + +hoek@4.x.x: + version "4.2.1" + resolved "https://registry.yarnpkg.com/hoek/-/hoek-4.2.1.tgz#9634502aa12c445dd5a7c5734b572bb8738aacbb" + +http-signature@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" + dependencies: + assert-plus "^1.0.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@^2.0.1, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + +is-buffer@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + +is-dotfile@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1" + +is-equal-shallow@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" + dependencies: + is-primitive "^2.0.0" + +is-extendable@^0.1.0, is-extendable@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + +is-extglob@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" + +is-extglob@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + +is-glob@^2.0.0, is-glob@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" + dependencies: + is-extglob "^1.0.0" + +is-glob@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" + dependencies: + is-extglob "^2.1.0" + +is-number@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" + dependencies: + kind-of "^3.0.2" + +is-number@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff" + +is-obj@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" + +is-posix-bracket@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" + +is-primitive@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" + +is-stream@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + +is-typedarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + +is-utf8@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" + +is-valid-glob@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/is-valid-glob/-/is-valid-glob-0.3.0.tgz#d4b55c69f51886f9b65c70d6c2622d37e29f48fe" + +is@^3.1.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/is/-/is-3.2.1.tgz#d0ac2ad55eb7b0bec926a5266f6c662aaa83dca5" + +isarray@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" + +isarray@1.0.0, isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + +isobject@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + dependencies: + isarray "1.0.0" + +isstream@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + +jsbn@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + +json-schema-traverse@^0.3.0: + version "0.3.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340" + +json-schema@0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" + +json-stable-stringify@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" + dependencies: + jsonify "~0.0.0" + +json-stringify-safe@~5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + +jsonify@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" + +jsprim@^1.2.2: + version "1.4.1" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" + dependencies: + assert-plus "1.0.0" + extsprintf "1.3.0" + json-schema "0.2.3" + verror "1.10.0" + +kind-of@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-1.1.0.tgz#140a3d2d41a36d2efcfa9377b62c24f8495a5c44" + +kind-of@^3.0.2: + version "3.2.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" + dependencies: + is-buffer "^1.1.5" + +kind-of@^6.0.0: + version "6.0.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" + +lazystream@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/lazystream/-/lazystream-1.0.0.tgz#f6995fe0f820392f61396be89462407bb77168e4" + dependencies: + readable-stream "^2.0.5" + +lodash._basecopy@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz#8da0e6a876cf344c0ad8a54882111dd3c5c7ca36" + +lodash._basetostring@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz#d1861d877f824a52f669832dcaf3ee15566a07d5" + +lodash._basevalues@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz#5b775762802bde3d3297503e26300820fdf661b7" + +lodash._getnative@^3.0.0: + version "3.9.1" + resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5" + +lodash._isiterateecall@^3.0.0: + version "3.0.9" + resolved "https://registry.yarnpkg.com/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz#5203ad7ba425fae842460e696db9cf3e6aac057c" + +lodash._reescape@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lodash._reescape/-/lodash._reescape-3.0.0.tgz#2b1d6f5dfe07c8a355753e5f27fac7f1cde1616a" + +lodash._reevaluate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz#58bc74c40664953ae0b124d806996daca431e2ed" + +lodash._reinterpolate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" + +lodash._root@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/lodash._root/-/lodash._root-3.0.1.tgz#fba1c4524c19ee9a5f8136b4609f017cf4ded692" + +lodash.escape@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/lodash.escape/-/lodash.escape-3.2.0.tgz#995ee0dc18c1b48cc92effae71a10aab5b487698" + dependencies: + lodash._root "^3.0.0" + +lodash.isarguments@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a" + +lodash.isarray@^3.0.0: + version "3.0.4" + resolved "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55" + +lodash.isequal@^4.0.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" + +lodash.keys@^3.0.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-3.1.2.tgz#4dbc0472b156be50a0b286855d1bd0b0c656098a" + dependencies: + lodash._getnative "^3.0.0" + lodash.isarguments "^3.0.0" + lodash.isarray "^3.0.0" + +lodash.restparam@^3.0.0: + version "3.6.1" + resolved "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805" + +lodash.template@^3.0.0: + version "3.6.2" + resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-3.6.2.tgz#f8cdecc6169a255be9098ae8b0c53d378931d14f" + dependencies: + lodash._basecopy "^3.0.0" + lodash._basetostring "^3.0.0" + lodash._basevalues "^3.0.0" + lodash._isiterateecall "^3.0.0" + lodash._reinterpolate "^3.0.0" + lodash.escape "^3.0.0" + lodash.keys "^3.0.0" + lodash.restparam "^3.0.0" + lodash.templatesettings "^3.0.0" + +lodash.templatesettings@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz#fb307844753b66b9f1afa54e262c745307dba8e5" + dependencies: + lodash._reinterpolate "^3.0.0" + lodash.escape "^3.0.0" + +map-stream@~0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/map-stream/-/map-stream-0.1.0.tgz#e56aa94c4c8055a16404a0674b78f215f7c8e194" + +math-random@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/math-random/-/math-random-1.0.1.tgz#8b3aac588b8a66e4975e3cdea67f7bb329601fac" + +merge-stream@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-1.0.1.tgz#4041202d508a342ba00174008df0c251b8c135e1" + dependencies: + readable-stream "^2.0.1" + +micromatch@^2.3.7: + version "2.3.11" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" + dependencies: + arr-diff "^2.0.0" + array-unique "^0.2.1" + braces "^1.8.2" + expand-brackets "^0.1.4" + extglob "^0.3.1" + filename-regex "^2.0.0" + is-extglob "^1.0.0" + is-glob "^2.0.1" + kind-of "^3.0.2" + normalize-path "^2.0.1" + object.omit "^2.0.0" + parse-glob "^3.0.4" + regex-cache "^0.4.2" + +mime-db@~1.33.0: + version "1.33.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.33.0.tgz#a3492050a5cb9b63450541e39d9788d2272783db" + +mime-types@^2.1.12, mime-types@~2.1.17: + version "2.1.18" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.18.tgz#6f323f60a83d11146f831ff11fd66e2fe5503bb8" + dependencies: + mime-db "~1.33.0" + +"minimatch@2 || 3", minimatch@^3.0.0, minimatch@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + dependencies: + brace-expansion "^1.1.7" + +minimist@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" + +minimist@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" + +mkdirp@0.5.1, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" + dependencies: + minimist "0.0.8" + +mocha@^4.0.1: + version "4.1.0" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-4.1.0.tgz#7d86cfbcf35cb829e2754c32e17355ec05338794" + dependencies: + browser-stdout "1.3.0" + commander "2.11.0" + debug "3.1.0" + diff "3.3.1" + escape-string-regexp "1.0.5" + glob "7.1.2" + growl "1.10.3" + he "1.1.1" + mkdirp "0.5.1" + supports-color "4.4.0" + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + +multimatch@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/multimatch/-/multimatch-2.1.0.tgz#9c7906a22fb4c02919e2f5f75161b4cdbd4b2a2b" + dependencies: + array-differ "^1.0.0" + array-union "^1.0.1" + arrify "^1.0.0" + minimatch "^3.0.0" + +multipipe@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/multipipe/-/multipipe-0.1.2.tgz#2a8f2ddf70eed564dff2d57f1e1a137d9f05078b" + dependencies: + duplexer2 "0.0.2" + +node.extend@^1.1.2: + version "1.1.6" + resolved "https://registry.yarnpkg.com/node.extend/-/node.extend-1.1.6.tgz#a7b882c82d6c93a4863a5504bd5de8ec86258b96" + dependencies: + is "^3.1.0" + +normalize-path@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" + dependencies: + remove-trailing-separator "^1.0.1" + +oauth-sign@~0.8.2: + version "0.8.2" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" + +object-assign@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-3.0.0.tgz#9bedd5ca0897949bca47e7ff408062d549f587f2" + +object-assign@^4.0.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + +object.omit@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" + dependencies: + for-own "^0.1.4" + is-extendable "^0.1.1" + +once@^1.3.0, once@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + dependencies: + wrappy "1" + +ordered-read-streams@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/ordered-read-streams/-/ordered-read-streams-0.3.0.tgz#7137e69b3298bb342247a1bbee3881c80e2fd78b" + dependencies: + is-stream "^1.0.1" + readable-stream "^2.0.1" + +parse-glob@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" + dependencies: + glob-base "^0.3.0" + is-dotfile "^1.0.0" + is-extglob "^1.0.0" + is-glob "^2.0.0" + +path-dirname@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + +pause-stream@0.0.11: + version "0.0.11" + resolved "https://registry.yarnpkg.com/pause-stream/-/pause-stream-0.0.11.tgz#fe5a34b0cbce12b5aa6a2b403ee2e73b602f1445" + dependencies: + through "~2.3" + +pend@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" + +performance-now@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + +plugin-error@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/plugin-error/-/plugin-error-0.1.2.tgz#3b9bb3335ccf00f425e07437e19276967da47ace" + dependencies: + ansi-cyan "^0.1.1" + ansi-red "^0.1.1" + arr-diff "^1.0.1" + arr-union "^2.0.1" + extend-shallow "^1.1.2" + +preserve@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" + +process-nextick-args@^2.0.0, process-nextick-args@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" + +punycode@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + +qs@~6.5.1: + version "6.5.2" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" + +querystringify@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.0.0.tgz#fa3ed6e68eb15159457c89b37bc6472833195755" + +queue@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/queue/-/queue-3.1.0.tgz#6c49d01f009e2256788789f2bffac6b8b9990585" + dependencies: + inherits "~2.0.0" + +queue@^4.2.1: + version "4.4.2" + resolved "https://registry.yarnpkg.com/queue/-/queue-4.4.2.tgz#5a9733d9a8b8bd1b36e934bc9c55ab89b28e29c7" + dependencies: + inherits "~2.0.0" + +randomatic@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-3.0.0.tgz#d35490030eb4f7578de292ce6dfb04a91a128923" + dependencies: + is-number "^4.0.0" + kind-of "^6.0.0" + math-random "^1.0.1" + +"readable-stream@>=1.0.33-1 <1.1.0-0": + version "1.0.34" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "0.0.1" + string_decoder "~0.10.x" + +readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.4, readable-stream@^2.0.5, readable-stream@^2.1.5, readable-stream@^2.3.5: + version "2.3.6" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +readable-stream@~1.1.9: + version "1.1.14" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "0.0.1" + string_decoder "~0.10.x" + +regex-cache@^0.4.2: + version "0.4.4" + resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd" + dependencies: + is-equal-shallow "^0.1.3" + +remove-trailing-separator@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" + +repeat-element@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a" + +repeat-string@^1.5.2: + version "1.6.1" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + +replace-ext@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-0.0.1.tgz#29bbd92078a739f0bcce2b4ee41e837953522924" + +replace-ext@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-1.0.0.tgz#de63128373fcbf7c3ccfa4de5a480c45a67958eb" + +request@^2.79.0, request@^2.83.0: + version "2.85.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.85.0.tgz#5a03615a47c61420b3eb99b7dba204f83603e1fa" + dependencies: + aws-sign2 "~0.7.0" + aws4 "^1.6.0" + caseless "~0.12.0" + combined-stream "~1.0.5" + extend "~3.0.1" + forever-agent "~0.6.1" + form-data "~2.3.1" + har-validator "~5.0.3" + hawk "~6.0.2" + http-signature "~1.2.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.17" + oauth-sign "~0.8.2" + performance-now "^2.1.0" + qs "~6.5.1" + safe-buffer "^5.1.1" + stringstream "~0.0.5" + tough-cookie "~2.3.3" + tunnel-agent "^0.6.0" + uuid "^3.1.0" + +requires-port@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + +rimraf@2: + version "2.6.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" + dependencies: + glob "^7.0.5" + +safe-buffer@^5.0.1, safe-buffer@^5.1.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + +semver@^5.3.0, semver@^5.4.1: + version "5.5.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab" + +sntp@2.x.x: + version "2.1.0" + resolved "https://registry.yarnpkg.com/sntp/-/sntp-2.1.0.tgz#2c6cec14fedc2222739caf9b5c3d85d1cc5a2cc8" + dependencies: + hoek "4.x.x" + +source-map-support@^0.5.0: + version "0.5.5" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.5.tgz#0d4af9e00493e855402e8ec36ebed2d266fceb90" + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map@^0.6.0: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + +sparkles@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/sparkles/-/sparkles-1.0.0.tgz#1acbbfb592436d10bbe8f785b7cc6f82815012c3" + +split@0.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/split/-/split-0.3.3.tgz#cd0eea5e63a211dfff7eb0f091c4133e2d0dd28f" + dependencies: + through "2" + +sshpk@^1.7.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.14.1.tgz#130f5975eddad963f1d56f92b9ac6c51fa9f83eb" + dependencies: + asn1 "~0.2.3" + assert-plus "^1.0.0" + dashdash "^1.12.0" + getpass "^0.1.1" + optionalDependencies: + bcrypt-pbkdf "^1.0.0" + ecc-jsbn "~0.1.1" + jsbn "~0.1.0" + tweetnacl "~0.14.0" + +stat-mode@^0.2.0: + version "0.2.2" + resolved "https://registry.yarnpkg.com/stat-mode/-/stat-mode-0.2.2.tgz#e6c80b623123d7d80cf132ce538f346289072502" + +stream-combiner@~0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/stream-combiner/-/stream-combiner-0.0.4.tgz#4d5e433c185261dde623ca3f44c586bcf5c4ad14" + dependencies: + duplexer "~0.1.1" + +stream-shift@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.0.tgz#d5c752825e5367e786f78e18e445ea223a155952" + +streamfilter@^1.0.5: + version "1.0.7" + resolved "https://registry.yarnpkg.com/streamfilter/-/streamfilter-1.0.7.tgz#ae3e64522aa5a35c061fd17f67620c7653c643c9" + dependencies: + readable-stream "^2.0.2" + +streamifier@~0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/streamifier/-/streamifier-0.1.1.tgz#97e98d8fa4d105d62a2691d1dc07e820db8dfc4f" + +string_decoder@~0.10.x: + version "0.10.31" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + dependencies: + safe-buffer "~5.1.0" + +stringstream@~0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" + +strip-ansi@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + dependencies: + ansi-regex "^2.0.0" + +strip-bom-stream@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-bom-stream/-/strip-bom-stream-1.0.0.tgz#e7144398577d51a6bed0fa1994fa05f43fd988ee" + dependencies: + first-chunk-stream "^1.0.0" + strip-bom "^2.0.0" + +strip-bom@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" + dependencies: + is-utf8 "^0.2.0" + +supports-color@4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.4.0.tgz#883f7ddabc165142b2a61427f3352ded195d1a3e" + dependencies: + has-flag "^2.0.0" + +supports-color@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" + +tar@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1" + dependencies: + block-stream "*" + fstream "^1.0.2" + inherits "2" + +through2-filter@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/through2-filter/-/through2-filter-2.0.0.tgz#60bc55a0dacb76085db1f9dae99ab43f83d622ec" + dependencies: + through2 "~2.0.0" + xtend "~4.0.0" + +through2@^0.6.0, through2@~0.6.5: + version "0.6.5" + resolved "https://registry.yarnpkg.com/through2/-/through2-0.6.5.tgz#41ab9c67b29d57209071410e1d7a7a968cd3ad48" + dependencies: + readable-stream ">=1.0.33-1 <1.1.0-0" + xtend ">=4.0.0 <4.1.0-0" + +through2@^2.0.0, through2@^2.0.3, through2@~2.0.0, through2@~2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be" + dependencies: + readable-stream "^2.1.5" + xtend "~4.0.1" + +through@2, through@~2.3, through@~2.3.1: + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + +time-stamp@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/time-stamp/-/time-stamp-1.1.0.tgz#764a5a11af50561921b133f3b44e618687e0f5c3" + +to-absolute-glob@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/to-absolute-glob/-/to-absolute-glob-0.1.1.tgz#1cdfa472a9ef50c239ee66999b662ca0eb39937f" + dependencies: + extend-shallow "^2.0.1" + +tough-cookie@~2.3.3: + version "2.3.4" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.4.tgz#ec60cee38ac675063ffc97a5c18970578ee83655" + dependencies: + punycode "^1.4.1" + +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + dependencies: + safe-buffer "^5.0.1" + +tweetnacl@^0.14.3, tweetnacl@~0.14.0: + version "0.14.5" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + +unique-stream@^2.0.2: + version "2.2.1" + resolved "https://registry.yarnpkg.com/unique-stream/-/unique-stream-2.2.1.tgz#5aa003cfbe94c5ff866c4e7d668bb1c4dbadb369" + dependencies: + json-stable-stringify "^1.0.0" + through2-filter "^2.0.0" + +url-parse@^1.1.9: + version "1.4.0" + resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.4.0.tgz#6bfdaad60098c7fe06f623e42b22de62de0d3d75" + dependencies: + querystringify "^2.0.0" + requires-port "^1.0.0" + +util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + +uuid@^3.1.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.2.1.tgz#12c528bb9d58d0b9265d9a2f6f0fe8be17ff1f14" + +vali-date@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/vali-date/-/vali-date-1.0.0.tgz#1b904a59609fb328ef078138420934f6b86709a6" + +verror@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" + dependencies: + assert-plus "^1.0.0" + core-util-is "1.0.2" + extsprintf "^1.2.0" + +vinyl-fs@^2.0.0, vinyl-fs@^2.4.3: + version "2.4.4" + resolved "https://registry.yarnpkg.com/vinyl-fs/-/vinyl-fs-2.4.4.tgz#be6ff3270cb55dfd7d3063640de81f25d7532239" + dependencies: + duplexify "^3.2.0" + glob-stream "^5.3.2" + graceful-fs "^4.0.0" + gulp-sourcemaps "1.6.0" + is-valid-glob "^0.3.0" + lazystream "^1.0.0" + lodash.isequal "^4.0.0" + merge-stream "^1.0.0" + mkdirp "^0.5.0" + object-assign "^4.0.0" + readable-stream "^2.0.4" + strip-bom "^2.0.0" + strip-bom-stream "^1.0.0" + through2 "^2.0.0" + through2-filter "^2.0.0" + vali-date "^1.0.0" + vinyl "^1.0.0" + +vinyl-source-stream@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vinyl-source-stream/-/vinyl-source-stream-1.1.2.tgz#62b53a135610a896e98ca96bee3a87f008a8e780" + dependencies: + through2 "^2.0.3" + vinyl "^0.4.3" + +vinyl@^0.4.3, vinyl@~0.4.6: + version "0.4.6" + resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-0.4.6.tgz#2f356c87a550a255461f36bbeb2a5ba8bf784847" + dependencies: + clone "^0.2.0" + clone-stats "^0.0.1" + +vinyl@^0.5.0: + version "0.5.3" + resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-0.5.3.tgz#b0455b38fc5e0cf30d4325132e461970c2091cde" + dependencies: + clone "^1.0.0" + clone-stats "^0.0.1" + replace-ext "0.0.1" + +vinyl@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-1.2.0.tgz#5c88036cf565e5df05558bfc911f8656df218884" + dependencies: + clone "^1.0.0" + clone-stats "^0.0.1" + replace-ext "0.0.1" + +vinyl@^2.0.1, vinyl@^2.0.2: + version "2.1.0" + resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-2.1.0.tgz#021f9c2cf951d6b939943c89eb5ee5add4fd924c" + dependencies: + clone "^2.1.1" + clone-buffer "^1.0.0" + clone-stats "^1.0.0" + cloneable-readable "^1.0.0" + remove-trailing-separator "^1.0.1" + replace-ext "^1.0.0" + +vscode-extension-telemetry@0.0.18: + version "0.0.18" + resolved "https://registry.yarnpkg.com/vscode-extension-telemetry/-/vscode-extension-telemetry-0.0.18.tgz#602ba20d8c71453aa34533a291e7638f6e5c0327" + dependencies: + applicationinsights "1.0.1" + +vscode-nls@^3.2.4: + version "3.2.4" + resolved "https://registry.yarnpkg.com/vscode-nls/-/vscode-nls-3.2.4.tgz#2166b4183c8aea884d20727f5449e62be69fd398" + +vscode-ripgrep@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/vscode-ripgrep/-/vscode-ripgrep-1.0.1.tgz#eff2f2b2a49921ac0acd3ff8dfecaaeebf0184cf" + +vscode@^1.1.17: + version "1.1.17" + resolved "https://registry.yarnpkg.com/vscode/-/vscode-1.1.17.tgz#cc2a61731e925301f03f003c009cbf454022cd83" + dependencies: + glob "^7.1.2" + gulp-chmod "^2.0.0" + gulp-filter "^5.0.1" + gulp-gunzip "1.0.0" + gulp-remote-src-vscode "^0.5.0" + gulp-symdest "^1.1.0" + gulp-untar "^0.0.6" + gulp-vinyl-zip "^2.1.0" + mocha "^4.0.1" + request "^2.83.0" + semver "^5.4.1" + source-map-support "^0.5.0" + url-parse "^1.1.9" + vinyl-source-stream "^1.1.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + +"xtend@>=4.0.0 <4.1.0-0", xtend@~4.0.0, xtend@~4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" + +yauzl@^2.2.1: + version "2.9.1" + resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.9.1.tgz#a81981ea70a57946133883f029c5821a89359a7f" + dependencies: + buffer-crc32 "~0.2.3" + fd-slicer "~1.0.1" + +yazl@^2.2.1: + version "2.4.3" + resolved "https://registry.yarnpkg.com/yazl/-/yazl-2.4.3.tgz#ec26e5cc87d5601b9df8432dbdd3cd2e5173a071" + dependencies: + buffer-crc32 "~0.2.3" + +zone.js@0.7.6: + version "0.7.6" + resolved "https://registry.yarnpkg.com/zone.js/-/zone.js-0.7.6.tgz#fbbc39d3e0261d0986f1ba06306eb3aeb0d22009" diff --git a/extensions/sql/language-configuration.json b/extensions/sql/language-configuration.json index 9543694145..cf96472ffd 100644 --- a/extensions/sql/language-configuration.json +++ b/extensions/sql/language-configuration.json @@ -21,7 +21,8 @@ ["[", "]"], ["(", ")"], ["\"", "\""], - ["'", "'"] + ["'", "'"], + ["`", "`"] ] // enhancedBrackets:[ diff --git a/extensions/sql/test/colorize-results/test_sql.json b/extensions/sql/test/colorize-results/test_sql.json index da116cea9c..1c3674d308 100644 --- a/extensions/sql/test/colorize-results/test_sql.json +++ b/extensions/sql/test/colorize-results/test_sql.json @@ -3,10 +3,10 @@ "c": "CREATE", "t": "source.sql keyword.other.sql", "r": { - "dark_plus": "keyword: #569CD6", - "light_plus": "keyword: #0000FF", - "dark_vs": "keyword: #569CD6", - "light_vs": "keyword: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword: #569CD6" } }, @@ -14,10 +14,10 @@ "c": " VIEW METRIC_STATS (ID, ", "t": "source.sql", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -25,10 +25,10 @@ "c": "MONTH", "t": "source.sql support.function.datetime.sql", "r": { - "dark_plus": "support.function: #DCDCAA", - "light_plus": "support.function: #795E26", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "support.function: #DCDCAA" } }, @@ -36,10 +36,10 @@ "c": ", TEMP_C, RAIN_C) ", "t": "source.sql", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -47,10 +47,10 @@ "c": "AS", "t": "source.sql keyword.other.alias.sql", "r": { - "dark_plus": "keyword: #569CD6", - "light_plus": "keyword: #0000FF", - "dark_vs": "keyword: #569CD6", - "light_vs": "keyword: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword: #569CD6" } }, @@ -58,10 +58,10 @@ "c": "SELECT", "t": "source.sql keyword.other.DML.sql", "r": { - "dark_plus": "keyword: #569CD6", - "light_plus": "keyword: #0000FF", - "dark_vs": "keyword: #569CD6", - "light_vs": "keyword: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword: #569CD6" } }, @@ -69,10 +69,10 @@ "c": " ID,", "t": "source.sql", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -80,10 +80,10 @@ "c": "MONTH", "t": "source.sql support.function.datetime.sql", "r": { - "dark_plus": "support.function: #DCDCAA", - "light_plus": "support.function: #795E26", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "support.function: #DCDCAA" } }, @@ -91,10 +91,10 @@ "c": ",", "t": "source.sql", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -102,10 +102,10 @@ "c": "(TEMP_F ", "t": "source.sql", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -113,10 +113,10 @@ "c": "-", "t": "source.sql keyword.operator.math.sql", "r": { - "dark_plus": "keyword.operator: #D4D4D4", - "light_plus": "keyword.operator: #000000", - "dark_vs": "keyword.operator: #D4D4D4", - "light_vs": "keyword.operator: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword.operator: #D4D4D4" } }, @@ -124,10 +124,10 @@ "c": " ", "t": "source.sql", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -135,10 +135,10 @@ "c": "32", "t": "source.sql constant.numeric.sql", "r": { - "dark_plus": "constant.numeric: #B5CEA8", - "light_plus": "constant.numeric: #09885A", - "dark_vs": "constant.numeric: #B5CEA8", - "light_vs": "constant.numeric: #09885A", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "constant.numeric: #B5CEA8" } }, @@ -146,10 +146,10 @@ "c": ") ", "t": "source.sql", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -157,10 +157,10 @@ "c": "*", "t": "source.sql keyword.operator.star.sql", "r": { - "dark_plus": "keyword.operator: #D4D4D4", - "light_plus": "keyword.operator: #000000", - "dark_vs": "keyword.operator: #D4D4D4", - "light_vs": "keyword.operator: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword.operator: #D4D4D4" } }, @@ -168,10 +168,10 @@ "c": " ", "t": "source.sql", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -179,10 +179,10 @@ "c": "5", "t": "source.sql constant.numeric.sql", "r": { - "dark_plus": "constant.numeric: #B5CEA8", - "light_plus": "constant.numeric: #09885A", - "dark_vs": "constant.numeric: #B5CEA8", - "light_vs": "constant.numeric: #09885A", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "constant.numeric: #B5CEA8" } }, @@ -190,10 +190,10 @@ "c": " ", "t": "source.sql", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -201,10 +201,10 @@ "c": "/", "t": "source.sql keyword.operator.math.sql", "r": { - "dark_plus": "keyword.operator: #D4D4D4", - "light_plus": "keyword.operator: #000000", - "dark_vs": "keyword.operator: #D4D4D4", - "light_vs": "keyword.operator: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword.operator: #D4D4D4" } }, @@ -212,10 +212,10 @@ "c": "9", "t": "source.sql constant.numeric.sql", "r": { - "dark_plus": "constant.numeric: #B5CEA8", - "light_plus": "constant.numeric: #09885A", - "dark_vs": "constant.numeric: #B5CEA8", - "light_vs": "constant.numeric: #09885A", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "constant.numeric: #B5CEA8" } }, @@ -223,10 +223,10 @@ "c": ",", "t": "source.sql", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -234,10 +234,10 @@ "c": "RAIN_I ", "t": "source.sql", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -245,10 +245,10 @@ "c": "*", "t": "source.sql keyword.operator.star.sql", "r": { - "dark_plus": "keyword.operator: #D4D4D4", - "light_plus": "keyword.operator: #000000", - "dark_vs": "keyword.operator: #D4D4D4", - "light_vs": "keyword.operator: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword.operator: #D4D4D4" } }, @@ -256,10 +256,10 @@ "c": " ", "t": "source.sql", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -267,10 +267,10 @@ "c": "0", "t": "source.sql constant.numeric.sql", "r": { - "dark_plus": "constant.numeric: #B5CEA8", - "light_plus": "constant.numeric: #09885A", - "dark_vs": "constant.numeric: #B5CEA8", - "light_vs": "constant.numeric: #09885A", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "constant.numeric: #B5CEA8" } }, @@ -278,10 +278,10 @@ "c": ".", "t": "source.sql", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -289,10 +289,10 @@ "c": "3937", "t": "source.sql constant.numeric.sql", "r": { - "dark_plus": "constant.numeric: #B5CEA8", - "light_plus": "constant.numeric: #09885A", - "dark_vs": "constant.numeric: #B5CEA8", - "light_vs": "constant.numeric: #09885A", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "constant.numeric: #B5CEA8" } }, @@ -300,10 +300,10 @@ "c": "FROM", "t": "source.sql keyword.other.DML.sql", "r": { - "dark_plus": "keyword: #569CD6", - "light_plus": "keyword: #0000FF", - "dark_vs": "keyword: #569CD6", - "light_vs": "keyword: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword: #569CD6" } }, @@ -311,10 +311,10 @@ "c": " STATS;", "t": "source.sql", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } } diff --git a/extensions/theme-abyss/themes/abyss-color-theme.json b/extensions/theme-abyss/themes/abyss-color-theme.json index 85f5f9a4a9..53454a8ed4 100644 --- a/extensions/theme-abyss/themes/abyss-color-theme.json +++ b/extensions/theme-abyss/themes/abyss-color-theme.json @@ -365,7 +365,6 @@ // Workbench: Editors // "editorGroupHeader.noTabsBackground": "", "editorGroup.border": "#2b2b4a", - "editorGroup.background": "#1c1c2a", "editorGroup.dropBackground": "#25375daa", "editorGroupHeader.tabsBackground": "#1c1c2a", diff --git a/extensions/theme-carbon/themes/dark_carbon.json b/extensions/theme-carbon/themes/dark_carbon.json index 91b26ccd12..4067cfd766 100644 --- a/extensions/theme-carbon/themes/dark_carbon.json +++ b/extensions/theme-carbon/themes/dark_carbon.json @@ -45,7 +45,9 @@ "list.hoverBackground": "#444444", "pickerGroup.border": "#00BCF2", "activityBar.background": "#444444", - "sideBar.background": "#333333", + "sideBar.background": "#333333", + "sideBarTitle.foreground": "#BBBBBB", + "input.placeholderForeground": "#A6A6A6", "editorGroupHeader.tabsBackground": "#444444", "editor.background": "#212121", "editor.foreground": "#ffffff", diff --git a/extensions/theme-carbon/themes/light_carbon.json b/extensions/theme-carbon/themes/light_carbon.json index 1428340607..34b52b5cec 100644 --- a/extensions/theme-carbon/themes/light_carbon.json +++ b/extensions/theme-carbon/themes/light_carbon.json @@ -40,7 +40,7 @@ "input.disabled.background": "#dcdcdc", "input.disabled.foreground": "#888888", "inputOption.activeBorder": "#666666", - "input.placeholderForeground": "#888888", + "input.placeholderForeground": "#767676", "inputValidation.errorBackground": "#ffeaea", "inputValidation.errorBorder": "#f1897f", diff --git a/extensions/theme-defaults/package.nls.json b/extensions/theme-defaults/package.nls.json index 46dee28cf2..f03211eed2 100644 --- a/extensions/theme-defaults/package.nls.json +++ b/extensions/theme-defaults/package.nls.json @@ -1,4 +1,4 @@ { "displayName": "Default Themes", - "description": "The default light and dark themes (Plus and Visual Studio)" + "description": "The default Visual Studio light and dark themes" } \ No newline at end of file diff --git a/extensions/theme-defaults/themes/dark_defaults.json b/extensions/theme-defaults/themes/dark_defaults.json index cb9e20066b..87b3750846 100644 --- a/extensions/theme-defaults/themes/dark_defaults.json +++ b/extensions/theme-defaults/themes/dark_defaults.json @@ -10,6 +10,9 @@ "editor.selectionHighlightBackground": "#ADD6FF26", "list.dropBackground": "#383B3D", "activityBarBadge.background": "#007ACC", - "sideBarTitle.foreground": "#BBBBBB" + "sideBarTitle.foreground": "#BBBBBB", + "input.placeholderForeground": "#A6A6A6", + "settings.textInputBackground": "#292929", + "settings.numberInputBackground": "#292929" } } \ No newline at end of file diff --git a/extensions/theme-defaults/themes/dark_plus.json b/extensions/theme-defaults/themes/dark_plus.json index 9767fa79c7..0ccbaeb606 100644 --- a/extensions/theme-defaults/themes/dark_plus.json +++ b/extensions/theme-defaults/themes/dark_plus.json @@ -76,7 +76,8 @@ "scope": [ "variable", "meta.definition.variable.name", - "support.variable" + "support.variable", + "entity.name.variable" ], "settings": { "foreground": "#9CDCFE" diff --git a/extensions/theme-defaults/themes/dark_vs.json b/extensions/theme-defaults/themes/dark_vs.json index c2a15addb8..2cbdca4a8f 100644 --- a/extensions/theme-defaults/themes/dark_vs.json +++ b/extensions/theme-defaults/themes/dark_vs.json @@ -33,7 +33,7 @@ { "scope": "comment", "settings": { - "foreground": "#608b4e" + "foreground": "#6A9955" } }, { @@ -143,7 +143,7 @@ { "scope": "beginning.punctuation.definition.quote.markdown", "settings": { - "foreground": "#608b4e" + "foreground": "#6A9955" } }, { diff --git a/extensions/theme-defaults/themes/light_defaults.json b/extensions/theme-defaults/themes/light_defaults.json index 2ee46debb3..dc53cbfb1e 100644 --- a/extensions/theme-defaults/themes/light_defaults.json +++ b/extensions/theme-defaults/themes/light_defaults.json @@ -12,6 +12,8 @@ "activityBarBadge.background": "#007ACC", "sideBarTitle.foreground": "#6F6F6F", "list.hoverBackground": "#E8E8E8", - "input.placeholderForeground": "#ADADAD" + "input.placeholderForeground": "#767676", + "settings.textInputBorder": "#CECECE", + "settings.numberInputBorder": "#CECECE" } } \ No newline at end of file diff --git a/extensions/theme-defaults/themes/light_plus.json b/extensions/theme-defaults/themes/light_plus.json index a4b6b642a9..4c9985d44f 100644 --- a/extensions/theme-defaults/themes/light_plus.json +++ b/extensions/theme-defaults/themes/light_plus.json @@ -76,7 +76,8 @@ "scope": [ "variable", "meta.definition.variable.name", - "support.variable" + "support.variable", + "entity.name.variable" ], "settings": { "foreground": "#001080" @@ -156,7 +157,7 @@ { "scope": "constant.character.escape", "settings": { - "foreground": "#a31515" + "foreground": "#ff0000" } } diff --git a/extensions/theme-defaults/themes/light_vs.json b/extensions/theme-defaults/themes/light_vs.json index 67c7bc44af..4134ce0a4c 100644 --- a/extensions/theme-defaults/themes/light_vs.json +++ b/extensions/theme-defaults/themes/light_vs.json @@ -216,9 +216,9 @@ }, { "scope": [ - "string.comment.buffered.block.jade", - "string.quoted.jade", - "string.interpolated.jade", + "string.comment.buffered.block.pug", + "string.quoted.pug", + "string.interpolated.pug", "string.unquoted.plain.in.yaml", "string.unquoted.plain.out.yaml", "string.unquoted.block.yaml", @@ -290,7 +290,9 @@ } }, { - "scope": "support.type.property-name.json", + "scope": [ + "support.type.property-name.json" + ], "settings": { "foreground": "#0451a5" } diff --git a/extensions/theme-kimbie-dark/themes/kimbie-dark-color-theme.json b/extensions/theme-kimbie-dark/themes/kimbie-dark-color-theme.json index ebcf0341dc..41d9d0b2d8 100644 --- a/extensions/theme-kimbie-dark/themes/kimbie-dark-color-theme.json +++ b/extensions/theme-kimbie-dark/themes/kimbie-dark-color-theme.json @@ -3,6 +3,7 @@ "type": "dark", "colors": { "input.background": "#51412c", + "dropdown.background": "#51412c", "editor.background": "#221a0f", "editor.foreground": "#d3af86", "focusBorder": "#a57a4c", @@ -19,7 +20,6 @@ "editorWidget.background": "#131510", "editorHoverWidget.background": "#221a14", "editorGroupHeader.tabsBackground": "#131510", - "editorGroup.background": "#0f0c08", "editorLineNumber.activeForeground": "#adadad", "tab.inactiveBackground": "#131510", "titleBar.activeBackground": "#423523", diff --git a/extensions/theme-monokai-dimmed/themes/dimmed-monokai-color-theme.json b/extensions/theme-monokai-dimmed/themes/dimmed-monokai-color-theme.json index 20f12faee0..dfb5cf1ab6 100644 --- a/extensions/theme-monokai-dimmed/themes/dimmed-monokai-color-theme.json +++ b/extensions/theme-monokai-dimmed/themes/dimmed-monokai-color-theme.json @@ -21,7 +21,6 @@ "editorIndentGuide.background": "#505037", "editorIndentGuide.activeBackground": "#707057", "editorGroupHeader.tabsBackground": "#282828", - "editorGroup.background": "#1e1e1e", "tab.inactiveBackground": "#404040", "tab.border": "#303030", "tab.inactiveForeground": "#d8d8d8", diff --git a/extensions/theme-monokai/themes/monokai-color-theme.json b/extensions/theme-monokai/themes/monokai-color-theme.json index 439ed05190..e7f00d712e 100644 --- a/extensions/theme-monokai/themes/monokai-color-theme.json +++ b/extensions/theme-monokai/themes/monokai-color-theme.json @@ -11,6 +11,8 @@ "list.activeSelectionBackground": "#75715E", "list.focusBackground": "#414339", "dropdown.listBackground": "#1e1f1c", + "settings.textInputBackground": "#32342d", + "settings.numberInputBackground": "#32342d", "list.inactiveSelectionBackground": "#414339", "list.hoverBackground": "#3e3d32", "list.dropBackground": "#414339", @@ -416,4 +418,4 @@ } } ] -} \ No newline at end of file +} diff --git a/extensions/theme-quietlight/themes/quietlight-color-theme.json b/extensions/theme-quietlight/themes/quietlight-color-theme.json index 3e1ad56f8a..81a8591a87 100644 --- a/extensions/theme-quietlight/themes/quietlight-color-theme.json +++ b/extensions/theme-quietlight/themes/quietlight-color-theme.json @@ -40,7 +40,8 @@ "name": "Comments: Documentation", "scope": [ "comment.documentation", - "comment.block.documentation" + "comment.block.documentation", + "comment.block.documentation punctuation.definition.comment " ], "settings": { "foreground": "#448C27" @@ -528,6 +529,7 @@ "inputValidation.errorBorder": "#f1897f", "errorForeground": "#f1897f", "badge.background": "#705697AA", - "progressBar.background": "#705697" + "progressBar.background": "#705697", + "walkThrough.embeddedEditorBackground": "#00000014" } } diff --git a/extensions/theme-red/themes/Red-color-theme.json b/extensions/theme-red/themes/Red-color-theme.json index 8d69156514..2231f5e7e4 100644 --- a/extensions/theme-red/themes/Red-color-theme.json +++ b/extensions/theme-red/themes/Red-color-theme.json @@ -15,7 +15,6 @@ // editor "editor.background": "#390000", "editorGroup.border": "#ff666633", - "editorGroup.background": "#1c0101", "editorCursor.foreground": "#970000", "editor.foreground": "#F8F8F8", "editorWhitespace.foreground": "#c10000", diff --git a/extensions/theme-solarized-dark/themes/solarized-dark-color-theme.json b/extensions/theme-solarized-dark/themes/solarized-dark-color-theme.json index 7d77408d2e..e11ed77091 100644 --- a/extensions/theme-solarized-dark/themes/solarized-dark-color-theme.json +++ b/extensions/theme-solarized-dark/themes/solarized-dark-color-theme.json @@ -356,7 +356,7 @@ "editorWhitespace.foreground": "#93A1A180", "editor.lineHighlightBackground": "#073642", "editorLineNumber.activeForeground": "#949494", - "editor.selectionBackground": "#073642", + "editor.selectionBackground": "#274642", "editorIndentGuide.background": "#93A1A180", "editorIndentGuide.activeBackground": "#C3E1E180", "editorHoverWidget.background": "#004052", @@ -413,7 +413,6 @@ // Workbench: Editors // "editorGroupHeader.noTabsBackground": "", "editorGroup.border": "#00212B", - "editorGroup.background": "#011b23", "editorGroup.dropBackground": "#2AA19844", "editorGroupHeader.tabsBackground": "#004052", diff --git a/extensions/theme-solarized-light/themes/solarized-light-color-theme.json b/extensions/theme-solarized-light/themes/solarized-light-color-theme.json index 588e21e893..1f0cd3202e 100644 --- a/extensions/theme-solarized-light/themes/solarized-light-color-theme.json +++ b/extensions/theme-solarized-light/themes/solarized-light-color-theme.json @@ -409,7 +409,6 @@ // Workbench: Editors // "editorGroupHeader.noTabsBackground": "", "editorGroup.border": "#DDD6C1", - "editorGroup.background": "#FFFBF2", "editorGroup.dropBackground": "#DDD6C1AA", "editorGroupHeader.tabsBackground": "#D9D2C2", @@ -482,6 +481,9 @@ "terminal.ansiBrightBlue": "#839496", "terminal.ansiBrightMagenta": "#6c71c4", "terminal.ansiBrightCyan": "#93a1a1", - "terminal.ansiBrightWhite": "#eee8d5" + "terminal.ansiBrightWhite": "#eee8d5", + + // Interactive Playground + "walkThrough.embeddedEditorBackground": "#00000014" } } \ No newline at end of file diff --git a/extensions/theme-tomorrow-night-blue/themes/tomorrow-night-blue-theme.json b/extensions/theme-tomorrow-night-blue/themes/tomorrow-night-blue-theme.json index de15bf88bc..7ffe04a8d1 100644 --- a/extensions/theme-tomorrow-night-blue/themes/tomorrow-night-blue-theme.json +++ b/extensions/theme-tomorrow-night-blue/themes/tomorrow-night-blue-theme.json @@ -23,7 +23,6 @@ "editorHoverWidget.border": "#ffffff44", "editorGroup.border": "#404f7d", "editorGroupHeader.tabsBackground": "#001733", - "editorGroup.background": "#1c1c2a", "editorGroup.dropBackground": "#25375daa", "peekViewResult.background": "#001c40", "tab.inactiveBackground": "#001c40", diff --git a/extensions/vscode-colorize-tests/package.json b/extensions/vscode-colorize-tests/package.json index 0d6da2add0..756d09c865 100644 --- a/extensions/vscode-colorize-tests/package.json +++ b/extensions/vscode-colorize-tests/package.json @@ -13,6 +13,8 @@ }, "devDependencies": { "@types/node": "7.0.43", + "mocha-junit-reporter": "^1.17.0", + "mocha-multi-reporters": "^1.1.7", "vscode": "1.1.5" } -} \ No newline at end of file +} diff --git a/extensions/vscode-colorize-tests/src/index.ts b/extensions/vscode-colorize-tests/src/index.ts index c4e1ed029d..c622506514 100644 --- a/extensions/vscode-colorize-tests/src/index.ts +++ b/extensions/vscode-colorize-tests/src/index.ts @@ -3,26 +3,28 @@ * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -// -// PLEASE DO NOT MODIFY / DELETE UNLESS YOU KNOW WHAT YOU ARE DOING -// -// This file is providing the test runner to use when running extension tests. -// By default the test runner in use is Mocha based. -// -// You can provide your own test runner if you want to override it by exporting -// a function run(testRoot: string, clb: (error:Error) => void) that the extension -// host can call to run the tests. The test runner is expected to use console.log -// to report the results back to the caller. When the tests are finished, return -// a possible error to the callback or null if none. - +const path = require('path'); const testRunner = require('vscode/lib/testrunner'); -// You can directly control Mocha options by uncommenting the following lines -// See https://github.com/mochajs/mocha/wiki/Using-mocha-programmatically#set-options for more info -testRunner.configure({ - ui: 'tdd', // the TDD UI is being used in extension.test.ts (suite, test, etc.) - useColors: process.platform !== 'win32', // colored output from test results (only windows cannot handle) - timeout: 60000 -}); +const suite = 'Integration Colorize Tests'; -export = testRunner; \ No newline at end of file +const options: any = { + ui: 'tdd', + useColors: true, + timeout: 60000 +}; + +if (process.env.BUILD_ARTIFACTSTAGINGDIRECTORY) { + options.reporter = 'mocha-multi-reporters'; + options.reporterOptions = { + reporterEnabled: 'spec, mocha-junit-reporter', + mochaJunitReporterReporterOptions: { + testsuitesTitle: `${suite} ${process.platform}`, + mochaFile: path.join(process.env.BUILD_ARTIFACTSTAGINGDIRECTORY, `test-results/${process.platform}-${suite.toLowerCase().replace(/[^\w]/g, '-')}-results.xml`) + } + }; +} + +testRunner.configure(options); + +export = testRunner; diff --git a/extensions/vscode-colorize-tests/yarn.lock b/extensions/vscode-colorize-tests/yarn.lock index d06c1af542..5aa4e04741 100644 --- a/extensions/vscode-colorize-tests/yarn.lock +++ b/extensions/vscode-colorize-tests/yarn.lock @@ -19,6 +19,10 @@ ansi-regex@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" +ansi-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" + ansi-styles@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" @@ -162,6 +166,10 @@ chalk@^1.0.0, chalk@^1.1.1: strip-ansi "^3.0.0" supports-color "^2.0.0" +charenc@~0.0.1: + version "0.0.2" + resolved "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667" + clone-buffer@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/clone-buffer/-/clone-buffer-1.0.0.tgz#e3e25b207ac4e701af721e2cb5a16792cac3dc58" @@ -222,6 +230,10 @@ core-util-is@1.0.2, core-util-is@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" +crypt@~0.0.1: + version "0.0.2" + resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b" + cryptiles@2.x.x: version "2.0.5" resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8" @@ -250,6 +262,18 @@ debug@2.6.8: dependencies: ms "2.0.0" +debug@^2.2.0: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + dependencies: + ms "2.0.0" + +debug@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" + dependencies: + ms "2.0.0" + deep-assign@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/deep-assign/-/deep-assign-1.0.0.tgz#b092743be8427dc621ea0067cdec7e70dd19f37b" @@ -724,7 +748,7 @@ inherits@2, inherits@^2.0.1, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" -is-buffer@^1.1.5: +is-buffer@^1.1.5, is-buffer@~1.1.1: version "1.1.6" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" @@ -1004,10 +1028,22 @@ lodash.templatesettings@^3.0.0: lodash._reinterpolate "^3.0.0" lodash.escape "^3.0.0" +lodash@^4.16.4: + version "4.17.10" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.10.tgz#1b7793cf7259ea38fb3661d4d38b3260af8ae4e7" + map-stream@~0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/map-stream/-/map-stream-0.1.0.tgz#e56aa94c4c8055a16404a0674b78f215f7c8e194" +md5@^2.1.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/md5/-/md5-2.2.1.tgz#53ab38d5fe3c8891ba465329ea23fac0540126f9" + dependencies: + charenc "~0.0.1" + crypt "~0.0.1" + is-buffer "~1.1.1" + merge-stream@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-1.0.1.tgz#4041202d508a342ba00174008df0c251b8c135e1" @@ -1056,12 +1092,29 @@ minimist@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" -mkdirp@0.5.1, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1: +mkdirp@0.5.1, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" dependencies: minimist "0.0.8" +mocha-junit-reporter@^1.17.0: + version "1.17.0" + resolved "https://registry.yarnpkg.com/mocha-junit-reporter/-/mocha-junit-reporter-1.17.0.tgz#2e5149ed40fc5d2e3ca71e42db5ab1fec9c6d85c" + dependencies: + debug "^2.2.0" + md5 "^2.1.0" + mkdirp "~0.5.1" + strip-ansi "^4.0.0" + xml "^1.0.0" + +mocha-multi-reporters@^1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/mocha-multi-reporters/-/mocha-multi-reporters-1.1.7.tgz#cc7f3f4d32f478520941d852abb64d9988587d82" + dependencies: + debug "^3.1.0" + lodash "^4.16.4" + mocha@^3.2.0: version "3.5.3" resolved "https://registry.yarnpkg.com/mocha/-/mocha-3.5.3.tgz#1e0480fe36d2da5858d1eb6acc38418b26eaa20d" @@ -1436,6 +1489,12 @@ strip-ansi@^3.0.0: dependencies: ansi-regex "^2.0.0" +strip-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + dependencies: + ansi-regex "^3.0.0" + strip-bom-stream@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/strip-bom-stream/-/strip-bom-stream-1.0.0.tgz#e7144398577d51a6bed0fa1994fa05f43fd988ee" @@ -1643,6 +1702,10 @@ wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" +xml@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/xml/-/xml-1.0.1.tgz#78ba72020029c5bc87b8a81a3cfcd74b4a2fc1e5" + "xtend@>=4.0.0 <4.1.0-0", xtend@^4.0.0, xtend@~4.0.0, xtend@~4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" diff --git a/extensions/xml/syntaxes/xml.tmLanguage.json b/extensions/xml/syntaxes/xml.tmLanguage.json index 532e3908f2..acebb5275e 100644 --- a/extensions/xml/syntaxes/xml.tmLanguage.json +++ b/extensions/xml/syntaxes/xml.tmLanguage.json @@ -4,7 +4,7 @@ "If you want to provide a fix or improvement, please create a pull request against the original repository.", "Once accepted there, we are happy to receive an update request." ], - "version": "https://github.com/atom/language-xml/commit/27352842917b911383122bdcf98ed0d69d55c179", + "version": "https://github.com/atom/language-xml/commit/bd810deb404a12bea8ec5799fda2909349ba2654", "name": "XML", "scopeName": "text.xml", "patterns": [ @@ -350,14 +350,38 @@ ] }, "comments": { - "begin": "<[!%]--", - "captures": { - "0": { - "name": "punctuation.definition.comment.xml" + "patterns": [ + { + "begin": "<%--", + "captures": { + "0": { + "name": "punctuation.definition.comment.xml" + }, + "end": "--%>", + "name": "comment.block.xml" + } + }, + { + "begin": "", + "name": "comment.block.xml", + "patterns": [ + { + "begin": "--(?!>)", + "captures": { + "0": { + "name": "invalid.illegal.bad-comments-or-CDATA.xml" + } + } + } + ] } - }, - "end": "--%?>", - "name": "comment.block.xml" + ] } } } \ No newline at end of file diff --git a/extensions/xml/test/colorize-results/test-7115_xml.json b/extensions/xml/test/colorize-results/test-7115_xml.json index 5a14d78ce7..451e0e64dc 100644 --- a/extensions/xml/test/colorize-results/test-7115_xml.json +++ b/extensions/xml/test/colorize-results/test-7115_xml.json @@ -3,10 +3,10 @@ "c": "", "t": "text.xml meta.tag.preprocessor.xml punctuation.definition.tag.xml", "r": { - "dark_plus": "punctuation.definition.tag: #808080", - "light_plus": "punctuation.definition.tag: #800000", - "dark_vs": "punctuation.definition.tag: #808080", - "light_vs": "punctuation.definition.tag: #800000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "punctuation.definition.tag: #808080" } }, @@ -212,10 +212,10 @@ "c": "<", "t": "text.xml meta.tag.xml punctuation.definition.tag.xml", "r": { - "dark_plus": "punctuation.definition.tag: #808080", - "light_plus": "punctuation.definition.tag: #800000", - "dark_vs": "punctuation.definition.tag: #808080", - "light_vs": "punctuation.definition.tag: #800000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "punctuation.definition.tag: #808080" } }, @@ -223,10 +223,10 @@ "c": "WorkFine", "t": "text.xml meta.tag.xml entity.name.tag.localname.xml", "r": { - "dark_plus": "entity.name.tag: #569CD6", - "light_plus": "entity.name.tag: #800000", - "dark_vs": "entity.name.tag: #569CD6", - "light_vs": "entity.name.tag: #800000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "entity.name.tag: #569CD6" } }, @@ -234,10 +234,10 @@ "c": ">", "t": "text.xml meta.tag.xml punctuation.definition.tag.xml", "r": { - "dark_plus": "punctuation.definition.tag: #808080", - "light_plus": "punctuation.definition.tag: #800000", - "dark_vs": "punctuation.definition.tag: #808080", - "light_vs": "punctuation.definition.tag: #800000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "punctuation.definition.tag: #808080" } }, @@ -245,10 +245,10 @@ "c": " ", "t": "text.xml", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -256,10 +256,10 @@ "c": "<", "t": "text.xml meta.tag.xml punctuation.definition.tag.xml", "r": { - "dark_plus": "punctuation.definition.tag: #808080", - "light_plus": "punctuation.definition.tag: #800000", - "dark_vs": "punctuation.definition.tag: #808080", - "light_vs": "punctuation.definition.tag: #800000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "punctuation.definition.tag: #808080" } }, @@ -267,10 +267,10 @@ "c": "NoColorWithNonLatinCharacters_АБВ", "t": "text.xml meta.tag.xml entity.name.tag.localname.xml", "r": { - "dark_plus": "entity.name.tag: #569CD6", - "light_plus": "entity.name.tag: #800000", - "dark_vs": "entity.name.tag: #569CD6", - "light_vs": "entity.name.tag: #800000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "entity.name.tag: #569CD6" } }, @@ -278,10 +278,10 @@ "c": " ", "t": "text.xml meta.tag.xml", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -289,10 +289,10 @@ "c": "NextTagnotWork", "t": "text.xml meta.tag.xml entity.other.attribute-name.localname.xml", "r": { - "dark_plus": "entity.other.attribute-name: #9CDCFE", - "light_plus": "entity.other.attribute-name: #FF0000", - "dark_vs": "entity.other.attribute-name: #9CDCFE", - "light_vs": "entity.other.attribute-name: #FF0000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "entity.other.attribute-name: #9CDCFE" } }, @@ -300,10 +300,10 @@ "c": "=", "t": "text.xml meta.tag.xml", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -311,10 +311,10 @@ "c": "\"", "t": "text.xml meta.tag.xml string.quoted.double.xml punctuation.definition.string.begin.xml", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string.quoted.double.xml: #0000FF", - "dark_vs": "string: #CE9178", - "light_vs": "string.quoted.double.xml: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -322,10 +322,10 @@ "c": "something", "t": "text.xml meta.tag.xml string.quoted.double.xml", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string.quoted.double.xml: #0000FF", - "dark_vs": "string: #CE9178", - "light_vs": "string.quoted.double.xml: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -333,10 +333,10 @@ "c": "\"", "t": "text.xml meta.tag.xml string.quoted.double.xml punctuation.definition.string.end.xml", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string.quoted.double.xml: #0000FF", - "dark_vs": "string: #CE9178", - "light_vs": "string.quoted.double.xml: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -344,10 +344,10 @@ "c": " ", "t": "text.xml meta.tag.xml", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -355,10 +355,10 @@ "c": "Поле", "t": "text.xml meta.tag.xml entity.other.attribute-name.localname.xml", "r": { - "dark_plus": "entity.other.attribute-name: #9CDCFE", - "light_plus": "entity.other.attribute-name: #FF0000", - "dark_vs": "entity.other.attribute-name: #9CDCFE", - "light_vs": "entity.other.attribute-name: #FF0000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "entity.other.attribute-name: #9CDCFE" } }, @@ -366,10 +366,10 @@ "c": "=", "t": "text.xml meta.tag.xml", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -377,10 +377,10 @@ "c": "\"", "t": "text.xml meta.tag.xml string.quoted.double.xml punctuation.definition.string.begin.xml", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string.quoted.double.xml: #0000FF", - "dark_vs": "string: #CE9178", - "light_vs": "string.quoted.double.xml: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -388,10 +388,10 @@ "c": "tagnotwork", "t": "text.xml meta.tag.xml string.quoted.double.xml", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string.quoted.double.xml: #0000FF", - "dark_vs": "string: #CE9178", - "light_vs": "string.quoted.double.xml: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -399,10 +399,10 @@ "c": "\"", "t": "text.xml meta.tag.xml string.quoted.double.xml punctuation.definition.string.end.xml", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string.quoted.double.xml: #0000FF", - "dark_vs": "string: #CE9178", - "light_vs": "string.quoted.double.xml: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -410,10 +410,10 @@ "c": ">", "t": "text.xml meta.tag.xml punctuation.definition.tag.xml", "r": { - "dark_plus": "punctuation.definition.tag: #808080", - "light_plus": "punctuation.definition.tag: #800000", - "dark_vs": "punctuation.definition.tag: #808080", - "light_vs": "punctuation.definition.tag: #800000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "punctuation.definition.tag: #808080" } }, @@ -421,10 +421,10 @@ "c": " ", "t": "text.xml", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -432,10 +432,10 @@ "c": "<", "t": "text.xml meta.tag.xml punctuation.definition.tag.xml", "r": { - "dark_plus": "punctuation.definition.tag: #808080", - "light_plus": "punctuation.definition.tag: #800000", - "dark_vs": "punctuation.definition.tag: #808080", - "light_vs": "punctuation.definition.tag: #800000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "punctuation.definition.tag: #808080" } }, @@ -443,10 +443,10 @@ "c": "WorkFine", "t": "text.xml meta.tag.xml entity.name.tag.localname.xml", "r": { - "dark_plus": "entity.name.tag: #569CD6", - "light_plus": "entity.name.tag: #800000", - "dark_vs": "entity.name.tag: #569CD6", - "light_vs": "entity.name.tag: #800000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "entity.name.tag: #569CD6" } }, @@ -454,10 +454,10 @@ "c": "/>", "t": "text.xml meta.tag.xml punctuation.definition.tag.xml", "r": { - "dark_plus": "punctuation.definition.tag: #808080", - "light_plus": "punctuation.definition.tag: #800000", - "dark_vs": "punctuation.definition.tag: #808080", - "light_vs": "punctuation.definition.tag: #800000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "punctuation.definition.tag: #808080" } }, @@ -465,10 +465,10 @@ "c": " ", "t": "text.xml", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -476,10 +476,10 @@ "c": "<", "t": "text.xml meta.tag.xml punctuation.definition.tag.xml", "r": { - "dark_plus": "punctuation.definition.tag: #808080", - "light_plus": "punctuation.definition.tag: #800000", - "dark_vs": "punctuation.definition.tag: #808080", - "light_vs": "punctuation.definition.tag: #800000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "punctuation.definition.tag: #808080" } }, @@ -487,10 +487,10 @@ "c": "Error_АБВГД", "t": "text.xml meta.tag.xml entity.name.tag.localname.xml", "r": { - "dark_plus": "entity.name.tag: #569CD6", - "light_plus": "entity.name.tag: #800000", - "dark_vs": "entity.name.tag: #569CD6", - "light_vs": "entity.name.tag: #800000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "entity.name.tag: #569CD6" } }, @@ -498,10 +498,10 @@ "c": "/>", "t": "text.xml meta.tag.xml punctuation.definition.tag.xml", "r": { - "dark_plus": "punctuation.definition.tag: #808080", - "light_plus": "punctuation.definition.tag: #800000", - "dark_vs": "punctuation.definition.tag: #808080", - "light_vs": "punctuation.definition.tag: #800000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "punctuation.definition.tag: #808080" } }, @@ -509,10 +509,10 @@ "c": " ", "t": "text.xml", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -520,10 +520,10 @@ "c": "", "t": "text.xml meta.tag.xml punctuation.definition.tag.xml", "r": { - "dark_plus": "punctuation.definition.tag: #808080", - "light_plus": "punctuation.definition.tag: #800000", - "dark_vs": "punctuation.definition.tag: #808080", - "light_vs": "punctuation.definition.tag: #800000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "punctuation.definition.tag: #808080" } }, @@ -553,10 +553,10 @@ "c": "", "t": "text.xml meta.tag.xml punctuation.definition.tag.xml", "r": { - "dark_plus": "punctuation.definition.tag: #808080", - "light_plus": "punctuation.definition.tag: #800000", - "dark_vs": "punctuation.definition.tag: #808080", - "light_vs": "punctuation.definition.tag: #800000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "punctuation.definition.tag: #808080" } } diff --git a/extensions/xml/test/colorize-results/test_xml.json b/extensions/xml/test/colorize-results/test_xml.json index 80525b2917..66550f2e22 100644 --- a/extensions/xml/test/colorize-results/test_xml.json +++ b/extensions/xml/test/colorize-results/test_xml.json @@ -3,10 +3,10 @@ "c": "<", "t": "text.xml meta.tag.xml punctuation.definition.tag.xml", "r": { - "dark_plus": "punctuation.definition.tag: #808080", - "light_plus": "punctuation.definition.tag: #800000", - "dark_vs": "punctuation.definition.tag: #808080", - "light_vs": "punctuation.definition.tag: #800000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "punctuation.definition.tag: #808080" } }, @@ -14,10 +14,10 @@ "c": "project", "t": "text.xml meta.tag.xml entity.name.tag.localname.xml", "r": { - "dark_plus": "entity.name.tag: #569CD6", - "light_plus": "entity.name.tag: #800000", - "dark_vs": "entity.name.tag: #569CD6", - "light_vs": "entity.name.tag: #800000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "entity.name.tag: #569CD6" } }, @@ -25,10 +25,10 @@ "c": ">", "t": "text.xml meta.tag.xml punctuation.definition.tag.xml", "r": { - "dark_plus": "punctuation.definition.tag: #808080", - "light_plus": "punctuation.definition.tag: #800000", - "dark_vs": "punctuation.definition.tag: #808080", - "light_vs": "punctuation.definition.tag: #800000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "punctuation.definition.tag: #808080" } }, @@ -36,10 +36,10 @@ "c": " ", "t": "text.xml", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -47,10 +47,10 @@ "c": "<", "t": "text.xml meta.tag.xml punctuation.definition.tag.xml", "r": { - "dark_plus": "punctuation.definition.tag: #808080", - "light_plus": "punctuation.definition.tag: #800000", - "dark_vs": "punctuation.definition.tag: #808080", - "light_vs": "punctuation.definition.tag: #800000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "punctuation.definition.tag: #808080" } }, @@ -58,10 +58,10 @@ "c": "target", "t": "text.xml meta.tag.xml entity.name.tag.localname.xml", "r": { - "dark_plus": "entity.name.tag: #569CD6", - "light_plus": "entity.name.tag: #800000", - "dark_vs": "entity.name.tag: #569CD6", - "light_vs": "entity.name.tag: #800000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "entity.name.tag: #569CD6" } }, @@ -69,10 +69,10 @@ "c": " ", "t": "text.xml meta.tag.xml", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -80,10 +80,10 @@ "c": "name", "t": "text.xml meta.tag.xml entity.other.attribute-name.localname.xml", "r": { - "dark_plus": "entity.other.attribute-name: #9CDCFE", - "light_plus": "entity.other.attribute-name: #FF0000", - "dark_vs": "entity.other.attribute-name: #9CDCFE", - "light_vs": "entity.other.attribute-name: #FF0000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "entity.other.attribute-name: #9CDCFE" } }, @@ -91,10 +91,10 @@ "c": "=", "t": "text.xml meta.tag.xml", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -102,10 +102,10 @@ "c": "\"", "t": "text.xml meta.tag.xml string.quoted.double.xml punctuation.definition.string.begin.xml", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string.quoted.double.xml: #0000FF", - "dark_vs": "string: #CE9178", - "light_vs": "string.quoted.double.xml: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -113,10 +113,10 @@ "c": "jar", "t": "text.xml meta.tag.xml string.quoted.double.xml", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string.quoted.double.xml: #0000FF", - "dark_vs": "string: #CE9178", - "light_vs": "string.quoted.double.xml: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -124,10 +124,10 @@ "c": "\"", "t": "text.xml meta.tag.xml string.quoted.double.xml punctuation.definition.string.end.xml", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string.quoted.double.xml: #0000FF", - "dark_vs": "string: #CE9178", - "light_vs": "string.quoted.double.xml: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -135,10 +135,10 @@ "c": ">", "t": "text.xml meta.tag.xml punctuation.definition.tag.xml", "r": { - "dark_plus": "punctuation.definition.tag: #808080", - "light_plus": "punctuation.definition.tag: #800000", - "dark_vs": "punctuation.definition.tag: #808080", - "light_vs": "punctuation.definition.tag: #800000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "punctuation.definition.tag: #808080" } }, @@ -146,10 +146,10 @@ "c": " ", "t": "text.xml", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -157,10 +157,10 @@ "c": "<", "t": "text.xml meta.tag.xml punctuation.definition.tag.xml", "r": { - "dark_plus": "punctuation.definition.tag: #808080", - "light_plus": "punctuation.definition.tag: #800000", - "dark_vs": "punctuation.definition.tag: #808080", - "light_vs": "punctuation.definition.tag: #800000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "punctuation.definition.tag: #808080" } }, @@ -168,10 +168,10 @@ "c": "mkdir", "t": "text.xml meta.tag.xml entity.name.tag.localname.xml", "r": { - "dark_plus": "entity.name.tag: #569CD6", - "light_plus": "entity.name.tag: #800000", - "dark_vs": "entity.name.tag: #569CD6", - "light_vs": "entity.name.tag: #800000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "entity.name.tag: #569CD6" } }, @@ -179,10 +179,10 @@ "c": " ", "t": "text.xml meta.tag.xml", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -190,10 +190,10 @@ "c": "dir", "t": "text.xml meta.tag.xml entity.other.attribute-name.localname.xml", "r": { - "dark_plus": "entity.other.attribute-name: #9CDCFE", - "light_plus": "entity.other.attribute-name: #FF0000", - "dark_vs": "entity.other.attribute-name: #9CDCFE", - "light_vs": "entity.other.attribute-name: #FF0000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "entity.other.attribute-name: #9CDCFE" } }, @@ -201,10 +201,10 @@ "c": "=", "t": "text.xml meta.tag.xml", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -212,10 +212,10 @@ "c": "\"", "t": "text.xml meta.tag.xml string.quoted.double.xml punctuation.definition.string.begin.xml", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string.quoted.double.xml: #0000FF", - "dark_vs": "string: #CE9178", - "light_vs": "string.quoted.double.xml: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -223,10 +223,10 @@ "c": "build/jar", "t": "text.xml meta.tag.xml string.quoted.double.xml", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string.quoted.double.xml: #0000FF", - "dark_vs": "string: #CE9178", - "light_vs": "string.quoted.double.xml: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -234,10 +234,10 @@ "c": "\"", "t": "text.xml meta.tag.xml string.quoted.double.xml punctuation.definition.string.end.xml", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string.quoted.double.xml: #0000FF", - "dark_vs": "string: #CE9178", - "light_vs": "string.quoted.double.xml: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -245,10 +245,10 @@ "c": "/>", "t": "text.xml meta.tag.xml punctuation.definition.tag.xml", "r": { - "dark_plus": "punctuation.definition.tag: #808080", - "light_plus": "punctuation.definition.tag: #800000", - "dark_vs": "punctuation.definition.tag: #808080", - "light_vs": "punctuation.definition.tag: #800000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "punctuation.definition.tag: #808080" } }, @@ -256,10 +256,10 @@ "c": " ", "t": "text.xml", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -267,10 +267,10 @@ "c": "<", "t": "text.xml meta.tag.xml punctuation.definition.tag.xml", "r": { - "dark_plus": "punctuation.definition.tag: #808080", - "light_plus": "punctuation.definition.tag: #800000", - "dark_vs": "punctuation.definition.tag: #808080", - "light_vs": "punctuation.definition.tag: #800000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "punctuation.definition.tag: #808080" } }, @@ -278,10 +278,10 @@ "c": "jar", "t": "text.xml meta.tag.xml entity.name.tag.localname.xml", "r": { - "dark_plus": "entity.name.tag: #569CD6", - "light_plus": "entity.name.tag: #800000", - "dark_vs": "entity.name.tag: #569CD6", - "light_vs": "entity.name.tag: #800000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "entity.name.tag: #569CD6" } }, @@ -289,10 +289,10 @@ "c": " ", "t": "text.xml meta.tag.xml", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -300,10 +300,10 @@ "c": "destfile", "t": "text.xml meta.tag.xml entity.other.attribute-name.localname.xml", "r": { - "dark_plus": "entity.other.attribute-name: #9CDCFE", - "light_plus": "entity.other.attribute-name: #FF0000", - "dark_vs": "entity.other.attribute-name: #9CDCFE", - "light_vs": "entity.other.attribute-name: #FF0000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "entity.other.attribute-name: #9CDCFE" } }, @@ -311,10 +311,10 @@ "c": "=", "t": "text.xml meta.tag.xml", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -322,10 +322,10 @@ "c": "\"", "t": "text.xml meta.tag.xml string.quoted.double.xml punctuation.definition.string.begin.xml", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string.quoted.double.xml: #0000FF", - "dark_vs": "string: #CE9178", - "light_vs": "string.quoted.double.xml: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -333,10 +333,10 @@ "c": "build/jar/HelloWorld.jar", "t": "text.xml meta.tag.xml string.quoted.double.xml", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string.quoted.double.xml: #0000FF", - "dark_vs": "string: #CE9178", - "light_vs": "string.quoted.double.xml: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -344,10 +344,10 @@ "c": "\"", "t": "text.xml meta.tag.xml string.quoted.double.xml punctuation.definition.string.end.xml", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string.quoted.double.xml: #0000FF", - "dark_vs": "string: #CE9178", - "light_vs": "string.quoted.double.xml: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -355,10 +355,10 @@ "c": " ", "t": "text.xml meta.tag.xml", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -366,10 +366,10 @@ "c": "basedir", "t": "text.xml meta.tag.xml entity.other.attribute-name.localname.xml", "r": { - "dark_plus": "entity.other.attribute-name: #9CDCFE", - "light_plus": "entity.other.attribute-name: #FF0000", - "dark_vs": "entity.other.attribute-name: #9CDCFE", - "light_vs": "entity.other.attribute-name: #FF0000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "entity.other.attribute-name: #9CDCFE" } }, @@ -377,10 +377,10 @@ "c": "=", "t": "text.xml meta.tag.xml", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -388,10 +388,10 @@ "c": "\"", "t": "text.xml meta.tag.xml string.quoted.double.xml punctuation.definition.string.begin.xml", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string.quoted.double.xml: #0000FF", - "dark_vs": "string: #CE9178", - "light_vs": "string.quoted.double.xml: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -399,10 +399,10 @@ "c": "build/classes", "t": "text.xml meta.tag.xml string.quoted.double.xml", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string.quoted.double.xml: #0000FF", - "dark_vs": "string: #CE9178", - "light_vs": "string.quoted.double.xml: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -410,10 +410,10 @@ "c": "\"", "t": "text.xml meta.tag.xml string.quoted.double.xml punctuation.definition.string.end.xml", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string.quoted.double.xml: #0000FF", - "dark_vs": "string: #CE9178", - "light_vs": "string.quoted.double.xml: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -421,10 +421,10 @@ "c": ">", "t": "text.xml meta.tag.xml punctuation.definition.tag.xml", "r": { - "dark_plus": "punctuation.definition.tag: #808080", - "light_plus": "punctuation.definition.tag: #800000", - "dark_vs": "punctuation.definition.tag: #808080", - "light_vs": "punctuation.definition.tag: #800000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "punctuation.definition.tag: #808080" } }, @@ -432,10 +432,10 @@ "c": " ", "t": "text.xml", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -443,10 +443,10 @@ "c": "<", "t": "text.xml meta.tag.xml punctuation.definition.tag.xml", "r": { - "dark_plus": "punctuation.definition.tag: #808080", - "light_plus": "punctuation.definition.tag: #800000", - "dark_vs": "punctuation.definition.tag: #808080", - "light_vs": "punctuation.definition.tag: #800000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "punctuation.definition.tag: #808080" } }, @@ -454,10 +454,10 @@ "c": "manifest", "t": "text.xml meta.tag.xml entity.name.tag.localname.xml", "r": { - "dark_plus": "entity.name.tag: #569CD6", - "light_plus": "entity.name.tag: #800000", - "dark_vs": "entity.name.tag: #569CD6", - "light_vs": "entity.name.tag: #800000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "entity.name.tag: #569CD6" } }, @@ -465,10 +465,10 @@ "c": ">", "t": "text.xml meta.tag.xml punctuation.definition.tag.xml", "r": { - "dark_plus": "punctuation.definition.tag: #808080", - "light_plus": "punctuation.definition.tag: #800000", - "dark_vs": "punctuation.definition.tag: #808080", - "light_vs": "punctuation.definition.tag: #800000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "punctuation.definition.tag: #808080" } }, @@ -476,10 +476,10 @@ "c": " ", "t": "text.xml", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -487,10 +487,10 @@ "c": "<", "t": "text.xml meta.tag.xml punctuation.definition.tag.xml", "r": { - "dark_plus": "punctuation.definition.tag: #808080", - "light_plus": "punctuation.definition.tag: #800000", - "dark_vs": "punctuation.definition.tag: #808080", - "light_vs": "punctuation.definition.tag: #800000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "punctuation.definition.tag: #808080" } }, @@ -498,10 +498,10 @@ "c": "attribute", "t": "text.xml meta.tag.xml entity.name.tag.localname.xml", "r": { - "dark_plus": "entity.name.tag: #569CD6", - "light_plus": "entity.name.tag: #800000", - "dark_vs": "entity.name.tag: #569CD6", - "light_vs": "entity.name.tag: #800000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "entity.name.tag: #569CD6" } }, @@ -509,10 +509,10 @@ "c": " ", "t": "text.xml meta.tag.xml", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -520,10 +520,10 @@ "c": "name", "t": "text.xml meta.tag.xml entity.other.attribute-name.localname.xml", "r": { - "dark_plus": "entity.other.attribute-name: #9CDCFE", - "light_plus": "entity.other.attribute-name: #FF0000", - "dark_vs": "entity.other.attribute-name: #9CDCFE", - "light_vs": "entity.other.attribute-name: #FF0000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "entity.other.attribute-name: #9CDCFE" } }, @@ -531,10 +531,10 @@ "c": "=", "t": "text.xml meta.tag.xml", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -542,10 +542,10 @@ "c": "\"", "t": "text.xml meta.tag.xml string.quoted.double.xml punctuation.definition.string.begin.xml", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string.quoted.double.xml: #0000FF", - "dark_vs": "string: #CE9178", - "light_vs": "string.quoted.double.xml: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -553,10 +553,10 @@ "c": "Main-Class", "t": "text.xml meta.tag.xml string.quoted.double.xml", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string.quoted.double.xml: #0000FF", - "dark_vs": "string: #CE9178", - "light_vs": "string.quoted.double.xml: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -564,10 +564,10 @@ "c": "\"", "t": "text.xml meta.tag.xml string.quoted.double.xml punctuation.definition.string.end.xml", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string.quoted.double.xml: #0000FF", - "dark_vs": "string: #CE9178", - "light_vs": "string.quoted.double.xml: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -575,10 +575,10 @@ "c": " ", "t": "text.xml meta.tag.xml", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -586,10 +586,10 @@ "c": "value", "t": "text.xml meta.tag.xml entity.other.attribute-name.localname.xml", "r": { - "dark_plus": "entity.other.attribute-name: #9CDCFE", - "light_plus": "entity.other.attribute-name: #FF0000", - "dark_vs": "entity.other.attribute-name: #9CDCFE", - "light_vs": "entity.other.attribute-name: #FF0000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "entity.other.attribute-name: #9CDCFE" } }, @@ -597,10 +597,10 @@ "c": "=", "t": "text.xml meta.tag.xml", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -608,10 +608,10 @@ "c": "\"", "t": "text.xml meta.tag.xml string.quoted.double.xml punctuation.definition.string.begin.xml", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string.quoted.double.xml: #0000FF", - "dark_vs": "string: #CE9178", - "light_vs": "string.quoted.double.xml: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -619,10 +619,10 @@ "c": "oata.HelloWorld", "t": "text.xml meta.tag.xml string.quoted.double.xml", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string.quoted.double.xml: #0000FF", - "dark_vs": "string: #CE9178", - "light_vs": "string.quoted.double.xml: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -630,10 +630,10 @@ "c": "\"", "t": "text.xml meta.tag.xml string.quoted.double.xml punctuation.definition.string.end.xml", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string.quoted.double.xml: #0000FF", - "dark_vs": "string: #CE9178", - "light_vs": "string.quoted.double.xml: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -641,10 +641,10 @@ "c": "/>", "t": "text.xml meta.tag.xml punctuation.definition.tag.xml", "r": { - "dark_plus": "punctuation.definition.tag: #808080", - "light_plus": "punctuation.definition.tag: #800000", - "dark_vs": "punctuation.definition.tag: #808080", - "light_vs": "punctuation.definition.tag: #800000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "punctuation.definition.tag: #808080" } }, @@ -652,10 +652,10 @@ "c": " ", "t": "text.xml", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -663,10 +663,10 @@ "c": "", "t": "text.xml meta.tag.xml punctuation.definition.tag.xml", "r": { - "dark_plus": "punctuation.definition.tag: #808080", - "light_plus": "punctuation.definition.tag: #800000", - "dark_vs": "punctuation.definition.tag: #808080", - "light_vs": "punctuation.definition.tag: #800000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "punctuation.definition.tag: #808080" } }, @@ -696,10 +696,10 @@ "c": " ", "t": "text.xml", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -707,10 +707,10 @@ "c": "", "t": "text.xml meta.tag.xml punctuation.definition.tag.xml", "r": { - "dark_plus": "punctuation.definition.tag: #808080", - "light_plus": "punctuation.definition.tag: #800000", - "dark_vs": "punctuation.definition.tag: #808080", - "light_vs": "punctuation.definition.tag: #800000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "punctuation.definition.tag: #808080" } }, @@ -740,10 +740,10 @@ "c": " ", "t": "text.xml", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -751,10 +751,10 @@ "c": "", "t": "text.xml meta.tag.xml punctuation.definition.tag.xml", "r": { - "dark_plus": "punctuation.definition.tag: #808080", - "light_plus": "punctuation.definition.tag: #800000", - "dark_vs": "punctuation.definition.tag: #808080", - "light_vs": "punctuation.definition.tag: #800000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "punctuation.definition.tag: #808080" } }, @@ -784,10 +784,10 @@ "c": " ", "t": "text.xml", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -795,10 +795,10 @@ "c": "", "t": "text.xml comment.block.xml punctuation.definition.comment.xml", "r": { - "dark_plus": "comment: #608B4E", - "light_plus": "comment: #008000", - "dark_vs": "comment: #608B4E", - "light_vs": "comment: #008000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "comment: #7CA668" } }, @@ -828,10 +828,10 @@ "c": " ", "t": "text.xml", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -839,10 +839,10 @@ "c": "<", "t": "text.xml meta.tag.xml punctuation.definition.tag.xml", "r": { - "dark_plus": "punctuation.definition.tag: #808080", - "light_plus": "punctuation.definition.tag: #800000", - "dark_vs": "punctuation.definition.tag: #808080", - "light_vs": "punctuation.definition.tag: #800000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "punctuation.definition.tag: #808080" } }, @@ -850,10 +850,10 @@ "c": "character", "t": "text.xml meta.tag.xml entity.name.tag.localname.xml", "r": { - "dark_plus": "entity.name.tag: #569CD6", - "light_plus": "entity.name.tag: #800000", - "dark_vs": "entity.name.tag: #569CD6", - "light_vs": "entity.name.tag: #800000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "entity.name.tag: #569CD6" } }, @@ -861,10 +861,10 @@ "c": " ", "t": "text.xml meta.tag.xml", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -872,10 +872,10 @@ "c": "id", "t": "text.xml meta.tag.xml entity.other.attribute-name.localname.xml", "r": { - "dark_plus": "entity.other.attribute-name: #9CDCFE", - "light_plus": "entity.other.attribute-name: #FF0000", - "dark_vs": "entity.other.attribute-name: #9CDCFE", - "light_vs": "entity.other.attribute-name: #FF0000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "entity.other.attribute-name: #9CDCFE" } }, @@ -883,10 +883,10 @@ "c": "=", "t": "text.xml meta.tag.xml", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -894,10 +894,10 @@ "c": "\"", "t": "text.xml meta.tag.xml string.quoted.double.xml punctuation.definition.string.begin.xml", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string.quoted.double.xml: #0000FF", - "dark_vs": "string: #CE9178", - "light_vs": "string.quoted.double.xml: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -905,10 +905,10 @@ "c": "Lucy", "t": "text.xml meta.tag.xml string.quoted.double.xml", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string.quoted.double.xml: #0000FF", - "dark_vs": "string: #CE9178", - "light_vs": "string.quoted.double.xml: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -916,10 +916,10 @@ "c": "\"", "t": "text.xml meta.tag.xml string.quoted.double.xml punctuation.definition.string.end.xml", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string.quoted.double.xml: #0000FF", - "dark_vs": "string: #CE9178", - "light_vs": "string.quoted.double.xml: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -927,10 +927,10 @@ "c": ">", "t": "text.xml meta.tag.xml punctuation.definition.tag.xml", "r": { - "dark_plus": "punctuation.definition.tag: #808080", - "light_plus": "punctuation.definition.tag: #800000", - "dark_vs": "punctuation.definition.tag: #808080", - "light_vs": "punctuation.definition.tag: #800000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "punctuation.definition.tag: #808080" } }, @@ -938,10 +938,10 @@ "c": " ", "t": "text.xml", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -949,10 +949,10 @@ "c": "<", "t": "text.xml meta.tag.xml punctuation.definition.tag.xml", "r": { - "dark_plus": "punctuation.definition.tag: #808080", - "light_plus": "punctuation.definition.tag: #800000", - "dark_vs": "punctuation.definition.tag: #808080", - "light_vs": "punctuation.definition.tag: #800000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "punctuation.definition.tag: #808080" } }, @@ -960,10 +960,10 @@ "c": "hr", "t": "text.xml meta.tag.xml entity.name.tag.namespace.xml", "r": { - "dark_plus": "entity.name.tag: #569CD6", - "light_plus": "entity.name.tag: #800000", - "dark_vs": "entity.name.tag: #569CD6", - "light_vs": "entity.name.tag: #800000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "entity.name.tag: #569CD6" } }, @@ -971,10 +971,10 @@ "c": ":", "t": "text.xml meta.tag.xml entity.name.tag.xml punctuation.separator.namespace.xml", "r": { - "dark_plus": "entity.name.tag: #569CD6", - "light_plus": "entity.name.tag: #800000", - "dark_vs": "entity.name.tag: #569CD6", - "light_vs": "entity.name.tag: #800000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "entity.name.tag: #569CD6" } }, @@ -982,10 +982,10 @@ "c": "name", "t": "text.xml meta.tag.xml entity.name.tag.localname.xml", "r": { - "dark_plus": "entity.name.tag: #569CD6", - "light_plus": "entity.name.tag: #800000", - "dark_vs": "entity.name.tag: #569CD6", - "light_vs": "entity.name.tag: #800000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "entity.name.tag: #569CD6" } }, @@ -993,10 +993,10 @@ "c": ">", "t": "text.xml meta.tag.xml punctuation.definition.tag.xml", "r": { - "dark_plus": "punctuation.definition.tag: #808080", - "light_plus": "punctuation.definition.tag: #800000", - "dark_vs": "punctuation.definition.tag: #808080", - "light_vs": "punctuation.definition.tag: #800000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "punctuation.definition.tag: #808080" } }, @@ -1004,10 +1004,10 @@ "c": "Lucy", "t": "text.xml", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1015,10 +1015,10 @@ "c": "", "t": "text.xml meta.tag.xml punctuation.definition.tag.xml", "r": { - "dark_plus": "punctuation.definition.tag: #808080", - "light_plus": "punctuation.definition.tag: #800000", - "dark_vs": "punctuation.definition.tag: #808080", - "light_vs": "punctuation.definition.tag: #800000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "punctuation.definition.tag: #808080" } }, @@ -1070,10 +1070,10 @@ "c": " ", "t": "text.xml", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1081,10 +1081,10 @@ "c": "<", "t": "text.xml meta.tag.xml punctuation.definition.tag.xml", "r": { - "dark_plus": "punctuation.definition.tag: #808080", - "light_plus": "punctuation.definition.tag: #800000", - "dark_vs": "punctuation.definition.tag: #808080", - "light_vs": "punctuation.definition.tag: #800000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "punctuation.definition.tag: #808080" } }, @@ -1092,10 +1092,10 @@ "c": "hr", "t": "text.xml meta.tag.xml entity.name.tag.namespace.xml", "r": { - "dark_plus": "entity.name.tag: #569CD6", - "light_plus": "entity.name.tag: #800000", - "dark_vs": "entity.name.tag: #569CD6", - "light_vs": "entity.name.tag: #800000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "entity.name.tag: #569CD6" } }, @@ -1103,10 +1103,10 @@ "c": ":", "t": "text.xml meta.tag.xml entity.name.tag.xml punctuation.separator.namespace.xml", "r": { - "dark_plus": "entity.name.tag: #569CD6", - "light_plus": "entity.name.tag: #800000", - "dark_vs": "entity.name.tag: #569CD6", - "light_vs": "entity.name.tag: #800000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "entity.name.tag: #569CD6" } }, @@ -1114,10 +1114,10 @@ "c": "born", "t": "text.xml meta.tag.xml entity.name.tag.localname.xml", "r": { - "dark_plus": "entity.name.tag: #569CD6", - "light_plus": "entity.name.tag: #800000", - "dark_vs": "entity.name.tag: #569CD6", - "light_vs": "entity.name.tag: #800000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "entity.name.tag: #569CD6" } }, @@ -1125,10 +1125,10 @@ "c": ">", "t": "text.xml meta.tag.xml punctuation.definition.tag.xml", "r": { - "dark_plus": "punctuation.definition.tag: #808080", - "light_plus": "punctuation.definition.tag: #800000", - "dark_vs": "punctuation.definition.tag: #808080", - "light_vs": "punctuation.definition.tag: #800000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "punctuation.definition.tag: #808080" } }, @@ -1136,10 +1136,10 @@ "c": "1952-03-03", "t": "text.xml", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1147,10 +1147,10 @@ "c": "", "t": "text.xml meta.tag.xml punctuation.definition.tag.xml", "r": { - "dark_plus": "punctuation.definition.tag: #808080", - "light_plus": "punctuation.definition.tag: #800000", - "dark_vs": "punctuation.definition.tag: #808080", - "light_vs": "punctuation.definition.tag: #800000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "punctuation.definition.tag: #808080" } }, @@ -1202,10 +1202,10 @@ "c": " ", "t": "text.xml", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1213,10 +1213,10 @@ "c": "<", "t": "text.xml meta.tag.xml punctuation.definition.tag.xml", "r": { - "dark_plus": "punctuation.definition.tag: #808080", - "light_plus": "punctuation.definition.tag: #800000", - "dark_vs": "punctuation.definition.tag: #808080", - "light_vs": "punctuation.definition.tag: #800000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "punctuation.definition.tag: #808080" } }, @@ -1224,10 +1224,10 @@ "c": "qualification", "t": "text.xml meta.tag.xml entity.name.tag.localname.xml", "r": { - "dark_plus": "entity.name.tag: #569CD6", - "light_plus": "entity.name.tag: #800000", - "dark_vs": "entity.name.tag: #569CD6", - "light_vs": "entity.name.tag: #800000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "entity.name.tag: #569CD6" } }, @@ -1235,10 +1235,10 @@ "c": ">", "t": "text.xml meta.tag.xml punctuation.definition.tag.xml", "r": { - "dark_plus": "punctuation.definition.tag: #808080", - "light_plus": "punctuation.definition.tag: #800000", - "dark_vs": "punctuation.definition.tag: #808080", - "light_vs": "punctuation.definition.tag: #800000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "punctuation.definition.tag: #808080" } }, @@ -1246,10 +1246,10 @@ "c": "bossy, crabby and selfish", "t": "text.xml", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1257,10 +1257,10 @@ "c": "", "t": "text.xml meta.tag.xml punctuation.definition.tag.xml", "r": { - "dark_plus": "punctuation.definition.tag: #808080", - "light_plus": "punctuation.definition.tag: #800000", - "dark_vs": "punctuation.definition.tag: #808080", - "light_vs": "punctuation.definition.tag: #800000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "punctuation.definition.tag: #808080" } }, @@ -1290,10 +1290,10 @@ "c": " ", "t": "text.xml", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1301,10 +1301,10 @@ "c": "", "t": "text.xml meta.tag.xml punctuation.definition.tag.xml", "r": { - "dark_plus": "punctuation.definition.tag: #808080", - "light_plus": "punctuation.definition.tag: #800000", - "dark_vs": "punctuation.definition.tag: #808080", - "light_vs": "punctuation.definition.tag: #800000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "punctuation.definition.tag: #808080" } }, @@ -1334,10 +1334,10 @@ "c": " ", "t": "text.xml", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1345,10 +1345,10 @@ "c": "<", "t": "text.xml meta.tag.xml punctuation.definition.tag.xml", "r": { - "dark_plus": "punctuation.definition.tag: #808080", - "light_plus": "punctuation.definition.tag: #800000", - "dark_vs": "punctuation.definition.tag: #808080", - "light_vs": "punctuation.definition.tag: #800000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "punctuation.definition.tag: #808080" } }, @@ -1356,10 +1356,10 @@ "c": "VisualState.Setters", "t": "text.xml meta.tag.xml entity.name.tag.localname.xml", "r": { - "dark_plus": "entity.name.tag: #569CD6", - "light_plus": "entity.name.tag: #800000", - "dark_vs": "entity.name.tag: #569CD6", - "light_vs": "entity.name.tag: #800000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "entity.name.tag: #569CD6" } }, @@ -1367,10 +1367,10 @@ "c": ">", "t": "text.xml meta.tag.xml punctuation.definition.tag.xml", "r": { - "dark_plus": "punctuation.definition.tag: #808080", - "light_plus": "punctuation.definition.tag: #800000", - "dark_vs": "punctuation.definition.tag: #808080", - "light_vs": "punctuation.definition.tag: #800000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "punctuation.definition.tag: #808080" } }, @@ -1378,10 +1378,10 @@ "c": " ", "t": "text.xml", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1389,10 +1389,10 @@ "c": "<", "t": "text.xml meta.tag.xml punctuation.definition.tag.xml", "r": { - "dark_plus": "punctuation.definition.tag: #808080", - "light_plus": "punctuation.definition.tag: #800000", - "dark_vs": "punctuation.definition.tag: #808080", - "light_vs": "punctuation.definition.tag: #800000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "punctuation.definition.tag: #808080" } }, @@ -1400,10 +1400,10 @@ "c": "Setter", "t": "text.xml meta.tag.xml entity.name.tag.localname.xml", "r": { - "dark_plus": "entity.name.tag: #569CD6", - "light_plus": "entity.name.tag: #800000", - "dark_vs": "entity.name.tag: #569CD6", - "light_vs": "entity.name.tag: #800000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "entity.name.tag: #569CD6" } }, @@ -1411,10 +1411,10 @@ "c": " ", "t": "text.xml meta.tag.xml", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1422,10 +1422,10 @@ "c": "Target", "t": "text.xml meta.tag.xml entity.other.attribute-name.localname.xml", "r": { - "dark_plus": "entity.other.attribute-name: #9CDCFE", - "light_plus": "entity.other.attribute-name: #FF0000", - "dark_vs": "entity.other.attribute-name: #9CDCFE", - "light_vs": "entity.other.attribute-name: #FF0000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "entity.other.attribute-name: #9CDCFE" } }, @@ -1433,10 +1433,10 @@ "c": "=", "t": "text.xml meta.tag.xml", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1444,10 +1444,10 @@ "c": "\"", "t": "text.xml meta.tag.xml string.quoted.double.xml punctuation.definition.string.begin.xml", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string.quoted.double.xml: #0000FF", - "dark_vs": "string: #CE9178", - "light_vs": "string.quoted.double.xml: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -1455,10 +1455,10 @@ "c": "inputPanel.Orientation", "t": "text.xml meta.tag.xml string.quoted.double.xml", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string.quoted.double.xml: #0000FF", - "dark_vs": "string: #CE9178", - "light_vs": "string.quoted.double.xml: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -1466,10 +1466,10 @@ "c": "\"", "t": "text.xml meta.tag.xml string.quoted.double.xml punctuation.definition.string.end.xml", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string.quoted.double.xml: #0000FF", - "dark_vs": "string: #CE9178", - "light_vs": "string.quoted.double.xml: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -1477,10 +1477,10 @@ "c": " ", "t": "text.xml meta.tag.xml", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1488,10 +1488,10 @@ "c": "Value", "t": "text.xml meta.tag.xml entity.other.attribute-name.localname.xml", "r": { - "dark_plus": "entity.other.attribute-name: #9CDCFE", - "light_plus": "entity.other.attribute-name: #FF0000", - "dark_vs": "entity.other.attribute-name: #9CDCFE", - "light_vs": "entity.other.attribute-name: #FF0000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "entity.other.attribute-name: #9CDCFE" } }, @@ -1499,10 +1499,10 @@ "c": "=", "t": "text.xml meta.tag.xml", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1510,10 +1510,10 @@ "c": "\"", "t": "text.xml meta.tag.xml string.quoted.double.xml punctuation.definition.string.begin.xml", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string.quoted.double.xml: #0000FF", - "dark_vs": "string: #CE9178", - "light_vs": "string.quoted.double.xml: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -1521,10 +1521,10 @@ "c": "Vertical", "t": "text.xml meta.tag.xml string.quoted.double.xml", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string.quoted.double.xml: #0000FF", - "dark_vs": "string: #CE9178", - "light_vs": "string.quoted.double.xml: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -1532,10 +1532,10 @@ "c": "\"", "t": "text.xml meta.tag.xml string.quoted.double.xml punctuation.definition.string.end.xml", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string.quoted.double.xml: #0000FF", - "dark_vs": "string: #CE9178", - "light_vs": "string.quoted.double.xml: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -1543,10 +1543,10 @@ "c": "/>", "t": "text.xml meta.tag.xml punctuation.definition.tag.xml", "r": { - "dark_plus": "punctuation.definition.tag: #808080", - "light_plus": "punctuation.definition.tag: #800000", - "dark_vs": "punctuation.definition.tag: #808080", - "light_vs": "punctuation.definition.tag: #800000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "punctuation.definition.tag: #808080" } }, @@ -1554,10 +1554,10 @@ "c": " ", "t": "text.xml", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1565,10 +1565,10 @@ "c": "<", "t": "text.xml meta.tag.xml punctuation.definition.tag.xml", "r": { - "dark_plus": "punctuation.definition.tag: #808080", - "light_plus": "punctuation.definition.tag: #800000", - "dark_vs": "punctuation.definition.tag: #808080", - "light_vs": "punctuation.definition.tag: #800000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "punctuation.definition.tag: #808080" } }, @@ -1576,10 +1576,10 @@ "c": "Setter", "t": "text.xml meta.tag.xml entity.name.tag.localname.xml", "r": { - "dark_plus": "entity.name.tag: #569CD6", - "light_plus": "entity.name.tag: #800000", - "dark_vs": "entity.name.tag: #569CD6", - "light_vs": "entity.name.tag: #800000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "entity.name.tag: #569CD6" } }, @@ -1587,10 +1587,10 @@ "c": " ", "t": "text.xml meta.tag.xml", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1598,10 +1598,10 @@ "c": "Target", "t": "text.xml meta.tag.xml entity.other.attribute-name.localname.xml", "r": { - "dark_plus": "entity.other.attribute-name: #9CDCFE", - "light_plus": "entity.other.attribute-name: #FF0000", - "dark_vs": "entity.other.attribute-name: #9CDCFE", - "light_vs": "entity.other.attribute-name: #FF0000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "entity.other.attribute-name: #9CDCFE" } }, @@ -1609,10 +1609,10 @@ "c": "=", "t": "text.xml meta.tag.xml", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1620,10 +1620,10 @@ "c": "\"", "t": "text.xml meta.tag.xml string.quoted.double.xml punctuation.definition.string.begin.xml", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string.quoted.double.xml: #0000FF", - "dark_vs": "string: #CE9178", - "light_vs": "string.quoted.double.xml: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -1631,10 +1631,10 @@ "c": "inputButton.Margin", "t": "text.xml meta.tag.xml string.quoted.double.xml", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string.quoted.double.xml: #0000FF", - "dark_vs": "string: #CE9178", - "light_vs": "string.quoted.double.xml: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -1642,10 +1642,10 @@ "c": "\"", "t": "text.xml meta.tag.xml string.quoted.double.xml punctuation.definition.string.end.xml", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string.quoted.double.xml: #0000FF", - "dark_vs": "string: #CE9178", - "light_vs": "string.quoted.double.xml: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -1653,10 +1653,10 @@ "c": " ", "t": "text.xml meta.tag.xml", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1664,10 +1664,10 @@ "c": "Value", "t": "text.xml meta.tag.xml entity.other.attribute-name.localname.xml", "r": { - "dark_plus": "entity.other.attribute-name: #9CDCFE", - "light_plus": "entity.other.attribute-name: #FF0000", - "dark_vs": "entity.other.attribute-name: #9CDCFE", - "light_vs": "entity.other.attribute-name: #FF0000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "entity.other.attribute-name: #9CDCFE" } }, @@ -1675,10 +1675,10 @@ "c": "=", "t": "text.xml meta.tag.xml", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1686,10 +1686,10 @@ "c": "\"", "t": "text.xml meta.tag.xml string.quoted.double.xml punctuation.definition.string.begin.xml", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string.quoted.double.xml: #0000FF", - "dark_vs": "string: #CE9178", - "light_vs": "string.quoted.double.xml: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -1697,10 +1697,10 @@ "c": "0,4,0,0", "t": "text.xml meta.tag.xml string.quoted.double.xml", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string.quoted.double.xml: #0000FF", - "dark_vs": "string: #CE9178", - "light_vs": "string.quoted.double.xml: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -1708,10 +1708,10 @@ "c": "\"", "t": "text.xml meta.tag.xml string.quoted.double.xml punctuation.definition.string.end.xml", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string.quoted.double.xml: #0000FF", - "dark_vs": "string: #CE9178", - "light_vs": "string.quoted.double.xml: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -1719,10 +1719,10 @@ "c": "/>", "t": "text.xml meta.tag.xml punctuation.definition.tag.xml", "r": { - "dark_plus": "punctuation.definition.tag: #808080", - "light_plus": "punctuation.definition.tag: #800000", - "dark_vs": "punctuation.definition.tag: #808080", - "light_vs": "punctuation.definition.tag: #800000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "punctuation.definition.tag: #808080" } }, @@ -1730,10 +1730,10 @@ "c": " ", "t": "text.xml", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1741,10 +1741,10 @@ "c": "", "t": "text.xml meta.tag.xml punctuation.definition.tag.xml", "r": { - "dark_plus": "punctuation.definition.tag: #808080", - "light_plus": "punctuation.definition.tag: #800000", - "dark_vs": "punctuation.definition.tag: #808080", - "light_vs": "punctuation.definition.tag: #800000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "punctuation.definition.tag: #808080" } }, @@ -1774,10 +1774,10 @@ "c": "", "t": "text.xml meta.tag.xml punctuation.definition.tag.xml", "r": { - "dark_plus": "punctuation.definition.tag: #808080", - "light_plus": "punctuation.definition.tag: #800000", - "dark_vs": "punctuation.definition.tag: #808080", - "light_vs": "punctuation.definition.tag: #800000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "punctuation.definition.tag: #808080" } } diff --git a/extensions/yaml/package.json b/extensions/yaml/package.json index 9d93689f94..79e2eecc31 100644 --- a/extensions/yaml/package.json +++ b/extensions/yaml/package.json @@ -24,9 +24,6 @@ ".eyml", ".yaml" ], - "filenames": [ - "yarn.lock" - ], "firstLine": "^#cloud-config", "configuration": "./language-configuration.json" } diff --git a/extensions/yaml/syntaxes/yaml.tmLanguage.json b/extensions/yaml/syntaxes/yaml.tmLanguage.json index 6f08b6e72c..447df71390 100644 --- a/extensions/yaml/syntaxes/yaml.tmLanguage.json +++ b/extensions/yaml/syntaxes/yaml.tmLanguage.json @@ -4,7 +4,7 @@ "If you want to provide a fix or improvement, please create a pull request against the original repository.", "Once accepted there, we are happy to receive an update request." ], - "version": "https://github.com/textmate/yaml.tmbundle/commit/efc96efafe5e48480cf55a2ed124b388cbea4440", + "version": "https://github.com/textmate/yaml.tmbundle/commit/e54ceae3b719506dba7e481a77cea4a8b576ae46", "name": "YAML", "scopeName": "source.yaml", "patterns": [ @@ -121,16 +121,16 @@ "begin": "(?:(\\|)|(>))([1-9])?([-+])?(.*\\n?)", "beginCaptures": { "1": { - "name": "punctuation.definition.block.scalar.literal.yaml" + "name": "keyword.control.flow.block-scalar.literal.yaml" }, "2": { - "name": "punctuation.definition.block.scalar.folded.yaml" + "name": "keyword.control.flow.block-scalar.folded.yaml" }, "3": { "name": "constant.numeric.indentation-indicator.yaml" }, "4": { - "name": "support.other.chomping-indicator.yaml" + "name": "storage.modifier.chomping-indicator.yaml" }, "5": { "patterns": [ @@ -154,7 +154,7 @@ ] }, "block-sequence": { - "match": "(-)( |\\t|$)", + "match": "(-)(?!\\S)", "name": "punctuation.definition.block.sequence.item.yaml" }, "comment": { @@ -211,7 +211,7 @@ "name": "support.type.tag-prefix.yaml" } }, - "match": "(?x)\n \\G\n (TAG)\n (?:[ \\t]+\n ((?:!(?:[0-9A-Za-z\\-]*!)?))\n (?:[ \\t]+ (\n ! (?x: %\\p{XDigit}{2} | [0-9A-Za-z\\-#;/?:@&=+$,_.!~*'()\\[\\]] )*\n | (?![,!\\[\\]{}]) (?x: %\\p{XDigit}{2} | [0-9A-Za-z\\-#;/?:@&=+$,_.!~*'()\\[\\]] )+\n )\n )?\n )?\n " + "match": "(?x)\n \\G\n (TAG)\n (?:[ \\t]+\n ((?:!(?:[0-9A-Za-z\\-]*!)?))\n (?:[ \\t]+ (\n ! (?x: %[0-9A-Fa-f]{2} | [0-9A-Za-z\\-#;/?:@&=+$,_.!~*'()\\[\\]] )*\n | (?![,!\\[\\]{}]) (?x: %[0-9A-Fa-f]{2} | [0-9A-Za-z\\-#;/?:@&=+$,_.!~*'()\\[\\]] )+\n )\n )?\n )?\n " }, { "captures": { @@ -598,7 +598,7 @@ "match": "\\G((&))([^\\s\\[\\]/{/},]+)(\\S+)?" }, { - "match": "(?x)\n \\G\n (?:\n ! < (?: %\\p{XDigit}{2} | [0-9A-Za-z\\-#;/?:@&=+$,_.!~*'()\\[\\]] )+ >\n | (?:!(?:[0-9A-Za-z\\-]*!)?) (?: %\\p{XDigit}{2} | [0-9A-Za-z\\-#;/?:@&=+$_.~*'()] )+\n | !\n )\n (?=\\ |\\t|$)\n ", + "match": "(?x)\n \\G\n (?:\n ! < (?: %[0-9A-Fa-f]{2} | [0-9A-Za-z\\-#;/?:@&=+$,_.!~*'()\\[\\]] )+ >\n | (?:!(?:[0-9A-Za-z\\-]*!)?) (?: %[0-9A-Fa-f]{2} | [0-9A-Za-z\\-#;/?:@&=+$_.~*'()] )+\n | !\n )\n (?=\\ |\\t|$)\n ", "name": "storage.type.tag-handle.yaml" }, { diff --git a/extensions/yaml/test/colorize-results/issue-1550_yaml.json b/extensions/yaml/test/colorize-results/issue-1550_yaml.json index 79d6d39cc9..3254772038 100644 --- a/extensions/yaml/test/colorize-results/issue-1550_yaml.json +++ b/extensions/yaml/test/colorize-results/issue-1550_yaml.json @@ -3,10 +3,10 @@ "c": "test1", "t": "source.yaml string.unquoted.plain.out.yaml entity.name.tag.yaml", "r": { - "dark_plus": "entity.name.tag: #569CD6", - "light_plus": "entity.name.tag: #800000", - "dark_vs": "entity.name.tag: #569CD6", - "light_vs": "entity.name.tag: #800000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "entity.name.tag: #569CD6" } }, @@ -14,10 +14,10 @@ "c": " ", "t": "source.yaml", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -25,10 +25,10 @@ "c": ":", "t": "source.yaml punctuation.separator.key-value.mapping.yaml", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -36,10 +36,10 @@ "c": " ", "t": "source.yaml", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -47,10 +47,10 @@ "c": "dsd", "t": "source.yaml string.unquoted.plain.out.yaml", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string.unquoted.plain.out.yaml: #0000FF", - "dark_vs": "string: #CE9178", - "light_vs": "string.unquoted.plain.out.yaml: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -58,10 +58,10 @@ "c": "test2", "t": "source.yaml string.unquoted.plain.out.yaml entity.name.tag.yaml", "r": { - "dark_plus": "entity.name.tag: #569CD6", - "light_plus": "entity.name.tag: #800000", - "dark_vs": "entity.name.tag: #569CD6", - "light_vs": "entity.name.tag: #800000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "entity.name.tag: #569CD6" } }, @@ -69,10 +69,10 @@ "c": " ", "t": "source.yaml", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -80,10 +80,10 @@ "c": ":", "t": "source.yaml punctuation.separator.key-value.mapping.yaml", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -91,10 +91,10 @@ "c": " ", "t": "source.yaml", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -102,10 +102,10 @@ "c": "abc-def", "t": "source.yaml string.unquoted.plain.out.yaml", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string.unquoted.plain.out.yaml: #0000FF", - "dark_vs": "string: #CE9178", - "light_vs": "string.unquoted.plain.out.yaml: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -113,10 +113,10 @@ "c": "test-3", "t": "source.yaml string.unquoted.plain.out.yaml entity.name.tag.yaml", "r": { - "dark_plus": "entity.name.tag: #569CD6", - "light_plus": "entity.name.tag: #800000", - "dark_vs": "entity.name.tag: #569CD6", - "light_vs": "entity.name.tag: #800000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "entity.name.tag: #569CD6" } }, @@ -124,10 +124,10 @@ "c": " ", "t": "source.yaml", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -135,10 +135,10 @@ "c": ":", "t": "source.yaml punctuation.separator.key-value.mapping.yaml", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -146,10 +146,10 @@ "c": " ", "t": "source.yaml", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -157,10 +157,10 @@ "c": "abcdef", "t": "source.yaml string.unquoted.plain.out.yaml", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string.unquoted.plain.out.yaml: #0000FF", - "dark_vs": "string: #CE9178", - "light_vs": "string.unquoted.plain.out.yaml: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -168,10 +168,10 @@ "c": "test-4", "t": "source.yaml string.unquoted.plain.out.yaml entity.name.tag.yaml", "r": { - "dark_plus": "entity.name.tag: #569CD6", - "light_plus": "entity.name.tag: #800000", - "dark_vs": "entity.name.tag: #569CD6", - "light_vs": "entity.name.tag: #800000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "entity.name.tag: #569CD6" } }, @@ -179,10 +179,10 @@ "c": " ", "t": "source.yaml", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -190,10 +190,10 @@ "c": ":", "t": "source.yaml punctuation.separator.key-value.mapping.yaml", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -201,10 +201,10 @@ "c": " ", "t": "source.yaml", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -212,10 +212,10 @@ "c": "abc-def", "t": "source.yaml string.unquoted.plain.out.yaml", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string.unquoted.plain.out.yaml: #0000FF", - "dark_vs": "string: #CE9178", - "light_vs": "string.unquoted.plain.out.yaml: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } } diff --git a/extensions/yaml/test/colorize-results/issue-4008_yaml.json b/extensions/yaml/test/colorize-results/issue-4008_yaml.json index 4039077206..6e13bae7c3 100644 --- a/extensions/yaml/test/colorize-results/issue-4008_yaml.json +++ b/extensions/yaml/test/colorize-results/issue-4008_yaml.json @@ -1,34 +1,12 @@ [ { - "c": "- ", + "c": "-", "t": "source.yaml punctuation.definition.block.sequence.item.yaml", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" - } - }, - { - "c": "blue", - "t": "source.yaml string.unquoted.plain.out.yaml entity.name.tag.yaml", - "r": { - "dark_plus": "entity.name.tag: #569CD6", - "light_plus": "entity.name.tag: #800000", - "dark_vs": "entity.name.tag: #569CD6", - "light_vs": "entity.name.tag: #800000", - "hc_black": "entity.name.tag: #569CD6" - } - }, - { - "c": ":", - "t": "source.yaml punctuation.separator.key-value.mapping.yaml", - "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -36,10 +14,43 @@ "c": " ", "t": "source.yaml", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "blue", + "t": "source.yaml string.unquoted.plain.out.yaml entity.name.tag.yaml", + "r": { + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "entity.name.tag: #569CD6" + } + }, + { + "c": ":", + "t": "source.yaml punctuation.separator.key-value.mapping.yaml", + "r": { + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "default: #FFFFFF" + } + }, + { + "c": " ", + "t": "source.yaml", + "r": { + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -47,43 +58,21 @@ "c": "a=\"brown,not_brown\"", "t": "source.yaml string.unquoted.plain.out.yaml", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string.unquoted.plain.out.yaml: #0000FF", - "dark_vs": "string: #CE9178", - "light_vs": "string.unquoted.plain.out.yaml: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, { - "c": "- ", + "c": "-", "t": "source.yaml punctuation.definition.block.sequence.item.yaml", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" - } - }, - { - "c": "not_blue", - "t": "source.yaml string.unquoted.plain.out.yaml entity.name.tag.yaml", - "r": { - "dark_plus": "entity.name.tag: #569CD6", - "light_plus": "entity.name.tag: #800000", - "dark_vs": "entity.name.tag: #569CD6", - "light_vs": "entity.name.tag: #800000", - "hc_black": "entity.name.tag: #569CD6" - } - }, - { - "c": ":", - "t": "source.yaml punctuation.separator.key-value.mapping.yaml", - "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -91,10 +80,43 @@ "c": " ", "t": "source.yaml", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "not_blue", + "t": "source.yaml string.unquoted.plain.out.yaml entity.name.tag.yaml", + "r": { + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "entity.name.tag: #569CD6" + } + }, + { + "c": ":", + "t": "source.yaml punctuation.separator.key-value.mapping.yaml", + "r": { + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "default: #FFFFFF" + } + }, + { + "c": " ", + "t": "source.yaml", + "r": { + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -102,21 +124,32 @@ "c": "foo", "t": "source.yaml string.unquoted.plain.out.yaml", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string.unquoted.plain.out.yaml: #0000FF", - "dark_vs": "string: #CE9178", - "light_vs": "string.unquoted.plain.out.yaml: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, { - "c": "- ", + "c": "-", "t": "source.yaml punctuation.definition.block.sequence.item.yaml", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "default: #FFFFFF" + } + }, + { + "c": " ", + "t": "source.yaml", + "r": { + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -124,10 +157,10 @@ "c": "blue", "t": "source.yaml string.unquoted.plain.out.yaml entity.name.tag.yaml", "r": { - "dark_plus": "entity.name.tag: #569CD6", - "light_plus": "entity.name.tag: #800000", - "dark_vs": "entity.name.tag: #569CD6", - "light_vs": "entity.name.tag: #800000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "entity.name.tag: #569CD6" } }, @@ -135,10 +168,10 @@ "c": ":", "t": "source.yaml punctuation.separator.key-value.mapping.yaml", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -146,10 +179,10 @@ "c": " ", "t": "source.yaml", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -157,43 +190,21 @@ "c": "foo=\"}\"", "t": "source.yaml string.unquoted.plain.out.yaml", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string.unquoted.plain.out.yaml: #0000FF", - "dark_vs": "string: #CE9178", - "light_vs": "string.unquoted.plain.out.yaml: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, { - "c": "- ", + "c": "-", "t": "source.yaml punctuation.definition.block.sequence.item.yaml", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" - } - }, - { - "c": "not_blue", - "t": "source.yaml string.unquoted.plain.out.yaml entity.name.tag.yaml", - "r": { - "dark_plus": "entity.name.tag: #569CD6", - "light_plus": "entity.name.tag: #800000", - "dark_vs": "entity.name.tag: #569CD6", - "light_vs": "entity.name.tag: #800000", - "hc_black": "entity.name.tag: #569CD6" - } - }, - { - "c": ":", - "t": "source.yaml punctuation.separator.key-value.mapping.yaml", - "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -201,10 +212,43 @@ "c": " ", "t": "source.yaml", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "not_blue", + "t": "source.yaml string.unquoted.plain.out.yaml entity.name.tag.yaml", + "r": { + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "entity.name.tag: #569CD6" + } + }, + { + "c": ":", + "t": "source.yaml punctuation.separator.key-value.mapping.yaml", + "r": { + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "default: #FFFFFF" + } + }, + { + "c": " ", + "t": "source.yaml", + "r": { + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -212,10 +256,10 @@ "c": "1", "t": "source.yaml constant.numeric.integer.yaml", "r": { - "dark_plus": "constant.numeric: #B5CEA8", - "light_plus": "constant.numeric: #09885A", - "dark_vs": "constant.numeric: #B5CEA8", - "light_vs": "constant.numeric: #09885A", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "constant.numeric: #B5CEA8" } } diff --git a/extensions/yaml/test/colorize-results/issue-6303_yaml.json b/extensions/yaml/test/colorize-results/issue-6303_yaml.json index edd710c06e..c9857edb64 100644 --- a/extensions/yaml/test/colorize-results/issue-6303_yaml.json +++ b/extensions/yaml/test/colorize-results/issue-6303_yaml.json @@ -3,10 +3,10 @@ "c": "swagger", "t": "source.yaml string.unquoted.plain.out.yaml entity.name.tag.yaml", "r": { - "dark_plus": "entity.name.tag: #569CD6", - "light_plus": "entity.name.tag: #800000", - "dark_vs": "entity.name.tag: #569CD6", - "light_vs": "entity.name.tag: #800000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "entity.name.tag: #569CD6" } }, @@ -14,10 +14,10 @@ "c": ":", "t": "source.yaml punctuation.separator.key-value.mapping.yaml", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -25,10 +25,10 @@ "c": " ", "t": "source.yaml", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -36,10 +36,10 @@ "c": "'", "t": "source.yaml string.quoted.single.yaml punctuation.definition.string.begin.yaml", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string.quoted.single.yaml: #0000FF", - "dark_vs": "string: #CE9178", - "light_vs": "string.quoted.single.yaml: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -47,10 +47,10 @@ "c": "2.0", "t": "source.yaml string.quoted.single.yaml", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string.quoted.single.yaml: #0000FF", - "dark_vs": "string: #CE9178", - "light_vs": "string.quoted.single.yaml: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -58,10 +58,10 @@ "c": "'", "t": "source.yaml string.quoted.single.yaml punctuation.definition.string.end.yaml", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string.quoted.single.yaml: #0000FF", - "dark_vs": "string: #CE9178", - "light_vs": "string.quoted.single.yaml: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -69,10 +69,10 @@ "c": "info", "t": "source.yaml string.unquoted.plain.out.yaml entity.name.tag.yaml", "r": { - "dark_plus": "entity.name.tag: #569CD6", - "light_plus": "entity.name.tag: #800000", - "dark_vs": "entity.name.tag: #569CD6", - "light_vs": "entity.name.tag: #800000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "entity.name.tag: #569CD6" } }, @@ -80,10 +80,10 @@ "c": ":", "t": "source.yaml punctuation.separator.key-value.mapping.yaml", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -91,10 +91,10 @@ "c": " ", "t": "source.yaml", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -102,10 +102,10 @@ "c": "description", "t": "source.yaml string.unquoted.plain.out.yaml entity.name.tag.yaml", "r": { - "dark_plus": "entity.name.tag: #569CD6", - "light_plus": "entity.name.tag: #800000", - "dark_vs": "entity.name.tag: #569CD6", - "light_vs": "entity.name.tag: #800000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "entity.name.tag: #569CD6" } }, @@ -113,10 +113,10 @@ "c": ":", "t": "source.yaml punctuation.separator.key-value.mapping.yaml", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -124,10 +124,10 @@ "c": " ", "t": "source.yaml", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -135,10 +135,10 @@ "c": "'", "t": "source.yaml string.quoted.single.yaml punctuation.definition.string.begin.yaml", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string.quoted.single.yaml: #0000FF", - "dark_vs": "string: #CE9178", - "light_vs": "string.quoted.single.yaml: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -146,10 +146,10 @@ "c": "The API Management Service API defines an updated and refined version", "t": "source.yaml string.quoted.single.yaml", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string.quoted.single.yaml: #0000FF", - "dark_vs": "string: #CE9178", - "light_vs": "string.quoted.single.yaml: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -157,10 +157,10 @@ "c": " of the concepts currently known as Developer, APP, and API Product in Edge. Of", "t": "source.yaml string.quoted.single.yaml", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string.quoted.single.yaml: #0000FF", - "dark_vs": "string: #CE9178", - "light_vs": "string.quoted.single.yaml: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -168,10 +168,10 @@ "c": " note is the introduction of the API concept, missing previously from Edge", "t": "source.yaml string.quoted.single.yaml", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string.quoted.single.yaml: #0000FF", - "dark_vs": "string: #CE9178", - "light_vs": "string.quoted.single.yaml: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -179,10 +179,10 @@ "c": " ", "t": "source.yaml string.quoted.single.yaml", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string.quoted.single.yaml: #0000FF", - "dark_vs": "string: #CE9178", - "light_vs": "string.quoted.single.yaml: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -190,10 +190,10 @@ "c": "'", "t": "source.yaml string.quoted.single.yaml punctuation.definition.string.end.yaml", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string.quoted.single.yaml: #0000FF", - "dark_vs": "string: #CE9178", - "light_vs": "string.quoted.single.yaml: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -201,10 +201,10 @@ "c": " ", "t": "source.yaml", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -212,10 +212,10 @@ "c": "title", "t": "source.yaml string.unquoted.plain.out.yaml entity.name.tag.yaml", "r": { - "dark_plus": "entity.name.tag: #569CD6", - "light_plus": "entity.name.tag: #800000", - "dark_vs": "entity.name.tag: #569CD6", - "light_vs": "entity.name.tag: #800000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "entity.name.tag: #569CD6" } }, @@ -223,10 +223,10 @@ "c": ":", "t": "source.yaml punctuation.separator.key-value.mapping.yaml", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -234,10 +234,10 @@ "c": " ", "t": "source.yaml", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -245,10 +245,10 @@ "c": "API Management Service API", "t": "source.yaml string.unquoted.plain.out.yaml", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string.unquoted.plain.out.yaml: #0000FF", - "dark_vs": "string: #CE9178", - "light_vs": "string.unquoted.plain.out.yaml: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -256,10 +256,10 @@ "c": " ", "t": "source.yaml", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -267,10 +267,10 @@ "c": "version", "t": "source.yaml string.unquoted.plain.out.yaml entity.name.tag.yaml", "r": { - "dark_plus": "entity.name.tag: #569CD6", - "light_plus": "entity.name.tag: #800000", - "dark_vs": "entity.name.tag: #569CD6", - "light_vs": "entity.name.tag: #800000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "entity.name.tag: #569CD6" } }, @@ -278,10 +278,10 @@ "c": ":", "t": "source.yaml punctuation.separator.key-value.mapping.yaml", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -289,10 +289,10 @@ "c": " ", "t": "source.yaml", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -300,10 +300,10 @@ "c": "initial", "t": "source.yaml string.unquoted.plain.out.yaml", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string.unquoted.plain.out.yaml: #0000FF", - "dark_vs": "string: #CE9178", - "light_vs": "string.unquoted.plain.out.yaml: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } } diff --git a/extensions/yaml/test/colorize-results/test_yaml.json b/extensions/yaml/test/colorize-results/test_yaml.json index e4e35ba7ee..1527b5b840 100644 --- a/extensions/yaml/test/colorize-results/test_yaml.json +++ b/extensions/yaml/test/colorize-results/test_yaml.json @@ -3,10 +3,10 @@ "c": "#", "t": "source.yaml comment.line.number-sign.yaml punctuation.definition.comment.yaml", "r": { - "dark_plus": "comment: #608B4E", - "light_plus": "comment: #008000", - "dark_vs": "comment: #608B4E", - "light_vs": "comment: #008000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "comment: #7CA668" } }, @@ -14,10 +14,10 @@ "c": " sequencer protocols for Laser eye surgery", "t": "source.yaml comment.line.number-sign.yaml", "r": { - "dark_plus": "comment: #608B4E", - "light_plus": "comment: #008000", - "dark_vs": "comment: #608B4E", - "light_vs": "comment: #008000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "comment: #7CA668" } }, @@ -25,21 +25,32 @@ "c": "---", "t": "source.yaml entity.other.document.begin.yaml", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, { - "c": "- ", + "c": "-", "t": "source.yaml punctuation.definition.block.sequence.item.yaml", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "default: #FFFFFF" + } + }, + { + "c": " ", + "t": "source.yaml", + "r": { + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -47,10 +58,10 @@ "c": "step", "t": "source.yaml string.unquoted.plain.out.yaml entity.name.tag.yaml", "r": { - "dark_plus": "entity.name.tag: #569CD6", - "light_plus": "entity.name.tag: #800000", - "dark_vs": "entity.name.tag: #569CD6", - "light_vs": "entity.name.tag: #800000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "entity.name.tag: #569CD6" } }, @@ -58,10 +69,10 @@ "c": ":", "t": "source.yaml punctuation.separator.key-value.mapping.yaml", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -69,10 +80,10 @@ "c": " ", "t": "source.yaml", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -80,10 +91,10 @@ "c": "&", "t": "source.yaml meta.property.yaml keyword.control.property.anchor.yaml punctuation.definition.anchor.yaml", "r": { - "dark_plus": "keyword.control: #C586C0", - "light_plus": "keyword.control: #AF00DB", - "dark_vs": "keyword.control: #569CD6", - "light_vs": "keyword.control: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword.control: #C586C0" } }, @@ -91,10 +102,10 @@ "c": "id001", "t": "source.yaml meta.property.yaml entity.name.type.anchor.yaml", "r": { - "dark_plus": "entity.name.type: #4EC9B0", - "light_plus": "entity.name.type: #267F99", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "entity.name.type: #4EC9B0" } }, @@ -102,10 +113,10 @@ "c": " ", "t": "source.yaml", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -113,10 +124,10 @@ "c": "#", "t": "source.yaml comment.line.number-sign.yaml punctuation.definition.comment.yaml", "r": { - "dark_plus": "comment: #608B4E", - "light_plus": "comment: #008000", - "dark_vs": "comment: #608B4E", - "light_vs": "comment: #008000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "comment: #7CA668" } }, @@ -124,10 +135,10 @@ "c": " defines anchor label &id001", "t": "source.yaml comment.line.number-sign.yaml", "r": { - "dark_plus": "comment: #608B4E", - "light_plus": "comment: #008000", - "dark_vs": "comment: #608B4E", - "light_vs": "comment: #008000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "comment: #7CA668" } }, @@ -135,10 +146,10 @@ "c": " ", "t": "source.yaml", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -146,10 +157,10 @@ "c": "instrument", "t": "source.yaml string.unquoted.plain.out.yaml entity.name.tag.yaml", "r": { - "dark_plus": "entity.name.tag: #569CD6", - "light_plus": "entity.name.tag: #800000", - "dark_vs": "entity.name.tag: #569CD6", - "light_vs": "entity.name.tag: #800000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "entity.name.tag: #569CD6" } }, @@ -157,10 +168,10 @@ "c": ":", "t": "source.yaml punctuation.separator.key-value.mapping.yaml", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -168,10 +179,10 @@ "c": " ", "t": "source.yaml", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -179,10 +190,10 @@ "c": "Lasik 2000", "t": "source.yaml string.unquoted.plain.out.yaml", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string.unquoted.plain.out.yaml: #0000FF", - "dark_vs": "string: #CE9178", - "light_vs": "string.unquoted.plain.out.yaml: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -190,10 +201,10 @@ "c": " ", "t": "source.yaml", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -201,10 +212,10 @@ "c": "pulseEnergy", "t": "source.yaml string.unquoted.plain.out.yaml entity.name.tag.yaml", "r": { - "dark_plus": "entity.name.tag: #569CD6", - "light_plus": "entity.name.tag: #800000", - "dark_vs": "entity.name.tag: #569CD6", - "light_vs": "entity.name.tag: #800000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "entity.name.tag: #569CD6" } }, @@ -212,10 +223,10 @@ "c": ":", "t": "source.yaml punctuation.separator.key-value.mapping.yaml", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -223,10 +234,10 @@ "c": " ", "t": "source.yaml", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -234,10 +245,10 @@ "c": "5.4", "t": "source.yaml constant.numeric.float.yaml", "r": { - "dark_plus": "constant.numeric: #B5CEA8", - "light_plus": "constant.numeric: #09885A", - "dark_vs": "constant.numeric: #B5CEA8", - "light_vs": "constant.numeric: #09885A", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "constant.numeric: #B5CEA8" } }, @@ -245,10 +256,10 @@ "c": " ", "t": "source.yaml", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -256,10 +267,10 @@ "c": "spotSize", "t": "source.yaml string.unquoted.plain.out.yaml entity.name.tag.yaml", "r": { - "dark_plus": "entity.name.tag: #569CD6", - "light_plus": "entity.name.tag: #800000", - "dark_vs": "entity.name.tag: #569CD6", - "light_vs": "entity.name.tag: #800000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "entity.name.tag: #569CD6" } }, @@ -267,10 +278,10 @@ "c": ":", "t": "source.yaml punctuation.separator.key-value.mapping.yaml", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -278,10 +289,10 @@ "c": " ", "t": "source.yaml", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -289,43 +300,21 @@ "c": "1mm", "t": "source.yaml string.unquoted.plain.out.yaml", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string.unquoted.plain.out.yaml: #0000FF", - "dark_vs": "string: #CE9178", - "light_vs": "string.unquoted.plain.out.yaml: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, { - "c": "- ", + "c": "-", "t": "source.yaml punctuation.definition.block.sequence.item.yaml", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" - } - }, - { - "c": "step", - "t": "source.yaml string.unquoted.plain.out.yaml entity.name.tag.yaml", - "r": { - "dark_plus": "entity.name.tag: #569CD6", - "light_plus": "entity.name.tag: #800000", - "dark_vs": "entity.name.tag: #569CD6", - "light_vs": "entity.name.tag: #800000", - "hc_black": "entity.name.tag: #569CD6" - } - }, - { - "c": ":", - "t": "source.yaml punctuation.separator.key-value.mapping.yaml", - "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -333,10 +322,43 @@ "c": " ", "t": "source.yaml", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "step", + "t": "source.yaml string.unquoted.plain.out.yaml entity.name.tag.yaml", + "r": { + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "entity.name.tag: #569CD6" + } + }, + { + "c": ":", + "t": "source.yaml punctuation.separator.key-value.mapping.yaml", + "r": { + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "default: #FFFFFF" + } + }, + { + "c": " ", + "t": "source.yaml", + "r": { + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -344,10 +366,10 @@ "c": "*", "t": "source.yaml keyword.control.flow.alias.yaml punctuation.definition.alias.yaml", "r": { - "dark_plus": "keyword.control: #C586C0", - "light_plus": "keyword.control: #AF00DB", - "dark_vs": "keyword.control: #569CD6", - "light_vs": "keyword.control: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword.control: #C586C0" } }, @@ -355,10 +377,10 @@ "c": "id001", "t": "source.yaml variable.other.alias.yaml", "r": { - "dark_plus": "variable: #9CDCFE", - "light_plus": "variable: #001080", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "variable: #9CDCFE" } }, @@ -366,10 +388,10 @@ "c": " ", "t": "source.yaml", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -377,10 +399,10 @@ "c": "#", "t": "source.yaml comment.line.number-sign.yaml punctuation.definition.comment.yaml", "r": { - "dark_plus": "comment: #608B4E", - "light_plus": "comment: #008000", - "dark_vs": "comment: #608B4E", - "light_vs": "comment: #008000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "comment: #7CA668" } }, @@ -388,43 +410,21 @@ "c": " refers to the first step (with anchor &id001)", "t": "source.yaml comment.line.number-sign.yaml", "r": { - "dark_plus": "comment: #608B4E", - "light_plus": "comment: #008000", - "dark_vs": "comment: #608B4E", - "light_vs": "comment: #008000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "comment: #7CA668" } }, { - "c": "- ", + "c": "-", "t": "source.yaml punctuation.definition.block.sequence.item.yaml", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" - } - }, - { - "c": "step", - "t": "source.yaml string.unquoted.plain.out.yaml entity.name.tag.yaml", - "r": { - "dark_plus": "entity.name.tag: #569CD6", - "light_plus": "entity.name.tag: #800000", - "dark_vs": "entity.name.tag: #569CD6", - "light_vs": "entity.name.tag: #800000", - "hc_black": "entity.name.tag: #569CD6" - } - }, - { - "c": ":", - "t": "source.yaml punctuation.separator.key-value.mapping.yaml", - "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -432,10 +432,43 @@ "c": " ", "t": "source.yaml", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "step", + "t": "source.yaml string.unquoted.plain.out.yaml entity.name.tag.yaml", + "r": { + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "entity.name.tag: #569CD6" + } + }, + { + "c": ":", + "t": "source.yaml punctuation.separator.key-value.mapping.yaml", + "r": { + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "default: #FFFFFF" + } + }, + { + "c": " ", + "t": "source.yaml", + "r": { + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -443,10 +476,10 @@ "c": "*", "t": "source.yaml keyword.control.flow.alias.yaml punctuation.definition.alias.yaml", "r": { - "dark_plus": "keyword.control: #C586C0", - "light_plus": "keyword.control: #AF00DB", - "dark_vs": "keyword.control: #569CD6", - "light_vs": "keyword.control: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword.control: #C586C0" } }, @@ -454,10 +487,10 @@ "c": "id001", "t": "source.yaml variable.other.alias.yaml", "r": { - "dark_plus": "variable: #9CDCFE", - "light_plus": "variable: #001080", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "variable: #9CDCFE" } }, @@ -465,10 +498,10 @@ "c": " ", "t": "source.yaml", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -476,10 +509,10 @@ "c": "spotSize", "t": "source.yaml string.unquoted.plain.out.yaml entity.name.tag.yaml", "r": { - "dark_plus": "entity.name.tag: #569CD6", - "light_plus": "entity.name.tag: #800000", - "dark_vs": "entity.name.tag: #569CD6", - "light_vs": "entity.name.tag: #800000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "entity.name.tag: #569CD6" } }, @@ -487,10 +520,10 @@ "c": ":", "t": "source.yaml punctuation.separator.key-value.mapping.yaml", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -498,10 +531,10 @@ "c": " ", "t": "source.yaml", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -509,10 +542,10 @@ "c": "2mm", "t": "source.yaml string.unquoted.plain.out.yaml", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string.unquoted.plain.out.yaml: #0000FF", - "dark_vs": "string: #CE9178", - "light_vs": "string.unquoted.plain.out.yaml: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -520,21 +553,32 @@ "c": " ", "t": "source.yaml", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, { - "c": "- ", + "c": "-", "t": "source.yaml punctuation.definition.block.sequence.item.yaml", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "default: #FFFFFF" + } + }, + { + "c": " ", + "t": "source.yaml", + "r": { + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -542,10 +586,10 @@ "c": "step", "t": "source.yaml string.unquoted.plain.out.yaml entity.name.tag.yaml", "r": { - "dark_plus": "entity.name.tag: #569CD6", - "light_plus": "entity.name.tag: #800000", - "dark_vs": "entity.name.tag: #569CD6", - "light_vs": "entity.name.tag: #800000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "entity.name.tag: #569CD6" } }, @@ -553,10 +597,10 @@ "c": ":", "t": "source.yaml punctuation.separator.key-value.mapping.yaml", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -564,10 +608,10 @@ "c": " ", "t": "source.yaml", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -575,10 +619,10 @@ "c": "*", "t": "source.yaml keyword.control.flow.alias.yaml punctuation.definition.alias.yaml", "r": { - "dark_plus": "keyword.control: #C586C0", - "light_plus": "keyword.control: #AF00DB", - "dark_vs": "keyword.control: #569CD6", - "light_vs": "keyword.control: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "keyword.control: #C586C0" } }, @@ -586,21 +630,32 @@ "c": "id002", "t": "source.yaml variable.other.alias.yaml", "r": { - "dark_plus": "variable: #9CDCFE", - "light_plus": "variable: #001080", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "variable: #9CDCFE" } }, { - "c": "- ", + "c": "-", "t": "source.yaml punctuation.definition.block.sequence.item.yaml", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "default: #FFFFFF" + } + }, + { + "c": " ", + "t": "source.yaml", + "r": { + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -608,10 +663,10 @@ "c": "{", "t": "source.yaml meta.flow-mapping.yaml punctuation.definition.mapping.begin.yaml", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -619,10 +674,10 @@ "c": "name", "t": "source.yaml meta.flow-mapping.yaml meta.flow-pair.key.yaml string.unquoted.plain.in.yaml entity.name.tag.yaml", "r": { - "dark_plus": "entity.name.tag: #569CD6", - "light_plus": "entity.name.tag: #800000", - "dark_vs": "entity.name.tag: #569CD6", - "light_vs": "entity.name.tag: #800000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "entity.name.tag: #569CD6" } }, @@ -630,10 +685,10 @@ "c": ":", "t": "source.yaml meta.flow-mapping.yaml meta.flow-pair.yaml punctuation.separator.key-value.mapping.yaml", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -641,10 +696,10 @@ "c": " ", "t": "source.yaml meta.flow-mapping.yaml meta.flow-pair.yaml meta.flow-pair.value.yaml", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -652,10 +707,10 @@ "c": "John Smith", "t": "source.yaml meta.flow-mapping.yaml meta.flow-pair.yaml meta.flow-pair.value.yaml string.unquoted.plain.in.yaml", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string.unquoted.plain.in.yaml: #0000FF", - "dark_vs": "string: #CE9178", - "light_vs": "string.unquoted.plain.in.yaml: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -663,10 +718,10 @@ "c": ",", "t": "source.yaml meta.flow-mapping.yaml punctuation.separator.mapping.yaml", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -674,10 +729,10 @@ "c": " ", "t": "source.yaml meta.flow-mapping.yaml", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -685,10 +740,10 @@ "c": "age", "t": "source.yaml meta.flow-mapping.yaml meta.flow-pair.key.yaml string.unquoted.plain.in.yaml entity.name.tag.yaml", "r": { - "dark_plus": "entity.name.tag: #569CD6", - "light_plus": "entity.name.tag: #800000", - "dark_vs": "entity.name.tag: #569CD6", - "light_vs": "entity.name.tag: #800000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "entity.name.tag: #569CD6" } }, @@ -696,10 +751,10 @@ "c": ":", "t": "source.yaml meta.flow-mapping.yaml meta.flow-pair.yaml punctuation.separator.key-value.mapping.yaml", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -707,10 +762,10 @@ "c": " ", "t": "source.yaml meta.flow-mapping.yaml meta.flow-pair.yaml meta.flow-pair.value.yaml", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -718,10 +773,10 @@ "c": "33", "t": "source.yaml meta.flow-mapping.yaml meta.flow-pair.yaml meta.flow-pair.value.yaml constant.numeric.integer.yaml", "r": { - "dark_plus": "constant.numeric: #B5CEA8", - "light_plus": "constant.numeric: #09885A", - "dark_vs": "constant.numeric: #B5CEA8", - "light_vs": "constant.numeric: #09885A", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "constant.numeric: #B5CEA8" } }, @@ -729,21 +784,32 @@ "c": "}", "t": "source.yaml meta.flow-mapping.yaml punctuation.definition.mapping.end.yaml", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, { - "c": "- ", + "c": "-", "t": "source.yaml punctuation.definition.block.sequence.item.yaml", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "default: #FFFFFF" + } + }, + { + "c": " ", + "t": "source.yaml", + "r": { + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -751,10 +817,10 @@ "c": "name", "t": "source.yaml string.unquoted.plain.out.yaml entity.name.tag.yaml", "r": { - "dark_plus": "entity.name.tag: #569CD6", - "light_plus": "entity.name.tag: #800000", - "dark_vs": "entity.name.tag: #569CD6", - "light_vs": "entity.name.tag: #800000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "entity.name.tag: #569CD6" } }, @@ -762,10 +828,10 @@ "c": ":", "t": "source.yaml punctuation.separator.key-value.mapping.yaml", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -773,10 +839,10 @@ "c": " ", "t": "source.yaml", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -784,10 +850,10 @@ "c": "Mary Smith", "t": "source.yaml string.unquoted.plain.out.yaml", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string.unquoted.plain.out.yaml: #0000FF", - "dark_vs": "string: #CE9178", - "light_vs": "string.unquoted.plain.out.yaml: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -795,10 +861,10 @@ "c": " ", "t": "source.yaml", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -806,10 +872,10 @@ "c": "age", "t": "source.yaml string.unquoted.plain.out.yaml entity.name.tag.yaml", "r": { - "dark_plus": "entity.name.tag: #569CD6", - "light_plus": "entity.name.tag: #800000", - "dark_vs": "entity.name.tag: #569CD6", - "light_vs": "entity.name.tag: #800000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "entity.name.tag: #569CD6" } }, @@ -817,10 +883,10 @@ "c": ":", "t": "source.yaml punctuation.separator.key-value.mapping.yaml", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -828,10 +894,10 @@ "c": " ", "t": "source.yaml", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -839,10 +905,10 @@ "c": "27", "t": "source.yaml constant.numeric.integer.yaml", "r": { - "dark_plus": "constant.numeric: #B5CEA8", - "light_plus": "constant.numeric: #09885A", - "dark_vs": "constant.numeric: #B5CEA8", - "light_vs": "constant.numeric: #09885A", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "constant.numeric: #B5CEA8" } }, @@ -850,10 +916,10 @@ "c": " ", "t": "source.yaml", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -861,10 +927,10 @@ "c": "men", "t": "source.yaml string.unquoted.plain.out.yaml entity.name.tag.yaml", "r": { - "dark_plus": "entity.name.tag: #569CD6", - "light_plus": "entity.name.tag: #800000", - "dark_vs": "entity.name.tag: #569CD6", - "light_vs": "entity.name.tag: #800000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "entity.name.tag: #569CD6" } }, @@ -872,10 +938,10 @@ "c": ":", "t": "source.yaml punctuation.separator.key-value.mapping.yaml", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -883,10 +949,10 @@ "c": " ", "t": "source.yaml", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -894,10 +960,10 @@ "c": "[", "t": "source.yaml meta.flow-sequence.yaml punctuation.definition.sequence.begin.yaml", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -905,10 +971,10 @@ "c": "John Smith", "t": "source.yaml meta.flow-sequence.yaml string.unquoted.plain.in.yaml", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string.unquoted.plain.in.yaml: #0000FF", - "dark_vs": "string: #CE9178", - "light_vs": "string.unquoted.plain.in.yaml: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -916,10 +982,10 @@ "c": ",", "t": "source.yaml meta.flow-sequence.yaml punctuation.separator.sequence.yaml", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -927,10 +993,10 @@ "c": " ", "t": "source.yaml meta.flow-sequence.yaml", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -938,10 +1004,10 @@ "c": "Bill Jones", "t": "source.yaml meta.flow-sequence.yaml string.unquoted.plain.in.yaml", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string.unquoted.plain.in.yaml: #0000FF", - "dark_vs": "string: #CE9178", - "light_vs": "string.unquoted.plain.in.yaml: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -949,10 +1015,10 @@ "c": "]", "t": "source.yaml meta.flow-sequence.yaml punctuation.definition.sequence.end.yaml", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -960,10 +1026,10 @@ "c": "women", "t": "source.yaml string.unquoted.plain.out.yaml entity.name.tag.yaml", "r": { - "dark_plus": "entity.name.tag: #569CD6", - "light_plus": "entity.name.tag: #800000", - "dark_vs": "entity.name.tag: #569CD6", - "light_vs": "entity.name.tag: #800000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "entity.name.tag: #569CD6" } }, @@ -971,10 +1037,10 @@ "c": ":", "t": "source.yaml punctuation.separator.key-value.mapping.yaml", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -982,21 +1048,32 @@ "c": " ", "t": "source.yaml", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, { - "c": "- ", + "c": "-", "t": "source.yaml punctuation.definition.block.sequence.item.yaml", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "default: #FFFFFF" + } + }, + { + "c": " ", + "t": "source.yaml", + "r": { + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1004,10 +1081,10 @@ "c": "Mary Smith", "t": "source.yaml string.unquoted.plain.out.yaml", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string.unquoted.plain.out.yaml: #0000FF", - "dark_vs": "string: #CE9178", - "light_vs": "string.unquoted.plain.out.yaml: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } }, @@ -1015,21 +1092,32 @@ "c": " ", "t": "source.yaml", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, { - "c": "- ", + "c": "-", "t": "source.yaml punctuation.definition.block.sequence.item.yaml", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, + "hc_black": "default: #FFFFFF" + } + }, + { + "c": " ", + "t": "source.yaml", + "r": { + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "default: #FFFFFF" } }, @@ -1037,10 +1125,10 @@ "c": "Susan Williams", "t": "source.yaml string.unquoted.plain.out.yaml", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string.unquoted.plain.out.yaml: #0000FF", - "dark_vs": "string: #CE9178", - "light_vs": "string.unquoted.plain.out.yaml: #0000FF", + "dark_plus": null, + "light_plus": null, + "dark_vs": null, + "light_vs": null, "hc_black": "string: #CE9178" } } diff --git a/extensions/yarn.lock b/extensions/yarn.lock index 504d8abd96..67d803d4e5 100644 --- a/extensions/yarn.lock +++ b/extensions/yarn.lock @@ -2,6 +2,6 @@ # yarn lockfile v1 -typescript@2.8.3: - version "2.8.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.8.3.tgz#5d817f9b6f31bb871835f4edf0089f21abe6c170" +typescript@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.0.1.tgz#43738f29585d3a87575520a4b93ab6026ef11fdb" diff --git a/gulpfile.js b/gulpfile.js index cb5f1be6d6..6a29aa834a 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -15,12 +15,12 @@ const compilation = require('./build/lib/compilation'); // Fast compile for development time gulp.task('clean-client', util.rimraf('out')); -gulp.task('compile-client', ['clean-client'], compilation.compileTask('out', false)); +gulp.task('compile-client', ['clean-client'], compilation.compileTask('src', 'out', false)); gulp.task('watch-client', ['clean-client'], compilation.watchTask('out', false)); // Full compile, including nls and inline sources in sourcemaps, for build gulp.task('clean-client-build', util.rimraf('out-build')); -gulp.task('compile-client-build', ['clean-client-build'], compilation.compileTask('out-build', true)); +gulp.task('compile-client-build', ['clean-client-build'], compilation.compileTask('src', 'out-build', true)); gulp.task('watch-client-build', ['clean-client-build'], compilation.watchTask('out-build', true)); // Default diff --git a/i18n/chs/extensions/configuration-editing/out/extension.i18n.json b/i18n/chs/extensions/configuration-editing/out/extension.i18n.json index ebf9d24bc1..e6385c4bf3 100644 --- a/i18n/chs/extensions/configuration-editing/out/extension.i18n.json +++ b/i18n/chs/extensions/configuration-editing/out/extension.i18n.json @@ -6,5 +6,16 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "workspaceFolder": "在 VS Code 中打开的文件夹的路径", + "workspaceFolderBasename": "在 VS Code 中打开的文件夹的名称 (不包含任何斜杠 \"/\" )", + "relativeFile": "相对于 ${workspaceFolder},当前打开的文件路径", + "file": "当前打开的文件", + "cwd": "启动时任务运行程序的当前工作目录", + "lineNumber": "活动文件中当前选定行的行号", + "selectedText": "当前在活动文件中选定的文本", + "fileDirname": "当前打开的文件的完整目录名", + "fileExtname": "当前打开的文件的扩展名", + "fileBasename": "当前打开的文件的文件名", + "fileBasenameNoExtension": "当前打开的文件的文件名 (不包含文件扩展名)", "exampleExtension": "示例" } \ No newline at end of file diff --git a/i18n/chs/extensions/git/out/commands.i18n.json b/i18n/chs/extensions/git/out/commands.i18n.json index de35e20588..04fae89946 100644 --- a/i18n/chs/extensions/git/out/commands.i18n.json +++ b/i18n/chs/extensions/git/out/commands.i18n.json @@ -2,7 +2,7 @@ "": [ "--------------------------------------------------------------------------------------------", "Copyright (c) Microsoft Corporation. All rights reserved.", - "Licensed under the Source EULA. See License.txt in the project root for license information.", + "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], @@ -10,10 +10,12 @@ "remote branch at": "{0} 处的远程分支", "create branch": "$(plus) 创建新分支", "repourl": "存储库 URL", - "parent": "父目录", + "selectFolder": "选择存储库位置", "cloning": "正在克隆 Git 存储库“{0}”...", - "openrepo": "打开存储库", "proposeopen": "是否要打开已克隆存储库?", + "openrepo": "打开存储库", + "add": "添加到工作区", + "proposeopen2": "您是希望打开克隆的存储库,还是将其添加到当前工作区?", "init": "选择用于初始化 Git 储存库的工作区文件夹", "init repo": "初始化存储库", "create repo": "初始化存储库", diff --git a/i18n/chs/extensions/npm/out/npmView.i18n.json b/i18n/chs/extensions/npm/out/npmView.i18n.json index d549553334..b826cc7a7f 100644 --- a/i18n/chs/extensions/npm/out/npmView.i18n.json +++ b/i18n/chs/extensions/npm/out/npmView.i18n.json @@ -6,6 +6,9 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "npm.noDebugOptions": "无法启动“{0}”并进行调试。脚本缺少 Node 调试选项,如 \"--inspect-brk\"。", - "npm.scriptInvalid": "找不到脚本“{0}”。请尝试刷新视图。" + "noScripts": "找不到脚本", + "noDebugOptions": "无法启动“{0}”并进行调试。脚本缺少 Node 调试选项,如 \"--inspect-brk\"。", + "learnMore": "了解详细信息", + "ok": "确定", + "scriptInvalid": "找不到脚本“{0}”。请尝试刷新视图。" } \ No newline at end of file diff --git a/i18n/chs/extensions/npm/package.i18n.json b/i18n/chs/extensions/npm/package.i18n.json index 26fe779a0b..3f53500fe1 100644 --- a/i18n/chs/extensions/npm/package.i18n.json +++ b/i18n/chs/extensions/npm/package.i18n.json @@ -12,15 +12,15 @@ "config.npm.runSilent": "使用 \"--silent\" 选项运行 npm 命令。", "config.npm.packageManager": "用于运行脚本的程序包管理器。", "config.npm.exclude": "配置应从自动脚本检测中排除的文件夹的 glob 模式。", - "config.npm.enableScriptExplorer": "当工作区包含 \"package.json\" 文件时,启用 npm 脚本资源管理器视图。", + "config.npm.enableScriptExplorer": "在资源管理器中启用“npm 脚本”视图。", + "config.npm.scriptExplorerAction": "在脚本资源管理器中点击时进行的默认操作: \"open\" (打开) 或 \"run\" (运行)。默认值为 \"open\"。", "npm.parseError": "Npm 任务检测: 无法分析文件 {0}", "taskdef.script": "要自定义的 npm 脚本。", "taskdef.path": "包含 package.json 文件的文件夹路径,其中 package.json 文件提供脚本。可以省略。", - "view.name": "Npm 脚本", + "view.name": "npm 脚本", "command.refresh": "刷新", "command.run": "运行", "command.debug": "调试", "command.openScript": "开放", - "npm.scriptInvalid": "找不到脚本“{0}”。请尝试刷新视图。", - "npm.noDebugOptions": "无法启动“{0}”并进行调试。脚本缺少 Node 调试选项,如 \"--inspect-brk\"。" + "command.runInstall": "运行 install" } \ No newline at end of file diff --git a/i18n/chs/extensions/search-rg/package.i18n.json b/i18n/chs/extensions/search-rg/package.i18n.json new file mode 100644 index 0000000000..ded449a23e --- /dev/null +++ b/i18n/chs/extensions/search-rg/package.i18n.json @@ -0,0 +1,11 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "displayName": "搜索 (ripgrep)", + "description": "使用 Ripgrep 提供搜索。" +} \ No newline at end of file diff --git a/i18n/chs/extensions/typescript-language-features/out/features/updatePathsOnRename.i18n.json b/i18n/chs/extensions/typescript-language-features/out/features/updatePathsOnRename.i18n.json new file mode 100644 index 0000000000..9e215d949d --- /dev/null +++ b/i18n/chs/extensions/typescript-language-features/out/features/updatePathsOnRename.i18n.json @@ -0,0 +1,14 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "prompt": "是否自动更新已移动文件 ({0}) 的 import 语句?", + "reject.title": "否", + "accept.title": "是", + "always.title": "是,始终更新 import 语句", + "never.title": "否,从不更新 import 语句" +} \ No newline at end of file diff --git a/i18n/chs/extensions/typescript-language-features/package.i18n.json b/i18n/chs/extensions/typescript-language-features/package.i18n.json index d12cc2e3f7..a6ef01afb9 100644 --- a/i18n/chs/extensions/typescript-language-features/package.i18n.json +++ b/i18n/chs/extensions/typescript-language-features/package.i18n.json @@ -8,8 +8,7 @@ ], "displayName": "JavaScript 和 TypeScript 的语言功能", "description": "为 JavaScript 和 TypeScript 提供丰富的语言支持。", - "typescript.reloadProjects.title": "重载项目", - "javascript.reloadProjects.title": "重载项目", + "reloadProjects.title": "重载项目", "configuration.typescript": "TypeScript", "typescript.useCodeSnippetsOnMethodSuggest.dec": "完成函数的参数签名。", "typescript.tsdk.desc": "指定包含要使用的 tsserver 和 lib*.d.ts 文件的文件夹路径。", @@ -37,8 +36,7 @@ "format.placeOpenBraceOnNewLineForFunctions": "定义函数的左大括号是否放置在新的一行。", "format.placeOpenBraceOnNewLineForControlBlocks": "定义控制块的左括号是否放置在新的一行。", "javascript.validate.enable": "启用/禁用 JavaScript 验证。", - "typescript.goToProjectConfig.title": "转到项目配置", - "javascript.goToProjectConfig.title": "转到项目配置", + "goToProjectConfig.title": "转到项目配置", "javascript.referencesCodeLens.enabled": "启用/禁用在 JavaScript 文件中引用 CodeLens。", "typescript.referencesCodeLens.enabled": "启用/禁用在 TypeScript 文件中引用 CodeLens。要求 TypeScript >= 2.0.6。", "typescript.implementationsCodeLens.enabled": "启用/禁用实现 CodeLens。要求 TypeScript >= 2.2.0。", @@ -47,7 +45,7 @@ "typescript.selectTypeScriptVersion.title": "选择 TypeScript 版本", "typescript.reportStyleChecksAsWarnings": "将风格检查问题报告为警告", "jsDocCompletion.enabled": "启用/禁用自动 JSDoc 注释", - "javascript.implicitProjectConfig.checkJs": "启用/禁用 JavaScript 文件的语义检查。现有的 jsconfig.json 或\n tsconfig.json 文件会覆盖此设置。要求 TypeScript >=2.3.1。", + "javascript.implicitProjectConfig.checkJs": "启用或禁用 JavaScript 文件的语义检查。若有 jsconfig.json 或 tsconfig.json 文件,将覆盖此设置。要求 TypeScript >= 2.3.1。", "typescript.npm": "指定用于自动获取类型的 NPM 可执行文件的路径。要求 TypeScript >= 2.3.4。", "typescript.check.npmIsInstalled": "检查是否安装了 NPM 以自动获取类型。", "javascript.nameSuggestions": "启用/禁用在 JavaScript 建议列表中包含文件中的唯一名称。", @@ -55,11 +53,15 @@ "typescript.problemMatchers.tsc.label": "TypeScript 问题", "typescript.problemMatchers.tscWatch.label": "TypeScript 问题(观看模式)", "typescript.quickSuggestionsForPaths": "当输入导入路径时启用或禁用快速建议。", - "typescript.locale": "设置报告 TypeScript 错误时使用的区域设置。要求 TypeScript >= 2.6.0。默认 (\"null\") 将使用 VS Code 的区域设置。", - "javascript.implicitProjectConfig.experimentalDecorators": "对不属于任何工程的 JavaScript 文件启用或禁用 \"experimentalDecorators\" 设置。现有的 jsconfig.json 或\n tsconfig.json 文件会覆盖此设置。要求 TypeScript >=2.3.1。", + "typescript.locale": "设置在报告 JavaScript 和 TypeScript 错误时使用的区域设置。要求 TypeScript >= 2.6.0。默认 (\"null\") 将使用 VS Code 的区域设置。", + "javascript.implicitProjectConfig.experimentalDecorators": "对不属于任何工程的 JavaScript 文件启用或禁用 \"experimentalDecorators\" 设置。若有 jsconfig.json 或 tsconfig.json 文件,将覆盖此设置。要求 TypeScript >= 2.3.1。", "typescript.autoImportSuggestions.enabled": "启用或禁用自动导入建议。要求 TypeScript >= 2.6.1", "typescript.experimental.syntaxFolding": "启用或禁用语法折叠标记。", "taskDefinition.tsconfig.description": "定义 TS 生成的 tsconfig 文件。", "javascript.suggestionActions.enabled": "在 JavaScript 文件中启用或禁用编辑器的建议诊断。需要 TypeScript >= 2.8", - "typescript.suggestionActions.enabled": "在 TypeScript 文件中启用或禁用编辑器的建议诊断。需要 TypeScript >= 2.8" + "typescript.suggestionActions.enabled": "在 TypeScript 文件中启用或禁用编辑器的建议诊断。要求 TypeScript >= 2.8", + "typescript.preferences.quoteStyle": "用于快速修复的首选引用样式: \"single\" (单引号)、\"double\" (双引号) 或 \"auto\" (从已有 import 语句中推测引号类型)。要求 TypeScript >= 2.9", + "typescript.preferences.importModuleSpecifier": "自动 import 语句中首选的路径类型:\n- \"relative\",相对路径。\n- \"non-relative\",根据 \"jsconfig.json\" 或 \"tsconfig.json\" 中设置的 \"baseUrl\" 的计算出的路径。\n- \"auto\",推测最短路径类型。\n要求 TypeScript >= 2.9", + "typescript.showUnused": "启用或禁用突出显示代码中未使用的变量。要求 TypeScript >= 2.9", + "typescript.updateImportsOnFileMove.enabled": "在 VS Code 中重命名或移动文件时启用或禁用自动更新 import 语句的路径。可选值有: \"prompt\" (在每次重命名时提示)、\"always\" (始终自动更新路径) 和 \"never\" (从不重命名路径且不要提示)。要求 TypeScript >= 2.9" } \ No newline at end of file diff --git a/i18n/chs/src/vs/base/common/json.i18n.json b/i18n/chs/src/vs/base/common/json.i18n.json index 8bc88b9c5c..782185bb39 100644 --- a/i18n/chs/src/vs/base/common/json.i18n.json +++ b/i18n/chs/src/vs/base/common/json.i18n.json @@ -1,9 +1,11 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the Source EULA. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ -// Do not edit this file. It is machine generated. { + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], "error.invalidSymbol": "符号无效", "error.invalidNumberFormat": "数字格式无效", "error.propertyNameExpected": "需要属性名", @@ -12,5 +14,5 @@ "error.commaExpected": "需要逗号", "error.closeBraceExpected": "需要右大括号", "error.closeBracketExpected": "需要右括号", - "error.endOfFileExpected": "预期的文件结尾" -} \ No newline at end of file + "error.endOfFileExpected": "需要文件结尾标识(EOF)" +} diff --git a/i18n/chs/src/vs/base/node/zip.i18n.json b/i18n/chs/src/vs/base/node/zip.i18n.json index d499d33124..31d1ce39d3 100644 --- a/i18n/chs/src/vs/base/node/zip.i18n.json +++ b/i18n/chs/src/vs/base/node/zip.i18n.json @@ -6,6 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "incompleteExtract": "解压不完整。提取了 {0} / {1} 个项目", + "incompleteExtract": "解压不完整。找到了 {0} / {1} 个项目", "notFound": "在 Zip 中找不到 {0}。" } \ No newline at end of file diff --git a/i18n/chs/src/vs/code/electron-browser/issue/issueReporterMain.i18n.json b/i18n/chs/src/vs/code/electron-browser/issue/issueReporterMain.i18n.json index 7e6b14a8f6..f956ec0c08 100644 --- a/i18n/chs/src/vs/code/electron-browser/issue/issueReporterMain.i18n.json +++ b/i18n/chs/src/vs/code/electron-browser/issue/issueReporterMain.i18n.json @@ -6,6 +6,8 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "hide": "隐藏", + "show": "显示", "previewOnGitHub": "在 GitHub 中预览", "loadingData": "正在加载数据...", "rateLimited": "超出 GitHub 查询限制。请稍候。", diff --git a/i18n/chs/src/vs/code/electron-browser/issue/issueReporterPage.i18n.json b/i18n/chs/src/vs/code/electron-browser/issue/issueReporterPage.i18n.json index e0e39df949..b6a3844bc2 100644 --- a/i18n/chs/src/vs/code/electron-browser/issue/issueReporterPage.i18n.json +++ b/i18n/chs/src/vs/code/electron-browser/issue/issueReporterPage.i18n.json @@ -17,13 +17,12 @@ "issueTitleLabel": "标题", "issueTitleRequired": "请输入标题。", "titleLengthValidation": "标题太长。", - "systemInfo": "我的系统信息", - "sendData": "发送我的数据", - "processes": "当前运行的进程", - "workspaceStats": "我的工作区数据", - "extensions": "我的扩展", - "searchedExtensions": "已搜索的扩展", - "settingsSearchDetails": "设置搜索的详细信息", "details": "请输入详细信息。", - "loadingData": "正在加载数据..." + "sendSystemInfo": "包含系统信息 ({0})", + "show": "显示", + "sendProcessInfo": "包含当前运行中的进程 ({0})", + "sendWorkspaceInfo": "包含工作区元数据 ({0})", + "sendExtensions": "包含已启用的扩展 ({0})", + "sendSearchedExtensions": "发送已搜索的扩展 ({0})", + "sendSettingsSearchDetails": "发送设置搜索的详细信息 ({0})" } \ No newline at end of file diff --git a/i18n/chs/src/vs/code/electron-browser/processExplorer/processExplorerMain.i18n.json b/i18n/chs/src/vs/code/electron-browser/processExplorer/processExplorerMain.i18n.json index fd812926a9..9dca8b3d76 100644 --- a/i18n/chs/src/vs/code/electron-browser/processExplorer/processExplorerMain.i18n.json +++ b/i18n/chs/src/vs/code/electron-browser/processExplorer/processExplorerMain.i18n.json @@ -11,5 +11,7 @@ "pid": "PID", "name": "名称", "killProcess": "结束进程", - "forceKillProcess": "强制结束进程" + "forceKillProcess": "强制结束进程", + "copy": "复制", + "copyAll": "全部复制" } \ No newline at end of file diff --git a/i18n/chs/src/vs/code/electron-main/menus.i18n.json b/i18n/chs/src/vs/code/electron-main/menus.i18n.json index 86b6c05738..d6cf16b00c 100644 --- a/i18n/chs/src/vs/code/electron-main/menus.i18n.json +++ b/i18n/chs/src/vs/code/electron-main/menus.i18n.json @@ -88,7 +88,6 @@ "miToggleDebugConsole": "调试控制台(&&B)", "miToggleIntegratedTerminal": "集成终端(&&I)", "miMarker": "问题(&&P)", - "miAdditionalViews": "其他视图(&&V)", "miCommandPalette": "命令面板(&&C)...", "miOpenView": "打开视图(&&O)...", "miToggleFullScreen": "切换全屏(&&F)", @@ -144,7 +143,7 @@ "miContinue": "继续(&&C)", "miToggleBreakpoint": "切换断点(&&B)", "miConditionalBreakpoint": "条件断点(&&C)...", - "miColumnBreakpoint": "列断点(&&O)", + "miInlineBreakpoint": "内联断点(&&O)", "miFunctionBreakpoint": "函数断点(&&F)...", "miLogPoint": "记录点(&&L)...", "miNewBreakpoint": "新建断点(&&N)", diff --git a/i18n/chs/src/vs/editor/browser/widget/codeEditorWidget.i18n.json b/i18n/chs/src/vs/editor/browser/widget/codeEditorWidget.i18n.json new file mode 100644 index 0000000000..c66c25ea99 --- /dev/null +++ b/i18n/chs/src/vs/editor/browser/widget/codeEditorWidget.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "cursors.maximum": "光标数量被限制为 {0}。" +} \ No newline at end of file diff --git a/i18n/chs/src/vs/editor/common/config/commonEditorConfig.i18n.json b/i18n/chs/src/vs/editor/common/config/commonEditorConfig.i18n.json index acdc384835..2642f1f247 100644 --- a/i18n/chs/src/vs/editor/common/config/commonEditorConfig.i18n.json +++ b/i18n/chs/src/vs/editor/common/config/commonEditorConfig.i18n.json @@ -26,6 +26,7 @@ "detectIndentation": "当打开文件时,将基于文件内容检测 \"editor.tabSize\" 和 \"editor.insertSpaces\"。", "roundedSelection": "控制选取范围是否有圆角", "scrollBeyondLastLine": "控制编辑器是否可以滚动到最后一行之后", + "scrollBeyondLastColumn": "控制编辑器水平滚动时可以超出滚动的字符数", "smoothScrolling": "控制编辑器是否在滚动时使用动画", "minimap.enabled": "控制是否显示 minimap", "minimap.side": "控制在哪一侧显示小地图。", @@ -41,7 +42,7 @@ "wordWrap.bounded": "将在最小视区和 \"editor.wordWrapColumn\" 处换行。", "wordWrap": "控制折行方式。可以选择:\n - \"off\" (禁用折行),\n - \"on\" (根据视区宽度折行),\n - \"wordWrapColumn\" (在 \"editor.wordWrapColumn\" 处换行)\n - \"bounded\" (在视区宽度和 \"editor.wordWrapColumn\" 两者的较小者处换行)。", "wordWrapColumn": "在 \"editor.wordWrap\" 为 \"wordWrapColumn\" 或 \"bounded\" 时控制编辑器列的换行。", - "wrappingIndent": "控制折行的缩进。可以是“none”、“same”或“indent”。", + "wrappingIndent": "控制折行的缩进。可为 \"none\"、\"same\" 或 \"indent\" 或 \"deepIndent\"。", "mouseWheelScrollSensitivity": "要对鼠标滚轮滚动事件的 \"deltaX\" 和 \"deltaY\" 使用的乘数 ", "multiCursorModifier.ctrlCmd": "映射为 \"Ctrl\" (Windows 和 Linux) 或 \"Command\" (macOS)", "multiCursorModifier.alt": "映射为 \"Alt\" (Windows 和 Linux) 或 \"Option\" (macOS)", diff --git a/i18n/chs/src/vs/editor/common/view/editorColorRegistry.i18n.json b/i18n/chs/src/vs/editor/common/view/editorColorRegistry.i18n.json index bde523e26e..b7f967654b 100644 --- a/i18n/chs/src/vs/editor/common/view/editorColorRegistry.i18n.json +++ b/i18n/chs/src/vs/editor/common/view/editorColorRegistry.i18n.json @@ -14,7 +14,7 @@ "editorCursorBackground": "编辑器光标的背景色。可以自定义块型光标覆盖字符的颜色。", "editorWhitespaces": "编辑器中空白字符的颜色。", "editorIndentGuides": "编辑器缩进参考线的颜色。", - "editorActiveIndentGuide": "活动编辑器缩进参考线的颜色。", + "editorActiveIndentGuide": "编辑器活动缩进参考线的颜色。", "editorLineNumbers": "编辑器行号的颜色。", "editorActiveLineNumber": "编辑器活动行号的颜色", "deprecatedEditorActiveLineNumber": "\"Id\" 已被弃用,请改用 \"editorLineNumber.activeForeground\"。", @@ -32,6 +32,7 @@ "infoBorder": "编辑器中信息波浪线的边框颜色。", "hintForeground": "编辑器中提示波浪线的前景色。", "hintBorder": "编辑器中提示波浪线的边框颜色。", + "unnecessaryForeground": "编辑器中不必要代码的前景色。", "overviewRulerRangeHighlight": "概览标尺中高亮范围的标记颜色。颜色必须透明,使其不会挡住下方的其他元素。", "overviewRuleError": "概述错误的标尺标记颜色。", "overviewRuleWarning": "概述警告的标尺标记颜色。", diff --git a/i18n/chs/src/vs/editor/contrib/fontZoom/fontZoom.i18n.json b/i18n/chs/src/vs/editor/contrib/fontZoom/fontZoom.i18n.json new file mode 100644 index 0000000000..f38289f737 --- /dev/null +++ b/i18n/chs/src/vs/editor/contrib/fontZoom/fontZoom.i18n.json @@ -0,0 +1,12 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "EditorFontZoomIn.label": "放大编辑器字体", + "EditorFontZoomOut.label": "缩小编辑器字体", + "EditorFontZoomReset.label": "重置编辑器字体大小" +} \ No newline at end of file diff --git a/i18n/chs/src/vs/editor/contrib/goToDefinition/goToDefinitionCommands.i18n.json b/i18n/chs/src/vs/editor/contrib/goToDefinition/goToDefinitionCommands.i18n.json new file mode 100644 index 0000000000..6193422f95 --- /dev/null +++ b/i18n/chs/src/vs/editor/contrib/goToDefinition/goToDefinitionCommands.i18n.json @@ -0,0 +1,25 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "noResultWord": "未找到“{0}”的任何定义", + "generic.noResults": "找不到定义", + "meta.title": " – {0} 定义", + "actions.goToDecl.label": "转到定义", + "actions.goToDeclToSide.label": "打开侧边的定义", + "actions.previewDecl.label": "速览定义", + "goToImplementation.noResultWord": "未找到“{0}”的实现", + "goToImplementation.generic.noResults": "未找到实现", + "meta.implementations.title": "– {0} 个实现", + "actions.goToImplementation.label": "转到实现", + "actions.peekImplementation.label": "速览实现", + "goToTypeDefinition.noResultWord": "未找到“{0}”的类型定义", + "goToTypeDefinition.generic.noResults": "未找到类型定义", + "meta.typeDefinitions.title": " – {0} 个类型定义", + "actions.goToTypeDefinition.label": "转到类型定义", + "actions.peekTypeDefinition.label": "速览类型定义" +} \ No newline at end of file diff --git a/i18n/chs/src/vs/editor/contrib/goToDefinition/goToDefinitionMouse.i18n.json b/i18n/chs/src/vs/editor/contrib/goToDefinition/goToDefinitionMouse.i18n.json new file mode 100644 index 0000000000..ffb98add2f --- /dev/null +++ b/i18n/chs/src/vs/editor/contrib/goToDefinition/goToDefinitionMouse.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "multipleResults": "单击显示 {0} 个定义。" +} \ No newline at end of file diff --git a/i18n/chs/src/vs/editor/contrib/gotoError/gotoError.i18n.json b/i18n/chs/src/vs/editor/contrib/gotoError/gotoError.i18n.json index 823d67c3a7..fe6dcd8ec5 100644 --- a/i18n/chs/src/vs/editor/contrib/gotoError/gotoError.i18n.json +++ b/i18n/chs/src/vs/editor/contrib/gotoError/gotoError.i18n.json @@ -7,5 +7,7 @@ "Do not edit this file. It is machine generated." ], "markerAction.next.label": "转到下一个问题 (错误、警告、信息)", - "markerAction.previous.label": "转到上一个问题 (错误、警告、信息)" + "markerAction.previous.label": "转到上一个问题 (错误、警告、信息)", + "markerAction.nextInFiles.label": "转到文件中的下一个问题 (错误、警告、信息)", + "markerAction.previousInFiles.label": "转到文件中的上一个问题 (错误、警告、信息)" } \ No newline at end of file diff --git a/i18n/chs/src/vs/editor/contrib/indentation/indentation.i18n.json b/i18n/chs/src/vs/editor/contrib/indentation/indentation.i18n.json index 49b6f55b35..d9145c0341 100644 --- a/i18n/chs/src/vs/editor/contrib/indentation/indentation.i18n.json +++ b/i18n/chs/src/vs/editor/contrib/indentation/indentation.i18n.json @@ -13,5 +13,6 @@ "indentUsingTabs": "使用“Tab”缩进", "indentUsingSpaces": "使用空格缩进", "detectIndentation": "检查内容中的缩进", - "editor.reindentlines": "重新缩进行" + "editor.reindentlines": "重新缩进行", + "editor.reindentselectedlines": "重新缩进所选行" } \ No newline at end of file diff --git a/i18n/chs/src/vs/platform/environment/node/argv.i18n.json b/i18n/chs/src/vs/platform/environment/node/argv.i18n.json index e63ccb708a..2464012ed1 100644 --- a/i18n/chs/src/vs/platform/environment/node/argv.i18n.json +++ b/i18n/chs/src/vs/platform/environment/node/argv.i18n.json @@ -8,7 +8,7 @@ ], "gotoValidation": "\"--goto\" 模式中的参数格式应为 \"FILE(:LINE(:CHARACTER))\"。", "diff": "将两个文件相互比较。", - "add": "将文件夹添加到最后一个活动窗口。", + "add": "将文件夹添加到上一个活动窗口。", "goto": "打开路径下的文件并定位到特定行和特定列。", "newWindow": "强制打开新窗口。", "reuseWindow": "强制打开上一个活动窗口中的文件或文件夹。", diff --git a/i18n/chs/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json b/i18n/chs/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json index 0e17b24b64..7fee73e850 100644 --- a/i18n/chs/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json +++ b/i18n/chs/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json @@ -25,8 +25,6 @@ "uninstallDependeciesConfirmation": "是仅卸载“{0}”还是与其依赖项一起卸载?", "uninstallOnly": "仅此扩展", "uninstallAll": "全部卸载", - "uninstallConfirmation": "是否确定要卸载“{0}”?", - "ok": "确定", "singleDependentError": "无法卸载扩展程序“{0}”。扩展程序“{1}”依赖于此。", "twoDependentsError": "无法卸载扩展程序“{0}”。扩展程序“{1}”、“{2}”依赖于此。", "multipleDependentsError": "无法卸载扩展程序“{0}”。扩展程序“{1}”、“{2}”以及其他扩展程序都依赖于此。", diff --git a/i18n/chs/src/vs/platform/list/browser/listService.i18n.json b/i18n/chs/src/vs/platform/list/browser/listService.i18n.json index c96dd85c96..a2e6baf0c2 100644 --- a/i18n/chs/src/vs/platform/list/browser/listService.i18n.json +++ b/i18n/chs/src/vs/platform/list/browser/listService.i18n.json @@ -9,7 +9,7 @@ "workbenchConfigurationTitle": "工作台", "multiSelectModifier.ctrlCmd": "映射为 \"Ctrl\" (Windows 和 Linux) 或 \"Command\" (macOS)", "multiSelectModifier.alt": "映射为 \"Alt\" (Windows 和 Linux) 或 \"Option\" (macOS)", - "multiSelectModifier": "在通过鼠标多选树和列表条目时使用的修改键 (例如资资源管理器、打开的编辑器和源代码管理视图)。\"ctrlCmd\" 会映射为 \"Ctrl\" (Windows 和 Linux) 或 \"Command\" (macOS)。“在侧边打开”功能所需的鼠标动作 (若可用) 将会相应调整,不与多选修改键冲突。", + "multiSelectModifier": "在通过鼠标多选树和列表条目时使用的修改键 (例如资源管理器、打开的编辑器和源代码管理视图)。\"ctrlCmd\" 在 Windows 和 Linux 上会映射为 \"Ctrl\" ,在 macOS 上会映射为 \"Command\" 。“在侧边打开”功能所需的鼠标动作 (若可用) 将会相应调整,不与多选修改键冲突。", "openMode.singleClick": "在鼠标单击时打开项目。", "openMode.doubleClick": "在鼠标双击时打开项目。", "openModeModifier": "控制如何在受支持的树和列表中使用鼠标来打开项目。设置为 \"singleClick\" 可单击打开项目,\"doubleClick\" 仅可双击打开项目。对于树中含子节点的节点,此设置将控制使用单击还是双击来展开他们。注意,某些不适用此项的树或列表可能会忽略此设置。", diff --git a/i18n/chs/src/vs/platform/node/minimalTranslations.i18n.json b/i18n/chs/src/vs/platform/node/minimalTranslations.i18n.json new file mode 100644 index 0000000000..678021ac78 --- /dev/null +++ b/i18n/chs/src/vs/platform/node/minimalTranslations.i18n.json @@ -0,0 +1,13 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "showLanguagePackExtensions": "VS Code 能够以 {0} 语言显示。在商店中搜索语言包即可开始。", + "searchMarketplace": "搜索商店", + "installAndRestartMessage": "VS Code 能够以 {0} 语言显示。现在安装语言包即可开始使用。需要重启。", + "installAndRestart": "安装并重启" +} \ No newline at end of file diff --git a/i18n/chs/src/vs/platform/theme/common/colorRegistry.i18n.json b/i18n/chs/src/vs/platform/theme/common/colorRegistry.i18n.json index 499bcf441e..c983e4e827 100644 --- a/i18n/chs/src/vs/platform/theme/common/colorRegistry.i18n.json +++ b/i18n/chs/src/vs/platform/theme/common/colorRegistry.i18n.json @@ -2,7 +2,7 @@ "": [ "--------------------------------------------------------------------------------------------", "Copyright (c) Microsoft Corporation. All rights reserved.", - "Licensed under the Source EULA. See License.txt in the project root for license information.", + "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], @@ -16,7 +16,7 @@ "selectionBackground": "工作台所选文本的背景颜色(例如输入字段或文本区域)。注意,本设置不适用于编辑器。", "textSeparatorForeground": "文字分隔符的颜色。", "textLinkForeground": "文本中链接的前景色。", - "textLinkActiveForeground": "文本中活动链接的前景色。", + "textLinkActiveForeground": "文本中链接在点击或鼠标悬停时的前景色 。", "textPreformatForeground": "预格式化文本段的前景色。", "textBlockQuoteBackground": "文本中块引用的背景颜色。", "textBlockQuoteBorder": "文本中块引用的边框颜色。", @@ -48,6 +48,8 @@ "listDropBackground": "使用鼠标移动项目时,列表或树进行拖放的背景颜色。", "highlight": "在列表或树中搜索时,其中匹配内容的高亮颜色。", "invalidItemForeground": "列表或树中无效项的前景色,例如资源管理器中没有解析的根目录。", + "listErrorForeground": "包含错误的列表项的前景色。", + "listWarningForeground": "包含警告的列表项的前景色。", "pickerGroupForeground": "快速选取器分组标签的颜色。", "pickerGroupBorder": "快速选取器分组边框的颜色。", "buttonForeground": "按钮前景色。", @@ -58,7 +60,7 @@ "scrollbarShadow": "表示视图被滚动的滚动条阴影。", "scrollbarSliderBackground": "滚动条滑块背景色", "scrollbarSliderHoverBackground": "滚动条滑块在悬停时的背景色", - "scrollbarSliderActiveBackground": "滚动条滑块被激活时的背景色", + "scrollbarSliderActiveBackground": "滚动条滑块在被点击时的背景色。", "progressBarBackground": "表示长时间操作的进度条的背景色。", "editorBackground": "编辑器背景颜色。", "editorForeground": "编辑器默认前景色。", @@ -75,6 +77,7 @@ "editorFindMatchBorder": "当前搜索匹配项的边框颜色。", "findMatchHighlightBorder": "其他搜索匹配项的边框颜色。", "findRangeHighlightBorder": "搜索限制范围的边框颜色。颜色必须透明,使其不会挡住下方的其他元素。", + "findWidgetResizeBorder": "“查找”小部件中大小调整条的边框颜色。", "hoverHighlight": "文本在悬停提示显示时的高亮颜色。颜色必须透明,使其不会挡住下方的其他元素。", "hoverBackground": "编辑器悬停提示的背景颜色。", "hoverBorder": "光标悬停时编辑器的边框颜色。", diff --git a/i18n/chs/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.i18n.json b/i18n/chs/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.i18n.json index e28586d2eb..90f8881847 100644 --- a/i18n/chs/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.i18n.json +++ b/i18n/chs/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.i18n.json @@ -6,5 +6,5 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "confirmUrl": "是否让 {0} 扩展打开以下 URL?" + "confirmUrl": "是否允许扩展打开此 URL?" } \ No newline at end of file diff --git a/i18n/chs/src/vs/platform/workspaces/common/workspaces.i18n.json b/i18n/chs/src/vs/platform/workspaces/common/workspaces.i18n.json index 6835a1f6ca..118c4b1bb0 100644 --- a/i18n/chs/src/vs/platform/workspaces/common/workspaces.i18n.json +++ b/i18n/chs/src/vs/platform/workspaces/common/workspaces.i18n.json @@ -6,7 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "codeWorkspace": "代码工作区", + "codeWorkspace": "Code 工作区", "untitledWorkspace": "无标题 (工作区)", "workspaceNameVerbose": "{0} (工作区)", "workspaceName": "{0} (工作区)" diff --git a/i18n/chs/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json b/i18n/chs/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json index 5f7e4407bb..017005cd33 100644 --- a/i18n/chs/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json +++ b/i18n/chs/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json @@ -8,14 +8,13 @@ ], "vscode.extension.contributes.views.containers.id": "用于标识容器的唯一 ID,视图能在容器内通过 \"view\" 参与点提供。", "vscode.extension.contributes.views.containers.title": "人类可读的用于表示此容器的字符串", - "vscode.extension.contributes.views.containers.icon": "容器图标的路径。图标大小为 24x24,居中放置在 50x40 的方格内,其填充颜色为 \"rgb(215, 218, 224)\" 或 \"#d7dae0\"。所有图片格式均可用,推荐使用 SVG 格式。", + "vscode.extension.contributes.views.containers.icon": "容器图标的路径。图标大小为 24x24,并居中放置在 50x40 的区域内,其填充颜色为 \"rgb(215, 218, 224)\" 或 \"#d7dae0\"。所有图片格式均可用,推荐使用 SVG 格式。", "vscode.extension.contributes.viewsContainers": "向编辑器提供视图容器", "views.container.activitybar": "向活动栏提供视图容器", "test": "测试", - "proposed": "\"viewsContainers\" 参与点仅在以开发模式运行时或附加命令行开关: --enable-proposed-api {1} 时可用", "requirearray": "视图容器必须为数组", "requireidstring": "属性“{0}”是必要属性,其类型必须是 \"string\"。仅支持字母、数字、\"_\" 和 \"-\"。", - "requirestring": "属性“{0}”是必要属性,其类型必须是 \"string\"", + "requirestring": "“{0}”是必要属性,其类型必须是 \"string\" ", "showViewlet": "显示 {0}", "view": "查看" } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/browser/actions/workspaceActions.i18n.json b/i18n/chs/src/vs/workbench/browser/actions/workspaceActions.i18n.json index fce36a0fe3..f282cec055 100644 --- a/i18n/chs/src/vs/workbench/browser/actions/workspaceActions.i18n.json +++ b/i18n/chs/src/vs/workbench/browser/actions/workspaceActions.i18n.json @@ -15,5 +15,5 @@ "saveWorkspace": "保存工作区", "openWorkspaceAction": "打开工作区...", "openWorkspaceConfigFile": "打开工作区配置文件", - "openFolderAsWorkspaceInNewWindow": "在新窗口中将文件夹作为工作区打开" + "duplicateWorkspaceInNewWindow": "复制此工作区并在新窗口打开" } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/browser/parts/panel/panelPart.i18n.json b/i18n/chs/src/vs/workbench/browser/parts/panel/panelPart.i18n.json index bff6ca988e..401610c43b 100644 --- a/i18n/chs/src/vs/workbench/browser/parts/panel/panelPart.i18n.json +++ b/i18n/chs/src/vs/workbench/browser/parts/panel/panelPart.i18n.json @@ -1,8 +1,10 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the Source EULA. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ -// Do not edit this file. It is machine generated. { - "panelSwitcherBarAriaLabel": "活动面板切换器" + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "hidePanel": "隐藏面板" } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/browser/parts/quickopen/quickOpenController.i18n.json b/i18n/chs/src/vs/workbench/browser/parts/quickopen/quickOpenController.i18n.json index fff4018e11..992bf4a7bb 100644 --- a/i18n/chs/src/vs/workbench/browser/parts/quickopen/quickOpenController.i18n.json +++ b/i18n/chs/src/vs/workbench/browser/parts/quickopen/quickOpenController.i18n.json @@ -6,8 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "inputModeEntryDescription": "{0} (按 \"Enter\" 以确认或按 \"Esc\" 以取消)", - "inputModeEntry": "按 \"Enter\" 以确认或按 \"Esc\" 以取消", "emptyPicks": "无条目可供选取", "quickOpenInput": "键入 \"?\" 从此处获取有关可进行的操作的帮助", "historyMatches": "最近打开", diff --git a/i18n/chs/src/vs/workbench/browser/parts/views/viewsViewlet.i18n.json b/i18n/chs/src/vs/workbench/browser/parts/views/viewsViewlet.i18n.json index 026f8123b8..da9c5b8d0b 100644 --- a/i18n/chs/src/vs/workbench/browser/parts/views/viewsViewlet.i18n.json +++ b/i18n/chs/src/vs/workbench/browser/parts/views/viewsViewlet.i18n.json @@ -6,5 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "cannot toggle": "无法切换视图 {0} 的可见性", + "cannot show": "无法显示视图 {0},已依据其 \"when\" 条件隐藏", "hideView": "隐藏" } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/common/theme.i18n.json b/i18n/chs/src/vs/workbench/common/theme.i18n.json index f191cdce34..f294504767 100644 --- a/i18n/chs/src/vs/workbench/common/theme.i18n.json +++ b/i18n/chs/src/vs/workbench/common/theme.i18n.json @@ -11,8 +11,10 @@ "tabHoverBackground": "选项卡被悬停时的背景色。选项卡是编辑器区域中编辑器的容器。可在一个编辑器组中打开多个选项卡。可以有多个编辑器组。", "tabUnfocusedHoverBackground": "非焦点组选项卡被悬停时的背景色。选项卡是编辑器区域中编辑器的容器。可在一个编辑器组中打开多个选项卡。可以有多个编辑器组。", "tabBorder": "用于将选项卡彼此分隔开的边框。选项卡是编辑器区域中编辑器的容器。可在一个编辑器组中打开多个选项卡。可以存在多个编辑器组。", - "tabActiveBorder": "用于高亮活动的选项卡的边框。选项卡是编辑器区域中编辑器的容器。可在一个编辑器组中打开多个选项卡。可以存在多个编辑器组。", - "tabActiveUnfocusedBorder": "用于高亮一个失去焦点的编辑器组中的活动选项卡的边框。选项卡是编辑器区域中编辑器的容器。可在一个编辑器组中打开多个选项卡。可以存在多个编辑器组。", + "tabActiveBorder": "活动选项卡底部的边框。选项卡是编辑器区域中编辑器的容器。可在一个编辑器组中打开多个选项卡。可以存在多个编辑器组。", + "tabActiveBorderTop": "活动选项卡顶部的边框。选项卡是编辑器区域中编辑器的容器。可在一个编辑器组中打开多个选项卡。可以存在多个编辑器组。", + "tabActiveUnfocusedBorder": "在失去焦点的编辑器组中的活动选项卡底部的边框。选项卡是编辑器区域中编辑器的容器。可在一个编辑器组中打开多个选项卡。可以存在多个编辑器组。", + "tabActiveUnfocusedBorderTop": "在失去焦点的编辑器组中的活动选项卡顶部的边框。选项卡是编辑器区域中编辑器的容器。可在一个编辑器组中打开多个选项卡。可以存在多个编辑器组。", "tabHoverBorder": "选项卡被悬停时用于突出显示的边框。选项卡是编辑器区域中编辑器的容器。可在一个编辑器组中打开多个选项卡。可以有多个编辑器组。", "tabUnfocusedHoverBorder": "非焦点组选项卡被悬停时用于突出显示的边框。选项卡是编辑器区域中编辑器的容器。可在一个编辑器组中打开多个选项卡。可以有多个编辑器组。", "tabActiveForeground": "活动组中活动选项卡的前景色。在编辑器区域,选项卡是编辑器的容器。可在一个编辑器组中打开多个选项卡。可以有多个编辑器组。", diff --git a/i18n/chs/src/vs/workbench/parts/codeEditor/electron-browser/largeFileOptimizations.i18n.json b/i18n/chs/src/vs/workbench/parts/codeEditor/electron-browser/largeFileOptimizations.i18n.json new file mode 100644 index 0000000000..55bdc78aa7 --- /dev/null +++ b/i18n/chs/src/vs/workbench/parts/codeEditor/electron-browser/largeFileOptimizations.i18n.json @@ -0,0 +1,13 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "largeFile": "{0}: 为减少内存使用并避免卡顿或崩溃,我们已关闭对此大型文件内容的标记、折行和折叠。", + "neverShowAgain": "确定,且不再显示", + "removeOptimizations": "强制启用功能", + "reopenFilePrompt": "请重新打开文件以使此设置生效。" +} \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/debug/browser/debugActions.i18n.json b/i18n/chs/src/vs/workbench/parts/debug/browser/debugActions.i18n.json index f5e7e8a940..4897c7cf55 100644 --- a/i18n/chs/src/vs/workbench/parts/debug/browser/debugActions.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/debug/browser/debugActions.i18n.json @@ -41,7 +41,7 @@ "debugConsoleAction": "调试控制台", "unreadOutput": "调试控制台中的新输出", "debugFocusConsole": "焦点调试控制台", - "focusProcess": "焦点过程", + "focusSession": "聚焦于“会话”视图", "stepBackDebug": "后退", "reverseContinue": "反向" } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/debug/browser/debugCommands.i18n.json b/i18n/chs/src/vs/workbench/parts/debug/browser/debugCommands.i18n.json index a8370fb8ae..789adad073 100644 --- a/i18n/chs/src/vs/workbench/parts/debug/browser/debugCommands.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/debug/browser/debugCommands.i18n.json @@ -7,7 +7,7 @@ "Do not edit this file. It is machine generated." ], "noFolderDebugConfig": "请先打开一个文件夹以进行高级调试配置。", - "columnBreakpoint": "列断点", + "inlineBreakpoint": "内联断点", "debug": "调试", - "addColumnBreakpoint": "添加列断点" + "addInlineBreakpoint": "添加内联断点" } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/debug/browser/debugEditorActions.i18n.json b/i18n/chs/src/vs/workbench/parts/debug/browser/debugEditorActions.i18n.json index ab1e8acd57..e1a98139f7 100644 --- a/i18n/chs/src/vs/workbench/parts/debug/browser/debugEditorActions.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/debug/browser/debugEditorActions.i18n.json @@ -12,5 +12,7 @@ "runToCursor": "运行到光标处", "debugEvaluate": "调试: 求值", "debugAddToWatch": "调试: 添加到监视", - "showDebugHover": "调试: 显示悬停" + "showDebugHover": "调试: 显示悬停", + "goToNextBreakpoint": "调试: 转到下一个断点", + "goToPreviousBreakpoint": "调试: 转到上一个断点" } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/debug/browser/debugViewlet.i18n.json b/i18n/chs/src/vs/workbench/parts/debug/browser/debugViewlet.i18n.json index e39847d07f..ed13fe3925 100644 --- a/i18n/chs/src/vs/workbench/parts/debug/browser/debugViewlet.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/debug/browser/debugViewlet.i18n.json @@ -6,6 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "startAdditionalSession": "启动其他会话", "debugFocusVariablesView": "聚焦于变量视图", "debugFocusWatchView": "聚焦于监视视图", "debugFocusCallStackView": "聚焦于调用堆栈视图", diff --git a/i18n/chs/src/vs/workbench/parts/debug/common/debugSchemas.i18n.json b/i18n/chs/src/vs/workbench/parts/debug/common/debugSchemas.i18n.json new file mode 100644 index 0000000000..1f5ffac7df --- /dev/null +++ b/i18n/chs/src/vs/workbench/parts/debug/common/debugSchemas.i18n.json @@ -0,0 +1,38 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "vscode.extension.contributes.debuggers": "用于调试适配器。", + "vscode.extension.contributes.debuggers.type": "此调试适配器的唯一标识符。", + "vscode.extension.contributes.debuggers.label": "显示此调试适配器的名称。", + "vscode.extension.contributes.debuggers.program": "调试适配器程序的路径。该路径是绝对路径或相对于扩展文件夹的相对路径。", + "vscode.extension.contributes.debuggers.args": "要传递给适配器的可选参数。", + "vscode.extension.contributes.debuggers.runtime": "可选运行时,以防程序属性不可执行,但需要运行时。", + "vscode.extension.contributes.debuggers.runtimeArgs": "可选运行时参数。", + "vscode.extension.contributes.debuggers.variables": "将 \"launch.json\" 中的交互式变量(例如 ${action.pickProcess})映射到命令中。", + "vscode.extension.contributes.debuggers.initialConfigurations": "用于生成初始 \"launch.json\" 的配置。", + "vscode.extension.contributes.debuggers.languages": "可能被视为“默认调试程序”的调试扩展的语言列表。", + "vscode.extension.contributes.debuggers.adapterExecutableCommand": "如果指定的 VS Code 将调用此命令以确定调试适配器的可执行路径和要传递的参数。", + "vscode.extension.contributes.debuggers.configurationSnippets": "用于在 \"launch.json\" 中添加新配置的代码段。", + "vscode.extension.contributes.debuggers.configurationAttributes": "用于验证 \"launch.json\" 的 JSON 架构配置。", + "vscode.extension.contributes.debuggers.windows": "Windows 特定的设置。", + "vscode.extension.contributes.debuggers.windows.runtime": "用于 Windows 的运行时。", + "vscode.extension.contributes.debuggers.osx": "macOS 特定的设置。", + "vscode.extension.contributes.debuggers.osx.runtime": "用于 macOS 的运行时。", + "vscode.extension.contributes.debuggers.linux": "Linux 特定的设置。", + "vscode.extension.contributes.debuggers.linux.runtime": "用于 Linux 的运行时。", + "vscode.extension.contributes.breakpoints": "添加断点。", + "vscode.extension.contributes.breakpoints.language": "对此语言允许断点。", + "app.launch.json.title": "启动", + "app.launch.json.version": "此文件格式的版本。", + "app.launch.json.configurations": "配置列表。使用 IntelliSense 添加新配置或编辑现有配置。", + "app.launch.json.compounds": "复合列表。每个复合可引用多个配置,这些配置将一起启动。", + "app.launch.json.compound.name": "复合的名称。在启动配置下拉菜单中显示。", + "useUniqueNames": "配置名称必须唯一。", + "app.launch.json.compound.folder": "复合项所在的文件夹的名称。", + "app.launch.json.compounds.configurations": "将作为此复合的一部分启动的配置名称。" +} \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/debug/electron-browser/breakpointWidget.i18n.json b/i18n/chs/src/vs/workbench/parts/debug/electron-browser/breakpointWidget.i18n.json index f13fb148e6..b59a0f7178 100644 --- a/i18n/chs/src/vs/workbench/parts/debug/electron-browser/breakpointWidget.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/debug/electron-browser/breakpointWidget.i18n.json @@ -7,8 +7,8 @@ "Do not edit this file. It is machine generated." ], "breakpointWidgetLogMessagePlaceholder": "断点命中时记录的消息。{} 内的表达式将被替换。按 \"Enter\" 键确认,\"Esc\" 键取消。", - "breakpointWidgetHitCountPlaceholder": "在满足命中次数条件时中断。按 \"Enter\" 表示接受,\"Esc\" 表示取消。", - "breakpointWidgetExpressionPlaceholder": "在表达式计算结果为 true 时中断。按 \"Enter\" 表示接受,\"Esc\" 表示取消。", + "breakpointWidgetHitCountPlaceholder": "在命中次数条件满足时中断。按 \"Enter\" 键确认,\"Esc\" 键取消。", + "breakpointWidgetExpressionPlaceholder": "在表达式结果为真时中断。按 \"Enter\" 键确认,\"Esc\" 键取消。", "expression": "表达式", "hitCount": "命中次数", "logMessage": "记录消息" diff --git a/i18n/chs/src/vs/workbench/parts/debug/electron-browser/callStackView.i18n.json b/i18n/chs/src/vs/workbench/parts/debug/electron-browser/callStackView.i18n.json index 60f09689f8..0d79802636 100644 --- a/i18n/chs/src/vs/workbench/parts/debug/electron-browser/callStackView.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/debug/electron-browser/callStackView.i18n.json @@ -9,7 +9,7 @@ "callstackSection": "调用堆栈部分", "debugStopped": "因 {0} 已暂停", "callStackAriaLabel": "调试调用堆栈", - "process": "进程", + "session": "会话", "paused": "已暂停", "running": "正在运行", "thread": "线程", diff --git a/i18n/chs/src/vs/workbench/parts/debug/electron-browser/debug.contribution.i18n.json b/i18n/chs/src/vs/workbench/parts/debug/electron-browser/debug.contribution.i18n.json index db775631c1..e5fc5f61f0 100644 --- a/i18n/chs/src/vs/workbench/parts/debug/electron-browser/debug.contribution.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/debug/electron-browser/debug.contribution.i18n.json @@ -21,11 +21,12 @@ "allowBreakpointsEverywhere": "允许在任何文件中设置断点", "openExplorerOnEnd": "调试会话结束时自动打开资源管理器视图", "inlineValues": "调试时,在编辑器中显示变量值内联", - "hideActionBar": "控制是否应该隐藏浮点调试操作栏", + "toolBarLocation": "控制调试工具栏位置。其位置可为 \"floating\" (在所有视图之上浮动)、\"docked\" (停靠于“调试”视图) 或 \"hidden\" (隐藏)", "never": "在状态栏中不再显示调试", "always": "始终在状态栏中显示调试", "onFirstSessionStart": "仅于第一次启动调试后在状态栏中显示调试", "showInStatusBar": "控制何时显示调试状态栏", "openDebug": "控制是否在调试会话开始时打开调试视图。", + "enableAllHovers": "控制调试过程中是否启用非调试悬停提示。若为 \"true\",将调用悬停提供程序提供悬停提示。即使此项设置为 \"true\",普通悬停提示也不会显示。", "launch": "全局的调试启动配置。应用作跨工作区共享的 \"launch.json\" 的替代。" } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.i18n.json b/i18n/chs/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.i18n.json index 4b5af2bc96..b6148b3db9 100644 --- a/i18n/chs/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.i18n.json @@ -6,35 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "vscode.extension.contributes.debuggers": "用于调试适配器。", - "vscode.extension.contributes.debuggers.type": "此调试适配器的唯一标识符。", - "vscode.extension.contributes.debuggers.label": "显示此调试适配器的名称。", - "vscode.extension.contributes.debuggers.program": "调试适配器程序的路径。该路径是绝对路径或相对于扩展文件夹的相对路径。", - "vscode.extension.contributes.debuggers.args": "要传递给适配器的可选参数。", - "vscode.extension.contributes.debuggers.runtime": "可选运行时,以防程序属性不可执行,但需要运行时。", - "vscode.extension.contributes.debuggers.runtimeArgs": "可选运行时参数。", - "vscode.extension.contributes.debuggers.variables": "将 \"launch.json\" 中的交互式变量(例如 ${action.pickProcess})映射到命令中。", - "vscode.extension.contributes.debuggers.initialConfigurations": "用于生成初始 \"launch.json\" 的配置。", - "vscode.extension.contributes.debuggers.languages": "可能被视为“默认调试程序”的调试扩展的语言列表。", - "vscode.extension.contributes.debuggers.adapterExecutableCommand": "如果指定的 VS Code 将调用此命令以确定调试适配器的可执行路径和要传递的参数。", - "vscode.extension.contributes.debuggers.configurationSnippets": "用于在 \"launch.json\" 中添加新配置的代码段。", - "vscode.extension.contributes.debuggers.configurationAttributes": "用于验证 \"launch.json\" 的 JSON 架构配置。", - "vscode.extension.contributes.debuggers.windows": "Windows 特定的设置。", - "vscode.extension.contributes.debuggers.windows.runtime": "用于 Windows 的运行时。", - "vscode.extension.contributes.debuggers.osx": "macOS 特定的设置。", - "vscode.extension.contributes.debuggers.osx.runtime": "用于 macOS 的运行时。", - "vscode.extension.contributes.debuggers.linux": "Linux 特定的设置。", - "vscode.extension.contributes.debuggers.linux.runtime": "用于 Linux 的运行时。", - "vscode.extension.contributes.breakpoints": "添加断点。", - "vscode.extension.contributes.breakpoints.language": "对此语言允许断点。", - "app.launch.json.title": "启动", - "app.launch.json.version": "此文件格式的版本。", - "app.launch.json.configurations": "配置列表。使用 IntelliSense 添加新配置或编辑现有配置。", - "app.launch.json.compounds": "复合列表。每个复合可引用多个配置,这些配置将一起启动。", - "app.launch.json.compound.name": "复合的名称。在启动配置下拉菜单中显示。", - "useUniqueNames": "配置名称必须唯一。", - "app.launch.json.compound.folder": "复合项所在的文件夹的名称。", - "app.launch.json.compounds.configurations": "将作为此复合的一部分启动的配置名称。", "debugNoType": "不可省略调试器的 \"type\" 属性,且其类型必须是 \"string\" 。", "selectDebug": "选择环境", "DebugConfig.failed": "无法在 \".vscode\" 文件夹({0})内创建 \"launch.json\" 文件。", diff --git a/i18n/chs/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json b/i18n/chs/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json index a99b218685..81b74941d8 100644 --- a/i18n/chs/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json @@ -13,15 +13,15 @@ "disableBreakpoint": "禁用 {0}", "enableBreakpoint": "启用 {0}", "removeBreakpoints": "删除断点", - "removeBreakpointOnColumn": "在列 {0} 上删除断点", + "removeInlineBreakpointOnColumn": "删除第 {0} 列的内联断点", "removeLineBreakpoint": "删除行断点", "editBreakpoints": "编辑断点", - "editBreakpointOnColumn": "在列 {0} 上编辑断点", + "editInlineBreakpointOnColumn": "编辑第 {0} 列的内联断点", "editLineBrekapoint": "编辑行断点", "enableDisableBreakpoints": "启用/禁用断点", - "disableColumnBreakpoint": "在列 {0} 上禁用断点", + "disableInlineColumnBreakpoint": "禁用第 {0} 列的内联断点", "disableBreakpointOnLine": "禁用行断点", - "enableBreakpoints": "在列 {0} 上启用断点", + "enableBreakpoints": "启用第 {0} 列的内联断点", "enableBreakpointOnLine": "启用行断点", "addBreakpoint": "添加断点", "addConditionalBreakpoint": "添加条件断点...", diff --git a/i18n/chs/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.i18n.json b/i18n/chs/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.i18n.json index 9b363a9078..fd63599324 100644 --- a/i18n/chs/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.i18n.json @@ -10,15 +10,19 @@ "extension id": "扩展标识符", "preview": "预览版", "builtin": "内置", - "publisher": "发布服务器名称", + "publisher": "发布者名称", "install count": "安装计数", "rating": "评级", "repository": "存储库", "license": "许可证", "details": "详细信息", + "detailstooltip": "扩展详细信息,显示扩展的 \"README.md\" 文件。", "contributions": "发布内容", + "contributionstooltip": "包含此扩展向 VS Code 编辑器提供的功能", "changelog": "更改日志", + "changelogtooltip": "扩展的更新历史,显示扩展的 \"CHANGELOG.md\" 文件。", "dependencies": "依赖项", + "dependenciestooltip": "包含此扩展依赖的扩展", "noReadme": "无可用自述文件。", "noChangelog": "无可用的更改日志。", "noContributions": "没有发布内容", @@ -30,6 +34,10 @@ "debuggers": "调试程序({0})", "debugger name": "名称", "debugger type": "类型", + "viewContainers": "视图容器 ({0})", + "view container id": "ID", + "view container title": "标题", + "view container location": "位置", "views": "视图 ({0})", "view id": "ID", "view name": "名称", diff --git a/i18n/chs/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json b/i18n/chs/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json index 7c0e25df29..ede7628d6c 100644 --- a/i18n/chs/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json @@ -8,7 +8,6 @@ ], "neverShowAgain": "不再显示", "searchMarketplace": "搜索商店", - "showLanguagePackExtensions": "商店中有可以将 VS Code 本地化为“{0}”语言的扩展。", "dynamicWorkspaceRecommendation": "您可能会对这个扩展感兴趣,它在 {0} 存储库的用户间流行。", "exeBasedRecommendation": "根据你安装的 {0},向你推荐此扩展。", "fileBasedRecommendation": "根据您最近打开的文件推荐此扩展。", diff --git a/i18n/chs/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.i18n.json b/i18n/chs/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.i18n.json index 418d6d5683..3c2aa6086e 100644 --- a/i18n/chs/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.i18n.json @@ -17,7 +17,7 @@ "builtInBasicsExtensions": "编程语言", "searchExtensions": "在商店中搜索扩展", "sort by installs": "排序依据: 安装计数", - "sort by rating": "排序依据: 分级", + "sort by rating": "排序依据: 评分", "sort by name": "排序依据: 名称", "suggestProxyError": "市场返回 \"ECONNREFUSED\"。请检查 \"http.proxy\" 设置。", "extensions": "扩展", diff --git a/i18n/chs/src/vs/workbench/parts/extensions/node/extensionsWorkbenchService.i18n.json b/i18n/chs/src/vs/workbench/parts/extensions/node/extensionsWorkbenchService.i18n.json index e08a89e14a..c4f5c65e24 100644 --- a/i18n/chs/src/vs/workbench/parts/extensions/node/extensionsWorkbenchService.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/extensions/node/extensionsWorkbenchService.i18n.json @@ -10,12 +10,12 @@ "malicious": "此扩展被报告存在问题。", "installingMarketPlaceExtension": "正在从商店安装扩展...", "uninstallingExtension": "正在卸载扩展...", - "enableDependeciesConfirmation": "启用“{0}”也会启用其依赖项。是否要继续?", + "enableDependeciesConfirmation": "启用扩展也会启用其依赖项。是否要继续?", "enable": "是", "doNotEnable": "否", - "disableDependeciesConfirmation": "是想仅禁用“{0}”还是想同时禁用其依赖项?", - "disableOnly": "仅", - "disableAll": "全部", + "disableDependeciesConfirmation": "是否同时禁用扩展的依赖项?", + "yes": "是", + "no": "否", "cancel": "取消", "singleDependentError": "无法禁用扩展“{0}”。扩展“{1}”取决于此。", "twoDependentsError": "无法禁用扩展“{0}”。扩展“{1}”和扩展“{2}”取决于此。", diff --git a/i18n/chs/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json b/i18n/chs/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json index f2e95abe6d..cccbfb14b8 100644 --- a/i18n/chs/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json @@ -65,7 +65,6 @@ "emptyFileNameError": "必须提供文件或文件夹名。", "fileNameStartsWithSlashError": "文件或文件夹名称不能以斜线开头。", "fileNameExistsError": "此位置已存在文件或文件夹 **{0}**。请选择其他名称。", - "fileUsedAsFolderError": "**{0}** 是一个文件,不能含有子项。", "invalidFileNameError": "名称 **{0}** 作为文件或文件夹名无效。请选择其他名称。", "filePathTooLongError": "名称 **{0}** 导致路径太长。请选择更短的名称。", "compareWithClipboard": "比较活动文件与剪贴板", diff --git a/i18n/chs/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.i18n.json b/i18n/chs/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.i18n.json index c767d56880..cf9392bc8d 100644 --- a/i18n/chs/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.i18n.json @@ -7,6 +7,7 @@ "Do not edit this file. It is machine generated." ], "updateLocale": "是否将 VS Code 的界面语言更换为 {0} 并重新启动?", + "activateLanguagePack": "是否重启 VS Code 并激活刚刚安装的语言包?", "yes": "是", "no": "否", "neverAgain": "不再显示", diff --git a/i18n/chs/src/vs/workbench/parts/localizations/electron-browser/localizationsActions.i18n.json b/i18n/chs/src/vs/workbench/parts/localizations/electron-browser/localizationsActions.i18n.json index 3e746df31e..9719f721f2 100644 --- a/i18n/chs/src/vs/workbench/parts/localizations/electron-browser/localizationsActions.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/localizations/electron-browser/localizationsActions.i18n.json @@ -6,7 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "configureLocale": "配置语言", + "configureLocale": "配置显示语言", "displayLanguage": "定义 VSCode 的显示语言。", "doc": "请参阅 {0},了解支持的语言列表。", "restart": "更改此值需要重启 VSCode。", diff --git a/i18n/chs/src/vs/workbench/parts/markers/electron-browser/markersPanel.i18n.json b/i18n/chs/src/vs/workbench/parts/markers/electron-browser/markersPanel.i18n.json index a23959a4c1..50341baaf7 100644 --- a/i18n/chs/src/vs/workbench/parts/markers/electron-browser/markersPanel.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/markers/electron-browser/markersPanel.i18n.json @@ -6,6 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "disableFilesExclude": "禁用文件排除筛选器。", + "disableFilesExclude": "禁用排除的文件筛选器。", "clearFilter": "清除筛选。" } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/outline/electron-browser/outline.contribution.i18n.json b/i18n/chs/src/vs/workbench/parts/outline/electron-browser/outline.contribution.i18n.json new file mode 100644 index 0000000000..f5017835b2 --- /dev/null +++ b/i18n/chs/src/vs/workbench/parts/outline/electron-browser/outline.contribution.i18n.json @@ -0,0 +1,12 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "name": "大纲", + "category.focus": "文件", + "label.focus": "聚焦于“大纲”视图" +} \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/outline/electron-browser/outlinePanel.i18n.json b/i18n/chs/src/vs/workbench/parts/outline/electron-browser/outlinePanel.i18n.json new file mode 100644 index 0000000000..245e047ece --- /dev/null +++ b/i18n/chs/src/vs/workbench/parts/outline/electron-browser/outlinePanel.i18n.json @@ -0,0 +1,17 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "filter": "筛选", + "collapse": "全部折叠", + "sortByPosition": "排序依据:位置", + "sortByName": "排序依据: 名称", + "sortByKind": "排序方式: 类型", + "live": "跟随光标", + "no-editor": "当前打开的编辑器无法提供大纲信息。", + "too-many-symbols": "抱歉,文件太大,无法显示大纲。" +} \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/outline/electron-browser/outlineTree.i18n.json b/i18n/chs/src/vs/workbench/parts/outline/electron-browser/outlineTree.i18n.json new file mode 100644 index 0000000000..7276c784d7 --- /dev/null +++ b/i18n/chs/src/vs/workbench/parts/outline/electron-browser/outlineTree.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "outline.title": "{1} 中的第 {0} 行 " +} \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/output/browser/outputPanel.i18n.json b/i18n/chs/src/vs/workbench/parts/output/browser/outputPanel.i18n.json index 654ec7d5ac..6d9127e66f 100644 --- a/i18n/chs/src/vs/workbench/parts/output/browser/outputPanel.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/output/browser/outputPanel.i18n.json @@ -6,6 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "output": "输出", "outputPanelWithInputAriaLabel": "{0},输出面板", "outputPanelAriaLabel": "输出面板" } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/preferences/browser/keybindingWidgets.i18n.json b/i18n/chs/src/vs/workbench/parts/preferences/browser/keybindingWidgets.i18n.json index d38029c468..83822f8a85 100644 --- a/i18n/chs/src/vs/workbench/parts/preferences/browser/keybindingWidgets.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/preferences/browser/keybindingWidgets.i18n.json @@ -6,6 +6,8 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "defineKeybinding.oneExists": "已有 1 条命令的按键绑定与此相同", + "defineKeybinding.existing": "已有 {0} 条命令的按键绑定与此相同", "defineKeybinding.initial": "先按所需的组合键,再按 Enter 键。", "defineKeybinding.chordsTo": "加上" } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json b/i18n/chs/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json index 0f0cdb0019..8b981c0b9e 100644 --- a/i18n/chs/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json @@ -7,6 +7,7 @@ "Do not edit this file. It is machine generated." ], "openRawDefaultSettings": "打开默认设置原始文档", + "openSettings2": "打开设置 (预览版)", "openSettings": "打开设置", "openGlobalSettings": "打开用户设置", "openGlobalKeybindings": "打开键盘快捷方式", diff --git a/i18n/chs/src/vs/workbench/parts/preferences/browser/settingsEditor2.i18n.json b/i18n/chs/src/vs/workbench/parts/preferences/browser/settingsEditor2.i18n.json new file mode 100644 index 0000000000..176d58a11a --- /dev/null +++ b/i18n/chs/src/vs/workbench/parts/preferences/browser/settingsEditor2.i18n.json @@ -0,0 +1,18 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "previewWarning": "预览版", + "previewLabel": "当前显示的是新版设置编辑器的预览版界面。", + "SearchSettings.AriaLabel": "搜索设置", + "SearchSettings.Placeholder": "搜索设置", + "advancedCustomizationLabel": "高级自定义请打开和编辑", + "openSettingsLabel": "settings.json", + "showOverriddenOnly": "仅显示已修改项", + "treeAriaLabel": "设置", + "feedbackButtonLabel": "提供反馈" +} \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/preferences/browser/settingsTree.i18n.json b/i18n/chs/src/vs/workbench/parts/preferences/browser/settingsTree.i18n.json new file mode 100644 index 0000000000..4bface2e83 --- /dev/null +++ b/i18n/chs/src/vs/workbench/parts/preferences/browser/settingsTree.i18n.json @@ -0,0 +1,19 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "modifiedItemForeground": "已修改的设置项的前景色。", + "workspace": "工作区", + "user": "用户", + "resetButtonTitle": "重置", + "configured": "已修改", + "alsoConfiguredIn": "同时修改于", + "configuredIn": "修改于", + "editInSettingsJson": "在 settings.json 中编辑", + "settingRowAriaLabel": "{0} {1},设置", + "groupRowAriaLabel": "{0},组" +} \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/preferences/electron-browser/preferences.contribution.i18n.json b/i18n/chs/src/vs/workbench/parts/preferences/electron-browser/preferences.contribution.i18n.json index 039655eea1..c230756afc 100644 --- a/i18n/chs/src/vs/workbench/parts/preferences/electron-browser/preferences.contribution.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/preferences/electron-browser/preferences.contribution.i18n.json @@ -7,6 +7,7 @@ "Do not edit this file. It is machine generated." ], "defaultPreferencesEditor": "默认首选项编辑器", + "settingsEditor2": "设置编辑器 2", "keybindingsEditor": "按键绑定编辑器", "preferences": "首选项" } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/search/browser/searchActions.i18n.json b/i18n/chs/src/vs/workbench/parts/search/browser/searchActions.i18n.json index 7d294181ec..4a9e784b9e 100644 --- a/i18n/chs/src/vs/workbench/parts/search/browser/searchActions.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/search/browser/searchActions.i18n.json @@ -12,6 +12,8 @@ "previousSearchExcludePattern": "显示上一个搜索排除模式", "nextSearchTerm": "显示下一个搜索词", "previousSearchTerm": "显示上一个搜索词", + "nextReplaceTerm": "显示下一个搜索替换词", + "previousReplaceTerm": "显示上一个搜索替换词", "findInFiles": "在文件中查找", "replaceInFiles": "在文件中替换", "RefreshAction.label": "刷新", diff --git a/i18n/chs/src/vs/workbench/parts/search/browser/searchView.i18n.json b/i18n/chs/src/vs/workbench/parts/search/browser/searchView.i18n.json index 562901d243..2b5ccac0bc 100644 --- a/i18n/chs/src/vs/workbench/parts/search/browser/searchView.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/search/browser/searchView.i18n.json @@ -42,10 +42,10 @@ "openSettings.message": "打开设置", "openSettings.learnMore": "了解详细信息", "ariaSearchResultsStatus": "搜索 {1} 文件中返回的 {0} 个结果", - "search.file.result": "{1} 文件中有 {0} 个结果", - "search.files.result": "{1} 文件中有 {0} 个结果", - "search.file.results": "{1} 文件中有 {0} 个结果", - "search.files.results": "{1} 文件中有 {0} 个结果", + "search.file.result": "{0} 个结果,包含于 {1} 个文件中", + "search.files.result": "{0} 个结果,包含于 {1} 个文件中", + "search.file.results": "{0} 个结果,包含于 {1} 个文件中", + "search.files.results": "{0} 个结果,包含于 {1} 个文件中", "searchWithoutFolder": "尚未打开文件夹。当前仅可搜索打开的文件夹 - ", "openFolder": "打开文件夹" } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json b/i18n/chs/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json index e7e921aa68..61397c437f 100644 --- a/i18n/chs/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json @@ -31,5 +31,5 @@ "search.followSymlinks": "控制是否在搜索中跟踪符号链接。", "search.smartCase": "若搜索词全为小写,则不区分大小写进行搜索,否则区分大小写进行搜索", "search.globalFindClipboard": "控制“搜索”视图是否读取或修改 macOS 的共享查找剪贴板", - "search.location": "控制搜索功能显示在侧边栏还是水平空间更大的面板区域。我们将在下个版本中优化面板搜索的水平布局,此后,这将不再是一个预览功能。" + "search.location": "控制搜索功能显示在侧边栏还是水平空间更大的面板区域" } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/tasks/electron-browser/jsonSchemaCommon.i18n.json b/i18n/chs/src/vs/workbench/parts/tasks/electron-browser/jsonSchemaCommon.i18n.json index e6584129a7..99c5103158 100644 --- a/i18n/chs/src/vs/workbench/parts/tasks/electron-browser/jsonSchemaCommon.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/tasks/electron-browser/jsonSchemaCommon.i18n.json @@ -24,7 +24,7 @@ "JsonSchema.tasks.watching.deprecation": "已弃用。改用 isBackground。", "JsonSchema.tasks.watching": "已执行的任务是否保持活动状态,并且是否在监视文件系统。", "JsonSchema.tasks.background": "已执行的任务是否保持活动状态并在后台运行。", - "JsonSchema.tasks.promptOnClose": "当 VS 代码与运行的任务一起关闭时是否提示用户。", + "JsonSchema.tasks.promptOnClose": "若 VS Code 关闭时有任务运行,是否提醒用户。", "JsonSchema.tasks.build": "将此任务映射到代码的默认生成命令。", "JsonSchema.tasks.test": "将此任务映射到代码的默认测试命令。", "JsonSchema.tasks.matchers": "要使用的问题匹配程序。可以是字符串或问题匹配程序定义,或字符串和问题匹配程序数组。", diff --git a/i18n/chs/src/vs/workbench/parts/tasks/electron-browser/jsonSchema_v2.i18n.json b/i18n/chs/src/vs/workbench/parts/tasks/electron-browser/jsonSchema_v2.i18n.json index 78f08549fc..f7e1f999d9 100644 --- a/i18n/chs/src/vs/workbench/parts/tasks/electron-browser/jsonSchema_v2.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/tasks/electron-browser/jsonSchema_v2.i18n.json @@ -28,6 +28,7 @@ "JsonSchema.tasks.group.none": "将任务分配为没有组", "JsonSchema.tasks.group": "定义此任务属于的执行组。它支持 \"build\" 以将其添加到生成组,也支持 \"test\" 以将其添加到测试组。", "JsonSchema.tasks.type": "定义任务是被作为进程运行还是在 shell 中作为命令运行。", + "JsonSchema.commandArray": "执行的 Shell 命令。数组项将使用空格连接", "JsonSchema.command.quotedString.value": "实际命令值", "JsonSchema.tasks.quoting.escape": "使用 Shell 的转义字符来转义文本 (如,PowerShell 下的 ` 和 bash 下的 \\ )", "JsonSchema.tasks.quoting.strong": "使用 Shell 的强引用字符来引用参数 (如,在 PowerShell 和 bash 下的 \" )。", @@ -44,7 +45,7 @@ "JsonSchema.tasks.taskName": "任务名称", "JsonSchema.tasks.taskName.deprecated": "任务的 name 属性已被弃用。请改为使用 label 属性。", "JsonSchema.tasks.background": "已执行的任务是否保持活动状态并在后台运行。", - "JsonSchema.tasks.promptOnClose": "当 VS 代码与运行的任务一起关闭时是否提示用户。", + "JsonSchema.tasks.promptOnClose": "若 VS Code 关闭时有任务运行,是否提醒用户。 ", "JsonSchema.tasks.matchers": "要使用的问题匹配程序。可以是字符串或问题匹配程序定义,或字符串和问题匹配程序数组。", "JsonSchema.customizations.customizes.type": "要自定义的任务类型", "JsonSchema.tasks.customize.deprecated": "customize 属性已被弃用。请参阅 1.14 发行说明了解如何迁移到新的任务自定义方法", diff --git a/i18n/chs/src/vs/workbench/parts/tasks/node/taskConfiguration.i18n.json b/i18n/chs/src/vs/workbench/parts/tasks/node/taskConfiguration.i18n.json index 37cd61a268..ec97cabbe5 100644 --- a/i18n/chs/src/vs/workbench/parts/tasks/node/taskConfiguration.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/tasks/node/taskConfiguration.i18n.json @@ -6,7 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "ConfigurationParser.invalidCWD": "警告: options.cwd 必须属于字符串类型。正在忽略值 {0}\n", + "ConfigurationParser.invalidCWD": "警告: options.cwd 必须为 \"string\" 类型。将忽略值 {0}\n", "ConfigurationParser.inValidArg": "错误: 命令参数必须是字符串或有效引用的字符串。提供的值为: {0}", "ConfigurationParser.noargs": "错误: 命令参数必须是字符串数组。提供的值为:\n{0}", "ConfigurationParser.noShell": "警告: 仅当在终端中执行任务时支持 shell 配置。", diff --git a/i18n/chs/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.i18n.json b/i18n/chs/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.i18n.json index a4dbdc1654..b96d25d62d 100644 --- a/i18n/chs/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.i18n.json @@ -19,6 +19,7 @@ "terminal.integrated.copyOnSelection": "设置后,终端中选中的文字将被复制到剪贴板。", "terminal.integrated.fontFamily": "控制终端的字体系列,这在编辑器中是默认的。fontFamily 的值。", "terminal.integrated.fontSize": "控制终端的字号(以像素为单位)。", + "terminal.integrated.letterSpacing": "控制终端字符的间距。此项的值为整数,表示在字符间添加的额外像素数。", "terminal.integrated.lineHeight": "控制终端的行高,此数字乘上终端字号得到实际行高(以像素为单位)。", "terminal.integrated.fontWeight": "终端中非粗体字使用的字重。", "terminal.integrated.fontWeightBold": "终端中粗体字使用的字重。", @@ -26,6 +27,7 @@ "terminal.integrated.cursorStyle": "控制终端游标的样式。", "terminal.integrated.scrollback": "控制终端保持在缓冲区的最大行数。", "terminal.integrated.setLocaleVariables": "控制是否在终端启动时设置区域设置变量,在 OS X 上默认设置为 true,在其他平台上为 false。", + "terminal.integrated.rendererType": "控制终端的渲染方式。如果选择 \"canvas\" ,则使用标准 (快速的) canvas 渲染器;若为 \"dom\",则回退到基于 DOM 的渲染器;若为 \"auto\",则让 VS Code 选择最佳方式。此设定要在重载 VS Code 后才能生效。", "terminal.integrated.rightClickBehavior": "控制终端在点击右键时进行的操作,可选值为 \"default\"、 \"copyPaste\" 和 \"selectWord\"。选择 \"default\" 将显示上下文菜单;选择 \"copyPaste\" 将在有选择内容时进行复制,其他时候进行粘贴;选择 \"selectWord\" 终端将选择光标下的字并显示上下文菜单。", "terminal.integrated.cwd": "将在其中启动终端的一个显式起始路径,它用作 shell 进程的当前工作目录(cwd)。当根目录为不方便的 cwd 时,此路径在工作区设置中可能十分有用。", "terminal.integrated.confirmOnExit": "在存在活动终端会话的情况下,退出时是否要确认。", diff --git a/i18n/chs/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json b/i18n/chs/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json index f7d3697384..a2750058d8 100644 --- a/i18n/chs/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json @@ -57,5 +57,7 @@ "workbench.action.terminal.scrollToPreviousCommand": "滚动到上一条命令", "workbench.action.terminal.scrollToNextCommand": "滚动到下一条命令", "workbench.action.terminal.selectToPreviousCommand": "选择上一条命令所有内容", - "workbench.action.terminal.selectToNextCommand": "选择下一条命令所有内容" + "workbench.action.terminal.selectToNextCommand": "选择下一条命令所有内容", + "workbench.action.terminal.selectToPreviousLine": "选择上一行的所有内容", + "workbench.action.terminal.selectToNextLine": "选择下一行的所有内容" } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.i18n.json b/i18n/chs/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.i18n.json index 56f020fd3e..f86230a22e 100644 --- a/i18n/chs/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.i18n.json @@ -9,8 +9,13 @@ "terminal.integrated.a11yBlankLine": "空行", "terminal.integrated.a11yPromptLabel": "终端输入", "terminal.integrated.a11yTooMuchOutput": "输出太多,无法朗读。请手动转到行内进行阅读", + "yes": "是", + "terminal.rendererInAllNewTerminals": "所有新创建的终端都将使用非 GPU 渲染器。", + "no": "否", + "dontShowAgain": "不再显示", + "terminal.slowRendering": "集成终端的标准渲染器似乎在您的计算机上运行得很慢。使用基于 DOM 的渲染器也许能提高性能,是否切换? [阅读有关终端设置的更多信息](https://code.visualstudio.com/docs/editor/integrated-terminal#_changing-how-the-terminal-is-rendered)。", "terminal.integrated.copySelection.noSelection": "没有在终端中选择要复制的内容", - "terminal.integrated.exitedWithCode": "通过退出代码 {0} 终止的终端进程", + "terminal.integrated.exitedWithCode": "终端进程已终止,退出代码: {0}", "terminal.integrated.waitOnExit": "按任意键以关闭终端", "terminal.integrated.launchFailed": "终端进程命令“{0} {1}”无法启动 (退出代码: {2})", "terminal.integrated.launchFailedExtHost": "无法启动终端进程 (退出代码: {0})" diff --git a/i18n/chs/src/vs/workbench/parts/terminal/electron-browser/terminalPanel.i18n.json b/i18n/chs/src/vs/workbench/parts/terminal/electron-browser/terminalPanel.i18n.json index 8d23d442d1..0ee179e073 100644 --- a/i18n/chs/src/vs/workbench/parts/terminal/electron-browser/terminalPanel.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/terminal/electron-browser/terminalPanel.i18n.json @@ -6,6 +6,8 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "terminal.useMonospace": "使用 \"monospace\"", + "terminal.monospaceOnly": "终端只支持等宽字体。", "copy": "复制", "split": "拆分", "paste": "粘贴", diff --git a/i18n/chs/src/vs/workbench/parts/trust/electron-browser/unsupportedWorkspaceSettings.contribution.i18n.json b/i18n/chs/src/vs/workbench/parts/trust/electron-browser/unsupportedWorkspaceSettings.contribution.i18n.json index a2e6a7e208..7085e9750e 100644 --- a/i18n/chs/src/vs/workbench/parts/trust/electron-browser/unsupportedWorkspaceSettings.contribution.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/trust/electron-browser/unsupportedWorkspaceSettings.contribution.i18n.json @@ -6,7 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "unsupportedWorkspaceSettings": "此工作区包含仅可在“用户设置”中配置的设置 ({0})。单击[这里]({1})了解更多信息。", "openWorkspaceSettings": "打开工作区设置", - "dontShowAgain": "不再显示" + "dontShowAgain": "不再显示", + "unsupportedWorkspaceSettings": "此工作区包含仅可在“用户设置”中配置的设置 ({0})。单击[这里]({1})了解更多信息。" } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/update/electron-browser/update.i18n.json b/i18n/chs/src/vs/workbench/parts/update/electron-browser/update.i18n.json index 0020728737..34456c16f6 100644 --- a/i18n/chs/src/vs/workbench/parts/update/electron-browser/update.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/update/electron-browser/update.i18n.json @@ -20,7 +20,7 @@ "later": "稍后", "updateAvailable": "现有更新可用: {0} {1}", "installUpdate": "安装更新", - "updateInstalling": "{0} {1} 正在后台安装,我们会在完成后通知您。", + "updateInstalling": "正在后台安装 {0} {1},我们将在完成后通知您。 ", "updateAvailableAfterRestart": "重新启动 {0} 即可应用最新更新。", "updateNow": "立即更新", "commandPalette": "命令面板...", diff --git a/i18n/chs/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThrough.contribution.i18n.json b/i18n/chs/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThrough.contribution.i18n.json index e83d441844..a92999a946 100644 --- a/i18n/chs/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThrough.contribution.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThrough.contribution.i18n.json @@ -7,6 +7,5 @@ "Do not edit this file. It is machine generated." ], "walkThrough.editor.label": "交互式演练场", - "help": "帮助", - "interactivePlayground": "交互式演练场" + "help": "帮助" } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/services/bulkEdit/electron-browser/bulkEditService.i18n.json b/i18n/chs/src/vs/workbench/services/bulkEdit/electron-browser/bulkEditService.i18n.json new file mode 100644 index 0000000000..25c5845179 --- /dev/null +++ b/i18n/chs/src/vs/workbench/services/bulkEdit/electron-browser/bulkEditService.i18n.json @@ -0,0 +1,13 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "summary.0": "未做编辑", + "summary.nm": "在 {1} 个文件中进行了 {0} 次编辑", + "summary.n0": "在 1 个文件中进行了 {0} 次编辑", + "conflict": "这些文件也已同时更改: {0}" +} \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/services/configuration/common/configurationExtensionPoint.i18n.json b/i18n/chs/src/vs/workbench/services/configuration/common/configurationExtensionPoint.i18n.json index 2a9a723944..a70b9a7b93 100644 --- a/i18n/chs/src/vs/workbench/services/configuration/common/configurationExtensionPoint.i18n.json +++ b/i18n/chs/src/vs/workbench/services/configuration/common/configurationExtensionPoint.i18n.json @@ -16,6 +16,7 @@ "vscode.extension.contributes.configuration": "用于配置字符串。", "invalid.title": "configuration.title 必须是字符串", "invalid.properties": "configuration.properties 必须是对象", + "invalid.property": "\"configuration.property\" 必须是对象", "invalid.allOf": "\"configuration.allOf\" 已被弃用且不应被使用。你可以将多个配置单元作为数组传递给 \"configuration\" 参与点。", "workspaceConfig.folders.description": "将载入到工作区的文件夹列表。", "workspaceConfig.path.description": "文件路径。例如 \"/root/folderA\" 或 \"./folderA\"。后者表示根据工作区文件位置进行解析的相对路径。", diff --git a/i18n/chs/src/vs/workbench/services/configurationResolver/electron-browser/configurationResolverService.i18n.json b/i18n/chs/src/vs/workbench/services/configurationResolver/electron-browser/configurationResolverService.i18n.json index a6ae2efb80..de10b1f332 100644 --- a/i18n/chs/src/vs/workbench/services/configurationResolver/electron-browser/configurationResolverService.i18n.json +++ b/i18n/chs/src/vs/workbench/services/configurationResolver/electron-browser/configurationResolverService.i18n.json @@ -6,16 +6,5 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "canNotResolveWorkspaceFolderMultiRoot": "无法在多文件夹工作区中解析 \"${workspaceFolder}\"。使用 \":\" 和工作区文件夹名称来限定此变量的作用域。", - "canNotResolveWorkspaceFolder": "无法解析 \"${workspaceFolder}\"。请打开一个文件夹。", - "canNotResolveFolderBasenameMultiRoot": "无法在多文件夹工作区中解析 \"${workspaceFolderBasename}\"。使用 \":\" 和工作区文件夹名称来限定此变量的作用域。", - "canNotResolveFolderBasename": "无法解析 \"${workspaceFolderBasename}\"。请打开一个文件夹。", - "canNotResolveLineNumber": "无法解析 \"${lineNumber}\"。请打开一个编辑器。", - "canNotResolveSelectedText": "无法解析 \"${selectedText}\"。请打开一个编辑器。", - "canNotResolveFile": "无法解析 \"${file}\"。请打开一个编辑器。", - "canNotResolveRelativeFile": "无法解析 \"${relativeFile}\"。请打开一个编辑器。", - "canNotResolveFileDirname": "无法解析 \"${fileDirname}\"。请打开一个编辑器。", - "canNotResolveFileExtname": "无法解析 \"${fileExtname}\"。请打开一个编辑器。", - "canNotResolveFileBasename": "无法解析 \"${fileBasename}\"。请打开一个编辑器。", - "canNotResolveFileBasenameNoExtension": "无法解析 \"${fileBasenameNoExtension}\"。请打开一个编辑器。" + "stringsOnlySupported": "命令 {0} 未返回字符串结果。若命令用于替换变量,其结果仅支持字符串。" } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/services/files/electron-browser/remoteFileService.i18n.json b/i18n/chs/src/vs/workbench/services/files/electron-browser/remoteFileService.i18n.json index e9201b69a5..fd921c221b 100644 --- a/i18n/chs/src/vs/workbench/services/files/electron-browser/remoteFileService.i18n.json +++ b/i18n/chs/src/vs/workbench/services/files/electron-browser/remoteFileService.i18n.json @@ -6,6 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "invalidPath": "资源“{0}”的路径必须是绝对路径", "fileNotFoundError": "找不到文件({0})", "fileIsDirectoryError": "文件是目录", "fileNotModifiedError": "自以下时间未修改的文件:", diff --git a/i18n/cht/extensions/configuration-editing/out/extension.i18n.json b/i18n/cht/extensions/configuration-editing/out/extension.i18n.json index 62c981f56d..3a0394cf19 100644 --- a/i18n/cht/extensions/configuration-editing/out/extension.i18n.json +++ b/i18n/cht/extensions/configuration-editing/out/extension.i18n.json @@ -6,5 +6,16 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "workspaceFolder": "在 VS Code 中已開啟的資料夾路徑", + "workspaceFolderBasename": "在 VS Code 內已開啟的資料夾名稱,不包含任何斜線 (/)", + "relativeFile": "目前已開啟與 ${workspaceFolder} 相關的檔案", + "file": "目前已開啟的檔案", + "cwd": "啟用時工作執行器目前工作目錄", + "lineNumber": "在使用中的檔案內目前已選取的行數", + "selectedText": "在使用中的檔案內目前已選取的文字", + "fileDirname": "目前已開啟檔案的 dirname", + "fileExtname": "目前已開啟檔案的副檔名", + "fileBasename": "目前已開啟檔案的 basename", + "fileBasenameNoExtension": "目前已開啟檔案的 basename,不包含副檔名", "exampleExtension": "範例" } \ No newline at end of file diff --git a/i18n/cht/extensions/git/out/commands.i18n.json b/i18n/cht/extensions/git/out/commands.i18n.json index f6af72bc7e..f99c465da1 100644 --- a/i18n/cht/extensions/git/out/commands.i18n.json +++ b/i18n/cht/extensions/git/out/commands.i18n.json @@ -2,7 +2,7 @@ "": [ "--------------------------------------------------------------------------------------------", "Copyright (c) Microsoft Corporation. All rights reserved.", - "Licensed under the Source EULA. See License.txt in the project root for license information.", + "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], @@ -10,10 +10,12 @@ "remote branch at": "位於 {0} 的遠端分支", "create branch": "$(plus) 建立新的分支", "repourl": "儲存庫 URL", - "parent": "父目錄", + "selectFolder": "選擇儲存庫位置", "cloning": "正在複製 git 存放庫 '{0}'...", - "openrepo": "開啟儲存庫", "proposeopen": "要開啟複製的儲存庫嗎?", + "openrepo": "開啟儲存庫", + "add": "新增到工作區", + "proposeopen2": "要開啟以複製的儲存庫, 或將其新增到目前工作區?", "init": "選擇工作區資料夾以初始化 git 儲存庫", "init repo": "初始化儲存庫", "create repo": "初始化儲存庫", diff --git a/i18n/cht/extensions/git/out/repository.i18n.json b/i18n/cht/extensions/git/out/repository.i18n.json index 828c263d73..990e6a08e6 100644 --- a/i18n/cht/extensions/git/out/repository.i18n.json +++ b/i18n/cht/extensions/git/out/repository.i18n.json @@ -26,7 +26,7 @@ "commitMessage": "訊息 (按 {0} 以認可)", "commit": "認可", "merge changes": "合併變更", - "staged changes": "已分段的變更", + "staged changes": "暫存的變更", "changes": "變更", "commitMessageCountdown": "在目前行數剩餘 {0} 個字元", "commitMessageWarning": "在目前行數有 {0} 個字元已超過 {1} 個", diff --git a/i18n/cht/extensions/npm/out/npmView.i18n.json b/i18n/cht/extensions/npm/out/npmView.i18n.json index 0fcedab1eb..1053101f61 100644 --- a/i18n/cht/extensions/npm/out/npmView.i18n.json +++ b/i18n/cht/extensions/npm/out/npmView.i18n.json @@ -6,6 +6,9 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "npm.noDebugOptions": "因為指令碼缺少節點偵錯選項 (例如 '--inspect-brk'),所以無法啟動 \"{0}\" 以進行偵錯。", - "npm.scriptInvalid": "找不到指令碼 \"{0}\"。請嘗試重新整理檢視。" + "noScripts": "找不到指令碼", + "noDebugOptions": "因為指令碼缺少節點偵錯選項 (例如 '--inspect-brk'),所以無法啟動 \"{0}\" 以進行偵錯。", + "learnMore": "深入了解", + "ok": "確定", + "scriptInvalid": "找不到指令碼 \"{0}\"。請嘗試重新整理檢視。" } \ No newline at end of file diff --git a/i18n/cht/extensions/npm/package.i18n.json b/i18n/cht/extensions/npm/package.i18n.json index 6a4c442541..e1e497559e 100644 --- a/i18n/cht/extensions/npm/package.i18n.json +++ b/i18n/cht/extensions/npm/package.i18n.json @@ -12,15 +12,15 @@ "config.npm.runSilent": "以 `--silent` 選項執行 npm 命令。 ", "config.npm.packageManager": "用來執行指令碼的套件管理員。", "config.npm.exclude": "為應從自動指令碼偵測排除的資料夾設定 Glob 模式。", - "config.npm.enableScriptExplorer": "當工作區包含 'package.json' 檔案時,啟用 npm 指令碼的總管檢視。", + "config.npm.enableScriptExplorer": "啟用 npm 指令碼的總管檢視。", + "config.npm.scriptExplorerAction": "指令碼總管中預設按一下行為: 'open' 或 'run', 預設值為 'open'。", "npm.parseError": "Npm 工作刪除: 解析檔案 {0} 失敗", "taskdef.script": "要自訂的 npm 指令碼。", - "taskdef.path": "提供指令碼之 package.json 檔案的資料夾路徑。可以省略。", + "taskdef.path": "提供指令碼 package.json 檔案的資料夾路徑。可以省略。", "view.name": "Npm 指令碼", "command.refresh": "重新整理", "command.run": "執行", "command.debug": "偵錯", "command.openScript": "開啟", - "npm.scriptInvalid": "找不到指令碼 '{0}'。請嘗試重新整理檢視。", - "npm.noDebugOptions": "因為指令碼缺少節點偵錯選項 (例如 '--inspect-brk'),所以無法啟動 '{0}' 以進行偵錯。" + "command.runInstall": "執行安裝" } \ No newline at end of file diff --git a/i18n/cht/extensions/search-rg/package.i18n.json b/i18n/cht/extensions/search-rg/package.i18n.json new file mode 100644 index 0000000000..36c540fd95 --- /dev/null +++ b/i18n/cht/extensions/search-rg/package.i18n.json @@ -0,0 +1,11 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "displayName": "搜尋 (ripgrep)", + "description": "使用 Ripgrep 提供搜尋。" +} \ No newline at end of file diff --git a/i18n/cht/extensions/typescript-language-features/out/features/updatePathsOnRename.i18n.json b/i18n/cht/extensions/typescript-language-features/out/features/updatePathsOnRename.i18n.json new file mode 100644 index 0000000000..b379c372c3 --- /dev/null +++ b/i18n/cht/extensions/typescript-language-features/out/features/updatePathsOnRename.i18n.json @@ -0,0 +1,14 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "prompt": "自動更新已移動檔案的匯入: '{0}' 嗎?", + "reject.title": "否", + "accept.title": "是", + "always.title": "是,一律更新匯入", + "never.title": "否,一律不更新匯入" +} \ No newline at end of file diff --git a/i18n/cht/extensions/typescript-language-features/package.i18n.json b/i18n/cht/extensions/typescript-language-features/package.i18n.json index c7a5d0d5e9..efbb6f7c43 100644 --- a/i18n/cht/extensions/typescript-language-features/package.i18n.json +++ b/i18n/cht/extensions/typescript-language-features/package.i18n.json @@ -8,8 +8,7 @@ ], "displayName": "TypeScript 和 JavaScript 語言功能", "description": "為 JavaScript 和 TypeScript 提供豐富的語言支援。", - "typescript.reloadProjects.title": "重新載入專案", - "javascript.reloadProjects.title": "重新載入專案", + "reloadProjects.title": "重新載入專案", "configuration.typescript": "TypeScript", "typescript.useCodeSnippetsOnMethodSuggest.dec": "使用其參數簽章完成函式。", "typescript.tsdk.desc": "指定資料夾路徑,其中包含要使用的 tsserver 和 lib*.d.ts 檔案。", @@ -37,8 +36,7 @@ "format.placeOpenBraceOnNewLineForFunctions": "定義是否將左大括弧放入函式的新行。", "format.placeOpenBraceOnNewLineForControlBlocks": "定義是否將左大括弧放入控制區塊的新行。", "javascript.validate.enable": "啟用/停用 JavaScript 驗證。", - "typescript.goToProjectConfig.title": "移至專案組態", - "javascript.goToProjectConfig.title": "移至專案組態", + "goToProjectConfig.title": "移至專案組態", "javascript.referencesCodeLens.enabled": "在JavaScript檔案啟用/停用 參考CodeLens ", "typescript.referencesCodeLens.enabled": "在TypeScript檔案啟用/停用CodeLens參考。需要TypeScript>=2.0.6。", "typescript.implementationsCodeLens.enabled": "啟用/停用實作 CodeLens。需要 TypeScript >= 2.2.0。", @@ -47,7 +45,7 @@ "typescript.selectTypeScriptVersion.title": "選取 TypeScript 版本", "typescript.reportStyleChecksAsWarnings": "使用警告顯示樣式檢查", "jsDocCompletion.enabled": "啟用/停用自動 JSDoc 註解", - "javascript.implicitProjectConfig.checkJs": "啟用/停用 JavaScript 檔案的語意檢查。現有的 jsconfig.json 或 tsconfig.json 檔案會覆寫此設定。需要 TypeScript >=2.3.1。", + "javascript.implicitProjectConfig.checkJs": "啟用/停用 JavaScript 檔案的語義檢查。現有的 jsconfig.json或 tsconfig.json 檔案會覆寫此設定。需要 TypeScript >= 2.3.1。", "typescript.npm": "指定用於自動類型取得的 NPM 可執行檔路徑。TypeScript 必須 >= 2.3.4.", "typescript.check.npmIsInstalled": "檢查是否已安裝NPM用以取得自動類型擷取.", "javascript.nameSuggestions": "從JavaScript推薦表檔案中啟用/停用包含唯一檔名", @@ -55,11 +53,15 @@ "typescript.problemMatchers.tsc.label": "TypeScript 問題", "typescript.problemMatchers.tscWatch.label": " TypeScript 問題 (監看模式)", "typescript.quickSuggestionsForPaths": "啟用/停用在輸入匯入路徑顯示即時建議。", - "typescript.locale": "設定報告 TypeScript 錯誤的語系。需要 TypeScript >= 2.6.0。預設值 'null' 則使用 VS Code 的語系來顯示 TypeScript 錯誤。", - "javascript.implicitProjectConfig.experimentalDecorators": "啟用/停用 JavaScript 檔案中非專案部分的 'experimentalDecorators'。現有的 jsconfig.json 或 tsconfig.json 檔案會覆寫此設定。需要 TypeScript >=2.3.1。", + "typescript.locale": "進行用來回報 JavaScript 和 TypeScript 錯誤的地區設定。需要 TypeScript >= 2.6.0。'null' 預設會使用 VS Code 的地區設定。", + "javascript.implicitProjectConfig.experimentalDecorators": "啟用/停用不屬於專案之 JavaScript 檔案的'experimentalDecorators'。現有的 jsconfig.json 或 tsconfig.json 檔案會覆寫此設定。需要 TypeScript >= 2.3.1。", "typescript.autoImportSuggestions.enabled": "啟用/停用 自動匯入建議。需要 TypeScript >=2.6.1", "typescript.experimental.syntaxFolding": "啟用/停用語法感知摺疊標記。", "taskDefinition.tsconfig.description": "定義 TS 組建的 tsconfig 檔案。", "javascript.suggestionActions.enabled": "編輯器內啟用/停用 JavaScript 檔案建議診斷。需要 TypeScript >= 2.8", - "typescript.suggestionActions.enabled": "編輯器內啟用/停用 TypeScript 檔案建議診斷。需要 TypeScript >= 2.8" + "typescript.suggestionActions.enabled": "啟用/停用 編輯器內的 TypeScript 檔案建議診斷。需要 TypeScript >= 2.8", + "typescript.preferences.quoteStyle": "用於快速修正的偏好引號樣式: 'single' (單) 引號、'double' (雙) 引號或從現有匯入 'auto' (自動) 推斷引號類型。需要 TypeScript >= 2.9", + "typescript.preferences.importModuleSpecifier": "自動匯入的偏好路徑樣式:\n- \"relative\" (相對) 於檔案路徑。\n- \"non-relative\" (非相對),根據在您 'jsconfig.json' / 'tsconfig.json' 中設定的 'baseUrl'。\n- \"auto\" (自動) 推斷最短的路徑類型。\n需要 TypeScript >= 2.9", + "typescript.showUnused": "啟用/停用 高亮顯示在程式碼中未使用的變數。需要 TypeScript >= 2.9", + "typescript.updateImportsOnFileMove.enabled": "當您在 VS Code 中重新命名或移動檔案時,啟用/停用自動更新匯入路徑。可使用的值為: 'prompt' 每次重新命名時, 'always' 自動更新路徑, 'never' 重新命名路徑且不再提示我。需要TypeScript >= 2.9" } \ No newline at end of file diff --git a/i18n/cht/src/vs/base/node/processes.i18n.json b/i18n/cht/src/vs/base/node/processes.i18n.json index ccee9332e3..5989cf7897 100644 --- a/i18n/cht/src/vs/base/node/processes.i18n.json +++ b/i18n/cht/src/vs/base/node/processes.i18n.json @@ -2,9 +2,9 @@ "": [ "--------------------------------------------------------------------------------------------", "Copyright (c) Microsoft Corporation. All rights reserved.", - "Licensed under the Source EULA. See License.txt in the project root for license information.", + "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "TaskRunner.UNC": "無法在 UNC 磁碟機上執行 shell 命令。" + "TaskRunner.UNC": "無法在 UNC 磁碟機上執行殼層命令。" } \ No newline at end of file diff --git a/i18n/cht/src/vs/base/node/zip.i18n.json b/i18n/cht/src/vs/base/node/zip.i18n.json index a13062c166..12569f5c94 100644 --- a/i18n/cht/src/vs/base/node/zip.i18n.json +++ b/i18n/cht/src/vs/base/node/zip.i18n.json @@ -2,10 +2,10 @@ "": [ "--------------------------------------------------------------------------------------------", "Copyright (c) Microsoft Corporation. All rights reserved.", - "Licensed under the Source EULA. See License.txt in the project root for license information.", + "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "incompleteExtract": "未完成。已擷取 {0} 個項目 (共 {1} 個)", + "incompleteExtract": "未完成。已找到 {0} 個項目 (共 {1} 個)", "notFound": "在 ZIP 中找不到 {0}。" } \ No newline at end of file diff --git a/i18n/cht/src/vs/code/electron-browser/issue/issueReporterMain.i18n.json b/i18n/cht/src/vs/code/electron-browser/issue/issueReporterMain.i18n.json index ffe1fad498..bf13ad1020 100644 --- a/i18n/cht/src/vs/code/electron-browser/issue/issueReporterMain.i18n.json +++ b/i18n/cht/src/vs/code/electron-browser/issue/issueReporterMain.i18n.json @@ -6,6 +6,8 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "hide": "隱藏", + "show": "顯示", "previewOnGitHub": "在 GitHub 預覽", "loadingData": "正在載入資料...", "rateLimited": "超出了 GitHub 查詢限制。請稍候。", diff --git a/i18n/cht/src/vs/code/electron-browser/issue/issueReporterPage.i18n.json b/i18n/cht/src/vs/code/electron-browser/issue/issueReporterPage.i18n.json index 7983416d3d..59aba8fe08 100644 --- a/i18n/cht/src/vs/code/electron-browser/issue/issueReporterPage.i18n.json +++ b/i18n/cht/src/vs/code/electron-browser/issue/issueReporterPage.i18n.json @@ -17,13 +17,12 @@ "issueTitleLabel": "標題", "issueTitleRequired": "請輸入標題。", "titleLengthValidation": "標題太長。", - "systemInfo": "我的系統資訊", - "sendData": "傳送我的資料", - "processes": "目前執行的程序", - "workspaceStats": "我的工作區統計資料", - "extensions": "我的擴充功能", - "searchedExtensions": "搜尋過的擴充功能", - "settingsSearchDetails": "設定值搜尋詳細資料", "details": "請輸入詳細資料。", - "loadingData": "正在載入資料..." + "sendSystemInfo": "包含我的系統資訊 ({0})", + "show": "顯示", + "sendProcessInfo": "包含我目前正在執行的程序 ({0})", + "sendWorkspaceInfo": "包含我的工作區詮釋資料 ({0})", + "sendExtensions": "包含我已啟用擴充功能 ({0})", + "sendSearchedExtensions": "傳送已搜尋的擴充功能 ({0})", + "sendSettingsSearchDetails": "傳送設置搜尋詳細資料 ({0})" } \ No newline at end of file diff --git a/i18n/cht/src/vs/code/electron-browser/processExplorer/processExplorerMain.i18n.json b/i18n/cht/src/vs/code/electron-browser/processExplorer/processExplorerMain.i18n.json index 00f7c8ffb1..5c87f72231 100644 --- a/i18n/cht/src/vs/code/electron-browser/processExplorer/processExplorerMain.i18n.json +++ b/i18n/cht/src/vs/code/electron-browser/processExplorer/processExplorerMain.i18n.json @@ -11,5 +11,7 @@ "pid": "pid", "name": "名稱", "killProcess": "關閉處理序", - "forceKillProcess": "強制關閉處理序" + "forceKillProcess": "強制關閉處理序", + "copy": "複製", + "copyAll": "全部複製" } \ No newline at end of file diff --git a/i18n/cht/src/vs/code/electron-main/menus.i18n.json b/i18n/cht/src/vs/code/electron-main/menus.i18n.json index ea090563a4..8c57eb9690 100644 --- a/i18n/cht/src/vs/code/electron-main/menus.i18n.json +++ b/i18n/cht/src/vs/code/electron-main/menus.i18n.json @@ -88,7 +88,6 @@ "miToggleDebugConsole": "偵錯主控台(&&B)", "miToggleIntegratedTerminal": "整合式終端機(&&I)", "miMarker": "問題(&&P)", - "miAdditionalViews": "其他檢視(&&V)", "miCommandPalette": "命令選擇區(&&C)...", "miOpenView": "開啟檢視(&&O)...", "miToggleFullScreen": "切換全螢幕(&&F)", @@ -144,7 +143,7 @@ "miContinue": "繼續(&&C)", "miToggleBreakpoint": "切換中斷點(&&B)", "miConditionalBreakpoint": "條件式中斷點(&&C)...", - "miColumnBreakpoint": "資料行中斷點(&&O)", + "miInlineBreakpoint": "內嵌中斷點", "miFunctionBreakpoint": "函式中斷點(&&F}...", "miLogPoint": "&&記錄點...", "miNewBreakpoint": "新增中斷點(&&N)", diff --git a/i18n/cht/src/vs/editor/browser/widget/codeEditorWidget.i18n.json b/i18n/cht/src/vs/editor/browser/widget/codeEditorWidget.i18n.json new file mode 100644 index 0000000000..9ba9d8d6b8 --- /dev/null +++ b/i18n/cht/src/vs/editor/browser/widget/codeEditorWidget.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "cursors.maximum": "游標數已限制為 {0} 個。" +} \ No newline at end of file diff --git a/i18n/cht/src/vs/editor/common/config/commonEditorConfig.i18n.json b/i18n/cht/src/vs/editor/common/config/commonEditorConfig.i18n.json index 114d264012..f7ddabf001 100644 --- a/i18n/cht/src/vs/editor/common/config/commonEditorConfig.i18n.json +++ b/i18n/cht/src/vs/editor/common/config/commonEditorConfig.i18n.json @@ -26,6 +26,7 @@ "detectIndentation": "開啟檔案時,會依據檔案內容來偵測 `editor.tabSize` 及 `editor.insertSpaces`。", "roundedSelection": "控制選取範圍是否有圓角", "scrollBeyondLastLine": "控制編輯器是否會捲動到最後一行之後", + "scrollBeyondLastColumn": "控制編輯器水平捲動所超出的額外字元數", "smoothScrolling": "控制編輯器是否會使用動畫捲動", "minimap.enabled": "控制是否會顯示迷你地圖", "minimap.side": "控制要在哪端呈現迷你地圖。", @@ -41,12 +42,12 @@ "wordWrap.bounded": "當檢視區縮至最小並設定 'editor.wordWrapColumn' 時換行。", "wordWrap": "控制是否自動換行。可以是:\n - 'off' (停用換行),\n - 'on' (檢視區換行),\n - 'wordWrapColumn' (於 'editor.wordWrapColumn' 換行`) 或\n - 'bounded' (當檢視區縮至最小並設定 'editor.wordWrapColumn' 時換行).", "wordWrapColumn": "當 `editor.wordWrap` 為 [wordWrapColumn] 或 [bounded] 時,控制編輯器中的資料行換行。", - "wrappingIndent": "控制換行的縮排。可以是 [無]、[相同] 或 [縮排]。", + "wrappingIndent": "控制換行的縮排。可以是 'none'、'same' 或 'deepIndent'。", "mouseWheelScrollSensitivity": "滑鼠滾輪捲動事件的 'deltaX' 與 'deltaY' 所使用的乘數", "multiCursorModifier.ctrlCmd": "對應 Windows 和 Linux 的 `Control` 與對應 macOS 的 `Command`", "multiCursorModifier.alt": "對應 Windows 和 Linux 的 `Alt` 與對應 macOS 的 `Option`", "multiCursorModifier": "用於新增多個滑鼠游標的修改。 `ctrlCmd` 會對應到 Windows 和 Linux 上的 `Control` 以及 macOS 上的 `Command`。 [移至定義] 及 [開啟連結] 滑鼠手勢將會適應以避免和 multicursor 修改衝突。", - "multiCursorMergeOverlapping": "在重疊時合併多個游標。", + "multiCursorMergeOverlapping": "在多個游標重疊時將其合併。", "quickSuggestions.strings": "允許在字串內顯示即時建議。", "quickSuggestions.comments": "允許在註解中顯示即時建議。", "quickSuggestions.other": "允許在字串與註解以外之處顯示即時建議。", diff --git a/i18n/cht/src/vs/editor/common/view/editorColorRegistry.i18n.json b/i18n/cht/src/vs/editor/common/view/editorColorRegistry.i18n.json index be0985019e..66736a4e73 100644 --- a/i18n/cht/src/vs/editor/common/view/editorColorRegistry.i18n.json +++ b/i18n/cht/src/vs/editor/common/view/editorColorRegistry.i18n.json @@ -32,6 +32,7 @@ "infoBorder": "編輯器內資訊提示線的邊框色彩", "hintForeground": "編輯器內提示訊息的提示線前景色彩", "hintBorder": "編輯器內提示訊息的提示線邊框色彩", + "unnecessaryForeground": "編輯器中不必要程式碼的前景色彩。", "overviewRulerRangeHighlight": "概述反白範圍的尺規標記顏色。不能使用非透明的顏色來隱藏底層的樣式。", "overviewRuleError": "錯誤的概觀尺規標記色彩。", "overviewRuleWarning": "警示的概觀尺規標記色彩。", diff --git a/i18n/cht/src/vs/editor/contrib/fontZoom/fontZoom.i18n.json b/i18n/cht/src/vs/editor/contrib/fontZoom/fontZoom.i18n.json new file mode 100644 index 0000000000..105a545c25 --- /dev/null +++ b/i18n/cht/src/vs/editor/contrib/fontZoom/fontZoom.i18n.json @@ -0,0 +1,12 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "EditorFontZoomIn.label": "編輯器字體放大", + "EditorFontZoomOut.label": "編輯器字型縮小", + "EditorFontZoomReset.label": "編輯器字體重設縮放" +} \ No newline at end of file diff --git a/i18n/cht/src/vs/editor/contrib/goToDefinition/goToDefinitionCommands.i18n.json b/i18n/cht/src/vs/editor/contrib/goToDefinition/goToDefinitionCommands.i18n.json new file mode 100644 index 0000000000..0a7549d729 --- /dev/null +++ b/i18n/cht/src/vs/editor/contrib/goToDefinition/goToDefinitionCommands.i18n.json @@ -0,0 +1,25 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "noResultWord": "找不到 '{0}' 的定義", + "generic.noResults": "找不到任何定義", + "meta.title": " - {0} 個定義", + "actions.goToDecl.label": "移至定義", + "actions.goToDeclToSide.label": "在一側開啟定義", + "actions.previewDecl.label": "預覽定義", + "goToImplementation.noResultWord": "找不到 '{0}' 的任何實作", + "goToImplementation.generic.noResults": "找不到任何實作", + "meta.implementations.title": " – {0} 個實作", + "actions.goToImplementation.label": "前往實作", + "actions.peekImplementation.label": "預覽實作", + "goToTypeDefinition.noResultWord": "找不到 '{0}' 的任何類型定義", + "goToTypeDefinition.generic.noResults": "找不到任何類型定義", + "meta.typeDefinitions.title": " – {0} 個定義", + "actions.goToTypeDefinition.label": "移至類型定義", + "actions.peekTypeDefinition.label": "預覽類型定義" +} \ No newline at end of file diff --git a/i18n/cht/src/vs/editor/contrib/goToDefinition/goToDefinitionMouse.i18n.json b/i18n/cht/src/vs/editor/contrib/goToDefinition/goToDefinitionMouse.i18n.json new file mode 100644 index 0000000000..b2fa307e48 --- /dev/null +++ b/i18n/cht/src/vs/editor/contrib/goToDefinition/goToDefinitionMouse.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "multipleResults": "按一下以顯示 {0} 項定義。" +} \ No newline at end of file diff --git a/i18n/cht/src/vs/editor/contrib/gotoError/gotoError.i18n.json b/i18n/cht/src/vs/editor/contrib/gotoError/gotoError.i18n.json index 16f57c4919..1f04d3d0a9 100644 --- a/i18n/cht/src/vs/editor/contrib/gotoError/gotoError.i18n.json +++ b/i18n/cht/src/vs/editor/contrib/gotoError/gotoError.i18n.json @@ -7,5 +7,7 @@ "Do not edit this file. It is machine generated." ], "markerAction.next.label": "移至下一個問題 (錯誤, 警告, 資訊)", - "markerAction.previous.label": "移至上一個問題 (錯誤, 警告, 資訊)" + "markerAction.previous.label": "移至上一個問題 (錯誤, 警告, 資訊)", + "markerAction.nextInFiles.label": "移至檔案裡面的下一個問題 (錯誤, 警告, 資訊)", + "markerAction.previousInFiles.label": "移至檔案裡面的上一個問題 (錯誤, 警告, 資訊)" } \ No newline at end of file diff --git a/i18n/cht/src/vs/editor/contrib/indentation/indentation.i18n.json b/i18n/cht/src/vs/editor/contrib/indentation/indentation.i18n.json index ff91f0d0ac..8772f166d1 100644 --- a/i18n/cht/src/vs/editor/contrib/indentation/indentation.i18n.json +++ b/i18n/cht/src/vs/editor/contrib/indentation/indentation.i18n.json @@ -13,5 +13,6 @@ "indentUsingTabs": "使用 Tab 進行縮排", "indentUsingSpaces": "使用空格鍵進行縮排", "detectIndentation": "偵測內容中的縮排", - "editor.reindentlines": "重新將行縮排" + "editor.reindentlines": "重新將行縮排", + "editor.reindentselectedlines": "重新將選取的行縮排" } \ No newline at end of file diff --git a/i18n/cht/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json b/i18n/cht/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json index e135a1089b..a2cc538e14 100644 --- a/i18n/cht/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json +++ b/i18n/cht/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json @@ -25,8 +25,6 @@ "uninstallDependeciesConfirmation": "只要將 '{0}' 解除安裝,或要包含其相依性?", "uninstallOnly": "僅擴充功能", "uninstallAll": "全部解除安裝", - "uninstallConfirmation": "確定要將 '{0}' 解除安裝嗎?", - "ok": "確定", "singleDependentError": "無法將延伸模組 '{0}' 解除安裝。其為延伸模組 '{1}' 的相依對象。", "twoDependentsError": "無法將延伸模組 '{0}' 解除安裝。其為延伸模組 '{1}' 及 '{2}' 的相依對象。", "multipleDependentsError": "無法將延伸模組 '{0}' 解除安裝。其為 '{1}'、'{2}' 及其他延伸模組的相依對象。", diff --git a/i18n/cht/src/vs/platform/node/minimalTranslations.i18n.json b/i18n/cht/src/vs/platform/node/minimalTranslations.i18n.json new file mode 100644 index 0000000000..971b2c9497 --- /dev/null +++ b/i18n/cht/src/vs/platform/node/minimalTranslations.i18n.json @@ -0,0 +1,13 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "showLanguagePackExtensions": "VS Code 可在 {0} 中使用。在 Marketplace 中搜尋語言套件以開始使用。", + "searchMarketplace": "搜尋市集", + "installAndRestartMessage": "VS Code 可在 {0} 中使用。安裝語言套件以開始使用。必須重新啟動。 ", + "installAndRestart": "安裝並重新啟動" +} \ No newline at end of file diff --git a/i18n/cht/src/vs/platform/theme/common/colorRegistry.i18n.json b/i18n/cht/src/vs/platform/theme/common/colorRegistry.i18n.json index 0f68abf509..790929bd61 100644 --- a/i18n/cht/src/vs/platform/theme/common/colorRegistry.i18n.json +++ b/i18n/cht/src/vs/platform/theme/common/colorRegistry.i18n.json @@ -2,7 +2,7 @@ "": [ "--------------------------------------------------------------------------------------------", "Copyright (c) Microsoft Corporation. All rights reserved.", - "Licensed under the Source EULA. See License.txt in the project root for license information.", + "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], @@ -16,7 +16,7 @@ "selectionBackground": "作業區域選取的背景顏色(例如輸入或文字區域)。請注意,這不適用於編輯器中的選取。", "textSeparatorForeground": "文字分隔符號的顏色。", "textLinkForeground": "內文連結的前景色彩", - "textLinkActiveForeground": "內文使用連結的前景色彩", + "textLinkActiveForeground": "當滑鼠點擊或懸停時,文字中連結的前景色彩。", "textPreformatForeground": "提示及建議文字的前景色彩。", "textBlockQuoteBackground": "文內引用區塊背景色彩。", "textBlockQuoteBorder": "引用文字的框線顏色。", @@ -48,6 +48,8 @@ "listDropBackground": "使用滑鼠四處移動項目時的清單/樹狀拖放背景。", "highlight": "在清單/樹狀內搜尋時,相符醒目提示的清單/樹狀前景色彩。", "invalidItemForeground": "列表/樹狀 無效項目的前景色彩,例如在瀏覽視窗無法解析的根目錄", + "listErrorForeground": "包含錯誤清單項目的前景色彩", + "listWarningForeground": "包含警告清單項目的前景色彩", "pickerGroupForeground": "分組標籤的快速選擇器色彩。", "pickerGroupBorder": "分組邊界的快速選擇器色彩。", "buttonForeground": "按鈕前景色彩。", @@ -58,7 +60,7 @@ "scrollbarShadow": "指出在捲動該檢視的捲軸陰影。", "scrollbarSliderBackground": "捲軸滑桿的背景顏色。", "scrollbarSliderHoverBackground": "動態顯示時捲軸滑桿的背景顏色。", - "scrollbarSliderActiveBackground": "使用中狀態下捲軸滑桿的背景顏色。", + "scrollbarSliderActiveBackground": "當點擊時捲軸滑桿的背景顏色。", "progressBarBackground": "長時間運行進度條的背景色彩.", "editorBackground": "編輯器的背景色彩。", "editorForeground": "編輯器的預設前景色彩。", @@ -75,6 +77,7 @@ "editorFindMatchBorder": "符合目前搜尋的框線色彩。", "findMatchHighlightBorder": "符合其他搜尋的框線色彩。", "findRangeHighlightBorder": "限制搜尋範圍的邊框色彩。不能使用非透明的色彩來隱藏基礎樣式。", + "findWidgetResizeBorder": "尋找小工具的調整列的邊框顏色。", "hoverHighlight": "突顯懸停顯示的文字。不能使用非透明的顏色來隱藏底層的樣式。", "hoverBackground": "編輯器動態顯示的背景色彩。", "hoverBorder": "編輯器動態顯示的框線色彩。", diff --git a/i18n/cht/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.i18n.json b/i18n/cht/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.i18n.json index 71406e9116..16f83c3f14 100644 --- a/i18n/cht/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.i18n.json +++ b/i18n/cht/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.i18n.json @@ -6,5 +6,5 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "confirmUrl": "要允許 {0} 延伸模組開啟下列 URL 嗎?" + "confirmUrl": "允許擴充功能打開此 URL 嗎?" } \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json b/i18n/cht/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json index 768c89868b..c34b476a9e 100644 --- a/i18n/cht/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json +++ b/i18n/cht/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json @@ -8,13 +8,12 @@ ], "vscode.extension.contributes.views.containers.id": "用於識別可透過使用 'views' 參與點參與檢視之容器的唯一識別碼", "vscode.extension.contributes.views.containers.title": "用於轉譯容器的易讀字串", - "vscode.extension.contributes.views.containers.icon": "容器圖示的路徑。圖示為置於 50x40 正方形中央,且以 'rgb(215, 218, 224)' 或 '#d7dae0' 填滿顏色的 24x24 影像。雖然接受所有影像檔案類型,但建議使用 SVG 作為圖示格式。", + "vscode.extension.contributes.views.containers.icon": "容器圖示的路徑。圖示為置於 50x40 區塊中央,且以 'rgb(215, 218, 224)' 或 '#d7dae0' 填滿顏色的 24x24 影像。雖然接受所有影像檔案類型,但建議使用 SVG 作為圖示格式。", "vscode.extension.contributes.viewsContainers": "提供檢視容器給編輯者", "views.container.activitybar": "提供檢視容器給活動列", "test": "測試", - "proposed": "只有在 dev 不足,或使用下列命令列參數時才能使用 'viewsContainers' 參與: --enable-proposed-api {0}。", "requirearray": "檢視容器必須為陣列", - "requireidstring": "屬性 ‵{0}` 為必要項且必須為類型 `string`。僅允許英數字元字母、'_'、'-'。", + "requireidstring": "屬性 ‵{0}` 為必要項且必須為類型 `string`。僅允許英數字元、'_' 與 '-'。", "requirestring": "屬性 '{0}' 為強制項目且必須屬於 `string` 類型", "showViewlet": "顯示 {0}", "view": "檢視" diff --git a/i18n/cht/src/vs/workbench/browser/actions/workspaceActions.i18n.json b/i18n/cht/src/vs/workbench/browser/actions/workspaceActions.i18n.json index 2e6c1bb355..5b6aacb951 100644 --- a/i18n/cht/src/vs/workbench/browser/actions/workspaceActions.i18n.json +++ b/i18n/cht/src/vs/workbench/browser/actions/workspaceActions.i18n.json @@ -15,5 +15,5 @@ "saveWorkspace": "儲存工作區", "openWorkspaceAction": "開啟工作區...", "openWorkspaceConfigFile": "開啟工作區組態檔", - "openFolderAsWorkspaceInNewWindow": "在新視窗中開啟資料夾作為工作區" + "duplicateWorkspaceInNewWindow": "新視窗中的重覆工作區" } \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/browser/parts/panel/panelPart.i18n.json b/i18n/cht/src/vs/workbench/browser/parts/panel/panelPart.i18n.json index da0315770c..ac531363e0 100644 --- a/i18n/cht/src/vs/workbench/browser/parts/panel/panelPart.i18n.json +++ b/i18n/cht/src/vs/workbench/browser/parts/panel/panelPart.i18n.json @@ -1,8 +1,10 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the Source EULA. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ -// Do not edit this file. It is machine generated. { - "panelSwitcherBarAriaLabel": "使用中面板切換器" + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "hidePanel": "隱藏面板" } \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/browser/parts/quickopen/quickOpenController.i18n.json b/i18n/cht/src/vs/workbench/browser/parts/quickopen/quickOpenController.i18n.json index 8b734e6173..897db9ea26 100644 --- a/i18n/cht/src/vs/workbench/browser/parts/quickopen/quickOpenController.i18n.json +++ b/i18n/cht/src/vs/workbench/browser/parts/quickopen/quickOpenController.i18n.json @@ -6,8 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "inputModeEntryDescription": "{0} (按 'Enter' 鍵確認或按 'Esc' 鍵取消)", - "inputModeEntry": "按 'Enter' 鍵確認您的輸入或按 'Esc' 鍵取消", "emptyPicks": "沒有可挑選的項目", "quickOpenInput": "輸入 '?' 即可取得相關說明來了解您可以在這裡執行的動作", "historyMatches": "最近開啟的", diff --git a/i18n/cht/src/vs/workbench/browser/parts/views/viewsViewlet.i18n.json b/i18n/cht/src/vs/workbench/browser/parts/views/viewsViewlet.i18n.json index 5797555b68..dc9fcaff5a 100644 --- a/i18n/cht/src/vs/workbench/browser/parts/views/viewsViewlet.i18n.json +++ b/i18n/cht/src/vs/workbench/browser/parts/views/viewsViewlet.i18n.json @@ -6,5 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "cannot toggle": "無法為此檢視 {0} 切換可見度", + "cannot show": "無法顯示此檢視 {0},因為 'when' 條件而被隱藏", "hideView": "隱藏" } \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/common/theme.i18n.json b/i18n/cht/src/vs/workbench/common/theme.i18n.json index 204201ee4d..688a4dfcdb 100644 --- a/i18n/cht/src/vs/workbench/common/theme.i18n.json +++ b/i18n/cht/src/vs/workbench/common/theme.i18n.json @@ -11,8 +11,10 @@ "tabHoverBackground": "當暫留索引標籤的背景色彩。索引標籤是編輯器在編輯器區域中的容器。同一個編輯器群組中的多個索引標籤可以同時開啟。可能會有多個編輯器群組。", "tabUnfocusedHoverBackground": "當暫留非焦點群組中索引標籤的背景色彩。索引標籤是編輯器在編輯器區域中的容器。同一個編輯器群組中的多個索引標籤可以同時開啟。可能會有多個編輯器群組。 ", "tabBorder": "用以分隔索引標籤彼此的框線。索引標籤是編輯器在編輯器區域中的容器。同一個編輯器群組中的多個索引標籤可以同時開啟。可能會有多個編輯器群組。", - "tabActiveBorder": "用以醒目提示使用中索引標籤的框線。索引標籤是編輯器在編輯器區域中的容器。同一個編輯器群組中的多個索引標籤可以同時開啟。可能會有多個編輯器群組。", - "tabActiveUnfocusedBorder": "用以在非焦點群組中醒目提示使用中索引標籤的框線。索引標籤是編輯器在編輯器區域中的容器。同一個編輯器群組中的多個索引標籤可以同時開啟。可能會有多個編輯器群組。 ", + "tabActiveBorder": "使用中索引標籤的底部邊框。索引標籤是編輯器在編輯器區域中的容器。同一個編輯器群組中的多個索引標籤可以同時開啟。可能會有多個編輯器群組。", + "tabActiveBorderTop": "使用中索引標籤的頂部邊框。索引標籤是編輯器在編輯器區域中的容器。同一個編輯器群組中的多個索引標籤可以同時開啟。可能會有多個編輯器群組。", + "tabActiveUnfocusedBorder": "非焦點群組內使用中索引標籤的底部邊框。索引標籤是編輯器在編輯器區域中的容器。同一個編輯器群組中的多個索引標籤可以同時開啟。可能會有多個編輯器群組。", + "tabActiveUnfocusedBorderTop": "非焦點群組內使用中索引標籤的頂部邊框。索引標籤是編輯器在編輯器區域中的容器。同一個編輯器群組中的多個索引標籤可以同時開啟。可能會有多個編輯器群組。", "tabHoverBorder": "用以反白顯示暫留時索引標籤的框線。索引標籤是編輯器在編輯器區域中的容器。同一個編輯器群組中的多個索引標籤可以同時開啟。可能會有多個編輯器群組。", "tabUnfocusedHoverBorder": "在非焦點群組中反白顯示暫留時索引標籤的框線。索引標籤是編輯器在編輯器區域中的容器。同一個編輯器群組中的多個索引標籤可以同時開啟。可能會有多個編輯器群組。 ", "tabActiveForeground": "使用中的群組內,使用中之索引標籤的前景色彩。索引標籤是編輯器在編輯器區域中的容器。同一個編輯器群組中的多個索引標籤可以同時開啟。可能會有多個編輯器群組。", diff --git a/i18n/cht/src/vs/workbench/parts/codeEditor/electron-browser/largeFileOptimizations.i18n.json b/i18n/cht/src/vs/workbench/parts/codeEditor/electron-browser/largeFileOptimizations.i18n.json new file mode 100644 index 0000000000..b84306c506 --- /dev/null +++ b/i18n/cht/src/vs/workbench/parts/codeEditor/electron-browser/largeFileOptimizations.i18n.json @@ -0,0 +1,13 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "largeFile": "{0}: 為了減少記憶體使用量並避免凍結或毀損, 已關閉此大型檔的tokenization、包裝和摺疊功能。", + "neverShowAgain": "確定。不再顯示", + "removeOptimizations": "強制啟用功能", + "reopenFilePrompt": "請重新開啟檔案以便此設定生效。" +} \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/debug/browser/debugActions.i18n.json b/i18n/cht/src/vs/workbench/parts/debug/browser/debugActions.i18n.json index db1f1ef117..2e3194c9be 100644 --- a/i18n/cht/src/vs/workbench/parts/debug/browser/debugActions.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/debug/browser/debugActions.i18n.json @@ -41,7 +41,7 @@ "debugConsoleAction": "偵錯主控台", "unreadOutput": "偵錯主控台中的新輸出", "debugFocusConsole": "焦點偵錯主控台", - "focusProcess": "焦點處理序", + "focusSession": "焦點工作階段", "stepBackDebug": "倒退", "reverseContinue": "反向" } \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/debug/browser/debugCommands.i18n.json b/i18n/cht/src/vs/workbench/parts/debug/browser/debugCommands.i18n.json index bf5a70bd99..bdc1b18296 100644 --- a/i18n/cht/src/vs/workbench/parts/debug/browser/debugCommands.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/debug/browser/debugCommands.i18n.json @@ -7,7 +7,7 @@ "Do not edit this file. It is machine generated." ], "noFolderDebugConfig": "請先打開一個資料夾以便設定進階偵錯組態。", - "columnBreakpoint": "資料行中斷點", + "inlineBreakpoint": "內嵌中斷點", "debug": "偵錯", - "addColumnBreakpoint": "新增資料行中斷點" + "addInlineBreakpoint": "新增內嵌中斷點" } \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/debug/browser/debugEditorActions.i18n.json b/i18n/cht/src/vs/workbench/parts/debug/browser/debugEditorActions.i18n.json index 851e8cb449..cb02e0a3b9 100644 --- a/i18n/cht/src/vs/workbench/parts/debug/browser/debugEditorActions.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/debug/browser/debugEditorActions.i18n.json @@ -12,5 +12,7 @@ "runToCursor": "執行至游標處", "debugEvaluate": "偵錯: 評估", "debugAddToWatch": "偵錯: 加入監看", - "showDebugHover": "偵錯: 動態顯示" + "showDebugHover": "偵錯: 動態顯示", + "goToNextBreakpoint": "偵錯: 移至下一個中斷點", + "goToPreviousBreakpoint": "偵錯: 移至上一個中斷點" } \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/debug/browser/debugViewlet.i18n.json b/i18n/cht/src/vs/workbench/parts/debug/browser/debugViewlet.i18n.json index 9d64c6e1fc..3ca7101507 100644 --- a/i18n/cht/src/vs/workbench/parts/debug/browser/debugViewlet.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/debug/browser/debugViewlet.i18n.json @@ -6,6 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "startAdditionalSession": "啟動附加工作階段", "debugFocusVariablesView": "焦點變數", "debugFocusWatchView": "焦點監看", "debugFocusCallStackView": "焦點呼叫堆疊", diff --git a/i18n/cht/src/vs/workbench/parts/debug/common/debugSchemas.i18n.json b/i18n/cht/src/vs/workbench/parts/debug/common/debugSchemas.i18n.json new file mode 100644 index 0000000000..2e3cbf5ea4 --- /dev/null +++ b/i18n/cht/src/vs/workbench/parts/debug/common/debugSchemas.i18n.json @@ -0,0 +1,38 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "vscode.extension.contributes.debuggers": "提供偵錯配接器。", + "vscode.extension.contributes.debuggers.type": "此偵錯配接器的唯一識別碼。", + "vscode.extension.contributes.debuggers.label": "此偵錯配接器的顯示名稱。", + "vscode.extension.contributes.debuggers.program": "偵錯配接器程式的路徑。可以是擴充功能資料夾的絕對或相對路徑。", + "vscode.extension.contributes.debuggers.args": "要傳遞至配接器的選擇性引數。", + "vscode.extension.contributes.debuggers.runtime": "程式屬性不是可執行檔但需要執行階段時的選擇性執行階段。", + "vscode.extension.contributes.debuggers.runtimeArgs": "選擇性執行階段引數。", + "vscode.extension.contributes.debuggers.variables": "從 `launch.json` 中的互動式變數 (例如 ${action.pickProcess}) 對應到命令。", + "vscode.extension.contributes.debuggers.initialConfigurations": "組態,用於產生初始 'launch.json'。", + "vscode.extension.contributes.debuggers.languages": "可將偵錯延伸模組視為「預設偵錯工具」的語言清單。", + "vscode.extension.contributes.debuggers.adapterExecutableCommand": "如有指定,VS Code 會呼叫此命令以決定偵錯配接器的可執行檔路徑及要傳遞的引數。", + "vscode.extension.contributes.debuggers.configurationSnippets": "用於在 'launch.json' 中新增組態的程式碼片段。", + "vscode.extension.contributes.debuggers.configurationAttributes": "JSON 結構描述組態,用於驗證 'launch.json'。", + "vscode.extension.contributes.debuggers.windows": "Windows 特定設定。", + "vscode.extension.contributes.debuggers.windows.runtime": "用於 Windows 的執行階段。", + "vscode.extension.contributes.debuggers.osx": "macOS 特定設定。", + "vscode.extension.contributes.debuggers.osx.runtime": "用於 macOS 的執行階段。", + "vscode.extension.contributes.debuggers.linux": "Linux 特定設定。", + "vscode.extension.contributes.debuggers.linux.runtime": "用於 Linux 的執行階段。", + "vscode.extension.contributes.breakpoints": "提供中斷點。", + "vscode.extension.contributes.breakpoints.language": "允許此語言使用中斷點。", + "app.launch.json.title": "啟動", + "app.launch.json.version": "此檔案格式的版本。", + "app.launch.json.configurations": "組態清單。請使用 IntelliSense 新增新的組態或編輯現有的組態。", + "app.launch.json.compounds": "複合的清單。每個複合都參考將會同時啟動的多重組態。", + "app.launch.json.compound.name": "複合的名稱。顯示於啟動組態下拉式功能表。", + "useUniqueNames": "請使用唯一的組態名稱。", + "app.launch.json.compound.folder": "複合所在的資料夾名稱。", + "app.launch.json.compounds.configurations": "將會作為此複合一部份而啟動之組態的名稱。" +} \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/debug/electron-browser/callStackView.i18n.json b/i18n/cht/src/vs/workbench/parts/debug/electron-browser/callStackView.i18n.json index d6c21c3982..b12e1a5313 100644 --- a/i18n/cht/src/vs/workbench/parts/debug/electron-browser/callStackView.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/debug/electron-browser/callStackView.i18n.json @@ -9,7 +9,7 @@ "callstackSection": "呼叫堆疊區段", "debugStopped": "於 {0} 暫停", "callStackAriaLabel": "偵錯呼叫堆疊", - "process": "處理序", + "session": "工作階段", "paused": "已暫停", "running": "正在執行", "thread": "執行緒", diff --git a/i18n/cht/src/vs/workbench/parts/debug/electron-browser/debug.contribution.i18n.json b/i18n/cht/src/vs/workbench/parts/debug/electron-browser/debug.contribution.i18n.json index 5281623b65..2f147da60f 100644 --- a/i18n/cht/src/vs/workbench/parts/debug/electron-browser/debug.contribution.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/debug/electron-browser/debug.contribution.i18n.json @@ -21,11 +21,12 @@ "allowBreakpointsEverywhere": "允許在任何檔案設定中斷點", "openExplorerOnEnd": "自動於偵錯工作階段結束時開啟總管檢視", "inlineValues": "在偵錯時於編輯器以內嵌方式顯示變數值", - "hideActionBar": "控制是否應隱藏浮點偵錯動作列", + "toolBarLocation": "控制偵錯工具列的位置。在所有檢視中 \"floating\" (浮動)、在偵錯檢視中 \"docked\" (停駐),或 \"hidden\" (隱藏)", "never": "一律不在狀態列顯示偵錯", "always": "遠用在狀態列中顯示偵錯", "onFirstSessionStart": "只有第一次啟動偵錯後才在狀態列中顯示偵錯", "showInStatusBar": "控制何時應該顯示偵錯狀態列", "openDebug": "控制是否應於偵錯工作階段開始時開啟偵錯檢視。", + "enableAllHovers": "控制偵錯期間是否應啟用非偵錯暫留。若為 true,會呼叫暫留提供者提供暫留。即使此設定為 true,一般暫留也不會顯示。", "launch": "全域偵錯啟動組態。應當做在工作區之間共用的 'launch.json' 替代方案使用" } \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.i18n.json b/i18n/cht/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.i18n.json index 54953a0ca1..ba46f89170 100644 --- a/i18n/cht/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.i18n.json @@ -2,39 +2,10 @@ "": [ "--------------------------------------------------------------------------------------------", "Copyright (c) Microsoft Corporation. All rights reserved.", - "Licensed under the Source EULA. See License.txt in the project root for license information.", + "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "vscode.extension.contributes.debuggers": "提供偵錯配接器。", - "vscode.extension.contributes.debuggers.type": "此偵錯配接器的唯一識別碼。", - "vscode.extension.contributes.debuggers.label": "此偵錯配接器的顯示名稱。", - "vscode.extension.contributes.debuggers.program": "偵錯配接器程式的路徑。可以是擴充功能資料夾的絕對或相對路徑。", - "vscode.extension.contributes.debuggers.args": "要傳遞至配接器的選擇性引數。", - "vscode.extension.contributes.debuggers.runtime": "程式屬性不是可執行檔但需要執行階段時的選擇性執行階段。", - "vscode.extension.contributes.debuggers.runtimeArgs": "選擇性執行階段引數。", - "vscode.extension.contributes.debuggers.variables": "從 `launch.json` 中的互動式變數 (例如 ${action.pickProcess}) 對應到命令。", - "vscode.extension.contributes.debuggers.initialConfigurations": "組態,用於產生初始 'launch.json'。", - "vscode.extension.contributes.debuggers.languages": "可將偵錯延伸模組視為「預設偵錯工具」的語言清單。", - "vscode.extension.contributes.debuggers.adapterExecutableCommand": "如有指定,VS Code 會呼叫此命令以決定偵錯配接器的可執行檔路徑及要傳遞的引數。", - "vscode.extension.contributes.debuggers.configurationSnippets": "用於在 'launch.json' 中新增組態的程式碼片段。", - "vscode.extension.contributes.debuggers.configurationAttributes": "JSON 結構描述組態,用於驗證 'launch.json'。", - "vscode.extension.contributes.debuggers.windows": "Windows 特定設定。", - "vscode.extension.contributes.debuggers.windows.runtime": "用於 Windows 的執行階段。", - "vscode.extension.contributes.debuggers.osx": "macOS 特定設定。", - "vscode.extension.contributes.debuggers.osx.runtime": "用於 macOS 的執行階段。", - "vscode.extension.contributes.debuggers.linux": "Linux 特定設定。", - "vscode.extension.contributes.debuggers.linux.runtime": "用於 Linux 的執行階段。", - "vscode.extension.contributes.breakpoints": "提供中斷點。", - "vscode.extension.contributes.breakpoints.language": "允許此語言使用中斷點。", - "app.launch.json.title": "啟動", - "app.launch.json.version": "此檔案格式的版本。", - "app.launch.json.configurations": "組態清單。請使用 IntelliSense 新增新的組態或編輯現有的組態。", - "app.launch.json.compounds": "複合的清單。每個複合都參考將會同時啟動的多重組態。", - "app.launch.json.compound.name": "複合的名稱。顯示於啟動組態下拉式功能表。", - "useUniqueNames": "請使用唯一的組態名稱。", - "app.launch.json.compound.folder": "複合所在的資料夾名稱。", - "app.launch.json.compounds.configurations": "將會作為此複合一部份而啟動之組態的名稱。", "debugNoType": "偵錯器 'type' 無法省略,且必須為類型 'string'。", "selectDebug": "選取環境", "DebugConfig.failed": "無法在 '.vscode' 資料夾 ({0}) 中建立 'launch.json' 檔案。", diff --git a/i18n/cht/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json b/i18n/cht/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json index 40dc883128..b11d3acb1b 100644 --- a/i18n/cht/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json @@ -13,15 +13,15 @@ "disableBreakpoint": "停用 {0}", "enableBreakpoint": "啟用 {0}", "removeBreakpoints": "移除中斷點", - "removeBreakpointOnColumn": "移除資料行 {0} 的中斷點", + "removeInlineBreakpointOnColumn": "移除資料行 {0} 的內嵌中斷點", "removeLineBreakpoint": "移除行中斷點", "editBreakpoints": "編輯中斷點", - "editBreakpointOnColumn": "編輯資料行 {0} 的中斷點", + "editInlineBreakpointOnColumn": "編輯資料行 {0} 的內嵌中斷點", "editLineBrekapoint": "編輯行中斷點", "enableDisableBreakpoints": "啟用/停用中斷點", - "disableColumnBreakpoint": "停用資料行 {0} 的中斷點", + "disableInlineColumnBreakpoint": "停用資料行 {0} 的內嵌中斷點", "disableBreakpointOnLine": "停用行中斷點", - "enableBreakpoints": "啟用資料行 {0} 的中斷點", + "enableBreakpoints": "啟用資料行 {0} 的內嵌中斷點", "enableBreakpointOnLine": "啟用行中斷點", "addBreakpoint": "加入中斷點", "addConditionalBreakpoint": "新增條件中斷點...", diff --git a/i18n/cht/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.i18n.json b/i18n/cht/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.i18n.json index 1a8774452e..cab80f74c2 100644 --- a/i18n/cht/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.i18n.json @@ -16,9 +16,13 @@ "repository": "儲存庫", "license": "授權", "details": "詳細資料", + "detailstooltip": "擴充功能詳細資訊,從擴充功能的 'README.md' 檔案中呈現。", "contributions": "貢獻", + "contributionstooltip": "透過此擴充功能列出對 VS Code 的貢獻", "changelog": "變更記錄", + "changelogtooltip": "擴充功能更新紀錄,從擴充功能 'CHANGELOG.md' 檔案中呈現", "dependencies": "相依性", + "dependenciestooltip": "列出此擴充功能的相依項目", "noReadme": "沒有可用的讀我檔案。", "noChangelog": "沒有可用的 Changelog。", "noContributions": "沒有比重", @@ -30,6 +34,10 @@ "debuggers": "偵錯工具 ({0})", "debugger name": "名稱", "debugger type": "型別", + "viewContainers": "檢視容器 ({0})", + "view container id": "識別碼", + "view container title": "標題", + "view container location": "位置", "views": "瀏覽次數 ({0})", "view id": "識別碼", "view name": "名稱", diff --git a/i18n/cht/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json b/i18n/cht/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json index c002c5e474..771d5b4c37 100644 --- a/i18n/cht/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json @@ -8,7 +8,6 @@ ], "neverShowAgain": "不要再顯示", "searchMarketplace": "搜尋市集", - "showLanguagePackExtensions": "Marketplace 的延伸模組能夠協助將 VS Code 當地語系化為 '{0}' 地區設定", "dynamicWorkspaceRecommendation": "此擴充功能可能會讓您感興趣,因為它在 {0} 儲存庫的使用者中很熱門。", "exeBasedRecommendation": "因為您已安裝 {0},所以建議您使用此延伸模組。", "fileBasedRecommendation": "根據您最近開啟的檔案,建議您使用此延伸模組。", diff --git a/i18n/cht/src/vs/workbench/parts/extensions/node/extensionsWorkbenchService.i18n.json b/i18n/cht/src/vs/workbench/parts/extensions/node/extensionsWorkbenchService.i18n.json index 9ff12f57ec..deca666094 100644 --- a/i18n/cht/src/vs/workbench/parts/extensions/node/extensionsWorkbenchService.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/extensions/node/extensionsWorkbenchService.i18n.json @@ -10,12 +10,12 @@ "malicious": "這個延伸模組被回報是有問題的。", "installingMarketPlaceExtension": "從市集安裝擴充功能...", "uninstallingExtension": "解除安裝擴充功能...", - "enableDependeciesConfirmation": "啟用 '{0}' 也會啟用其相依性。仍要繼續嗎?", + "enableDependeciesConfirmation": "啟用擴充功能也會啟用其相依項目,仍要繼續嗎?", "enable": "是", "doNotEnable": "否", - "disableDependeciesConfirmation": "只要停用 '{0}',還是一併停用其相依性?", - "disableOnly": "只有", - "disableAll": "全部", + "disableDependeciesConfirmation": "您也要停用擴充功能的相依項目?", + "yes": "是", + "no": "否", "cancel": "取消", "singleDependentError": "無法停用延伸模組 '{0}'。'{1}' 延伸模組相依於此項。", "twoDependentsError": "無法停用延伸模組 '{0}'。'{1}' 及 '{2}' 延伸模組相依於此項。", diff --git a/i18n/cht/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.i18n.json b/i18n/cht/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.i18n.json index 080a6cc9f3..3eecc274cd 100644 --- a/i18n/cht/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.i18n.json @@ -7,10 +7,11 @@ "Do not edit this file. It is machine generated." ], "updateLocale": "您想要變更 VS Code 的 UI 語言為 {0} 並重新啟動嗎?", + "activateLanguagePack": "您是否要重新啟動 VS Coode 以啟動剛剛安裝的語套件?", "yes": "是", "no": "否", "neverAgain": "不要再顯示", - "install language pack": "在不久之後,VS Code 將只支援格式為 Marketplace 延伸模組的語言套件。請安裝 '{0}' 延伸模組已繼續使用目前設定的語言。", + "install language pack": "在不久之後,VS Code 將只支援格式為 Marketplace 延伸模組的語言套件。請安裝 '{0}' 延伸模組以繼續使用目前設定的語言。", "install": "安裝", "more information": "詳細資訊...", "JsonSchema.locale": "要使用的 UI 語言。", diff --git a/i18n/cht/src/vs/workbench/parts/localizations/electron-browser/localizationsActions.i18n.json b/i18n/cht/src/vs/workbench/parts/localizations/electron-browser/localizationsActions.i18n.json index a5e6bfeb6f..ce8ab888f1 100644 --- a/i18n/cht/src/vs/workbench/parts/localizations/electron-browser/localizationsActions.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/localizations/electron-browser/localizationsActions.i18n.json @@ -6,7 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "configureLocale": "設定語言", + "configureLocale": "設定顯示語言", "displayLanguage": "定義 VSCode 的顯示語言。", "doc": "如需支援的語言清單,請參閱 {0}。", "restart": "改變設定值後需要重新啟動 VSCode.", diff --git a/i18n/cht/src/vs/workbench/parts/outline/electron-browser/outline.contribution.i18n.json b/i18n/cht/src/vs/workbench/parts/outline/electron-browser/outline.contribution.i18n.json new file mode 100644 index 0000000000..469303ff35 --- /dev/null +++ b/i18n/cht/src/vs/workbench/parts/outline/electron-browser/outline.contribution.i18n.json @@ -0,0 +1,12 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "name": "大綱", + "category.focus": "檔案", + "label.focus": "聚焦大鋼" +} \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/outline/electron-browser/outlinePanel.i18n.json b/i18n/cht/src/vs/workbench/parts/outline/electron-browser/outlinePanel.i18n.json new file mode 100644 index 0000000000..a1342b6a24 --- /dev/null +++ b/i18n/cht/src/vs/workbench/parts/outline/electron-browser/outlinePanel.i18n.json @@ -0,0 +1,17 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "filter": "篩選", + "collapse": "全部摺疊", + "sortByPosition": "排序依據: 位置", + "sortByName": "排序依據: 名稱", + "sortByKind": "排序依據: 類型", + "live": "追蹤游標", + "no-editor": "沒有開啟的編輯器可提供大網資訊。", + "too-many-symbols": "我們很抱歉, 但此檔案太大無法顯示大綱。" +} \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/outline/electron-browser/outlineTree.i18n.json b/i18n/cht/src/vs/workbench/parts/outline/electron-browser/outlineTree.i18n.json new file mode 100644 index 0000000000..bbc5b26f1a --- /dev/null +++ b/i18n/cht/src/vs/workbench/parts/outline/electron-browser/outlineTree.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "outline.title": "在 {1} 的行 {0}" +} \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/output/browser/outputPanel.i18n.json b/i18n/cht/src/vs/workbench/parts/output/browser/outputPanel.i18n.json index cff77869ae..eb22085dff 100644 --- a/i18n/cht/src/vs/workbench/parts/output/browser/outputPanel.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/output/browser/outputPanel.i18n.json @@ -6,6 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "output": "輸出", "outputPanelWithInputAriaLabel": "{0},輸出面板", "outputPanelAriaLabel": "輸出面板" } \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/preferences/browser/keybindingWidgets.i18n.json b/i18n/cht/src/vs/workbench/parts/preferences/browser/keybindingWidgets.i18n.json index 753ff797fc..238dd01c2e 100644 --- a/i18n/cht/src/vs/workbench/parts/preferences/browser/keybindingWidgets.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/preferences/browser/keybindingWidgets.i18n.json @@ -6,6 +6,8 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "defineKeybinding.oneExists": "1 個現有命令有此按鍵繫結", + "defineKeybinding.existing": "{0} 個現有命令有此按鍵繫結", "defineKeybinding.initial": "按下所需按鍵組合,然後按 ENTER。", "defineKeybinding.chordsTo": "同步到" } \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json b/i18n/cht/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json index 44b87b90be..ae4aa79712 100644 --- a/i18n/cht/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json @@ -7,6 +7,7 @@ "Do not edit this file. It is machine generated." ], "openRawDefaultSettings": "開啟原始預設設置", + "openSettings2": "開啟設定 (預覽)", "openSettings": "開啟設定", "openGlobalSettings": "開啟使用者設定", "openGlobalKeybindings": "開啟鍵盤快速鍵", diff --git a/i18n/cht/src/vs/workbench/parts/preferences/browser/settingsEditor2.i18n.json b/i18n/cht/src/vs/workbench/parts/preferences/browser/settingsEditor2.i18n.json new file mode 100644 index 0000000000..6ff162cdce --- /dev/null +++ b/i18n/cht/src/vs/workbench/parts/preferences/browser/settingsEditor2.i18n.json @@ -0,0 +1,18 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "previewWarning": "預覽", + "previewLabel": "這是我們新的設定編輯器預覽版本", + "SearchSettings.AriaLabel": "搜尋設定", + "SearchSettings.Placeholder": "搜尋設定", + "advancedCustomizationLabel": "開啟及編輯進階自訂項目時使用", + "openSettingsLabel": "settings.json", + "showOverriddenOnly": "僅顯示已修改的", + "treeAriaLabel": "設定", + "feedbackButtonLabel": "提供意見反應" +} \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/preferences/browser/settingsTree.i18n.json b/i18n/cht/src/vs/workbench/parts/preferences/browser/settingsTree.i18n.json new file mode 100644 index 0000000000..cf83443885 --- /dev/null +++ b/i18n/cht/src/vs/workbench/parts/preferences/browser/settingsTree.i18n.json @@ -0,0 +1,19 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "modifiedItemForeground": "已修改設定的前景色彩。", + "workspace": "工作區", + "user": "使用者", + "resetButtonTitle": "重設", + "configured": "已修改", + "alsoConfiguredIn": "也修改於", + "configuredIn": "已修改於", + "editInSettingsJson": "在 settings.json 內編輯", + "settingRowAriaLabel": "{0} {1}, 設定", + "groupRowAriaLabel": "{0}, 群組 " +} \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/preferences/electron-browser/preferences.contribution.i18n.json b/i18n/cht/src/vs/workbench/parts/preferences/electron-browser/preferences.contribution.i18n.json index f0d76f241f..b3652a2bbf 100644 --- a/i18n/cht/src/vs/workbench/parts/preferences/electron-browser/preferences.contribution.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/preferences/electron-browser/preferences.contribution.i18n.json @@ -7,6 +7,7 @@ "Do not edit this file. It is machine generated." ], "defaultPreferencesEditor": "預設喜好設定編輯器", + "settingsEditor2": "設定編輯器 2", "keybindingsEditor": "按鍵繫結關係編輯器", "preferences": "喜好設定" } \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/search/browser/searchActions.i18n.json b/i18n/cht/src/vs/workbench/parts/search/browser/searchActions.i18n.json index 5e954b94f5..6ae0b3c9bc 100644 --- a/i18n/cht/src/vs/workbench/parts/search/browser/searchActions.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/search/browser/searchActions.i18n.json @@ -12,6 +12,8 @@ "previousSearchExcludePattern": "顯示上一個搜尋排除模式", "nextSearchTerm": "顯示下一個搜尋字詞", "previousSearchTerm": "顯示上一個搜尋字詞", + "nextReplaceTerm": "顯示下一個搜尋取代字詞", + "previousReplaceTerm": "顯示上一個搜尋取代字詞", "findInFiles": "在檔案中尋找", "replaceInFiles": "檔案中取代", "RefreshAction.label": "重新整理", diff --git a/i18n/cht/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json b/i18n/cht/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json index 55f7e2bb49..ebc27f353b 100644 --- a/i18n/cht/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json @@ -31,5 +31,5 @@ "search.followSymlinks": "控制是否要在搜尋時遵循 symlink。", "search.smartCase": "如果搜尋式為全部小寫,則用不分大小寫的搜尋,否則用分大小寫的搜尋", "search.globalFindClipboard": "控制搜尋檢視是否應讀取或修改 macOS 上的共用尋找剪貼簿 (shared find clipboard)", - "search.location": "控制搜尋是否在資訊看板會顯示為檢視,或為了更多水平空間,以面板方式在面板區域顯示。下個版本在面板上的搜尋將具有更好的水平版面配置,而此項目將不再處於預覽階段。" + "search.location": "控制搜尋是否以檢視方式在側邊欄顯示,或以面板方式在面板區域顯示以取得更多水平空間。" } \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/tasks/electron-browser/jsonSchema_v2.i18n.json b/i18n/cht/src/vs/workbench/parts/tasks/electron-browser/jsonSchema_v2.i18n.json index ba234c5974..13c5e3ce33 100644 --- a/i18n/cht/src/vs/workbench/parts/tasks/electron-browser/jsonSchema_v2.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/tasks/electron-browser/jsonSchema_v2.i18n.json @@ -28,6 +28,7 @@ "JsonSchema.tasks.group.none": "指派工作到沒有群組", "JsonSchema.tasks.group": "定義工作屬於哪個執行群組。支援將 「組建」新增到組建群組,以及將「測試」新增到測試群組。", "JsonSchema.tasks.type": "定義工作在殼層中會作為處理序或命令來執行。", + "JsonSchema.commandArray": "要執行的 shell 命令。陣列項目會以空白字元連接", "JsonSchema.command.quotedString.value": "實際命令值", "JsonSchema.tasks.quoting.escape": "使用殼層逸出字元的逸出字元 (例如 ` under PowerShell 與 \\ under bash)。", "JsonSchema.tasks.quoting.strong": "使用殼層的強式引號字元將引數括住 (例如 PowerShell 及 Bash 下的 \")。", diff --git a/i18n/cht/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.i18n.json b/i18n/cht/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.i18n.json index 5bf0d56b52..7729015d8e 100644 --- a/i18n/cht/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.i18n.json @@ -19,6 +19,7 @@ "terminal.integrated.copyOnSelection": "當設定時,在終端機中選擇的文字將會被複製至剪貼簿", "terminal.integrated.fontFamily": "控制終端機的字型家族,預設為 editor.fontFamily 的值。", "terminal.integrated.fontSize": "控制終端機的字型大小 (以像素為單位)。", + "terminal.integrated.letterSpacing": "控制終端機的字元間距,這是一個整數值,用於呈現增加在字元間額外的像素量。", "terminal.integrated.lineHeight": "控制終端機的行高,此數字會乘上終端機字型大小,以取得以像素為單位的實際行高。", "terminal.integrated.fontWeight": "在終端機內使用非粗體文字的字體寬度。", "terminal.integrated.fontWeightBold": "在終端機內使用粗體文字的字體寬度。", @@ -26,7 +27,8 @@ "terminal.integrated.cursorStyle": "控制終端機資料指標的樣式。", "terminal.integrated.scrollback": "控制終端機保留在其緩衝區中的行數上限。", "terminal.integrated.setLocaleVariables": "控制是否在終端機啟動時設定地區設定變數,這在 OS X 上預設為 true,在其他平台則為 false。", - "terminal.integrated.rightClickBehavior": "控制終端機如何反應右鍵點擊,可為 'default', 'copyPaste' 和 'selectWord'。 'default' 將顯示操作功能表,'copyPaste' 會在有選擇時複製,否則為貼上,'selectWord' 將選擇指標下的單字並顯示操作功能表。", + "terminal.integrated.rendererType": "控制終端的呈現方式, 選項為 \"canvas\" 為標準 (快速) 畫布轉譯器, \"dom\" 退回以 DOM-based 轉譯器, 或 \"auto\" 讓 VS Code 猜測哪個最好。此設置需要 VS Code 重新載入才能生效。", + "terminal.integrated.rightClickBehavior": "控制終端機對右鍵點擊反應方式,可為 \"default\", \"copyPaste\" 和 \"selectWord\"。 \"default\" 將顯示操作功能表,\"copyPaste\" 會在有選擇時複製,否則為貼上,\"selectWord\" 將選擇指標下的單字並顯示操作功能表。", "terminal.integrated.cwd": "終端機啟動位置的明確起始路徑,這會用作殼層處理序的目前工作目錄 (cwd)。當根目錄不是方便的 cwd 時,這在工作區設定中特別好用。", "terminal.integrated.confirmOnExit": "當有使用中的終端機工作階段時,是否要在結束時確認。", "terminal.integrated.enableBell": "是否啟用終端機警告聲。", diff --git a/i18n/cht/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json b/i18n/cht/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json index 6b90d7fb01..76e96d1e47 100644 --- a/i18n/cht/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json @@ -57,5 +57,7 @@ "workbench.action.terminal.scrollToPreviousCommand": "捲動至上一個命令", "workbench.action.terminal.scrollToNextCommand": "捲動至下一個命令", "workbench.action.terminal.selectToPreviousCommand": "選取上一個命令", - "workbench.action.terminal.selectToNextCommand": "選取下一個命令" + "workbench.action.terminal.selectToNextCommand": "選取下一個命令", + "workbench.action.terminal.selectToPreviousLine": "選擇上一行", + "workbench.action.terminal.selectToNextLine": "選擇下一行" } \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.i18n.json b/i18n/cht/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.i18n.json index ee0ea8cbc8..784ae02532 100644 --- a/i18n/cht/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.i18n.json @@ -9,6 +9,11 @@ "terminal.integrated.a11yBlankLine": "空白行", "terminal.integrated.a11yPromptLabel": "終端機輸入", "terminal.integrated.a11yTooMuchOutput": "要宣告的輸出過多,請手動讀取瀏覽至資料列", + "yes": "是", + "terminal.rendererInAllNewTerminals": "所有新建立的終端將使用非 GPU 的轉譯器。", + "no": "否", + "dontShowAgain": "不要再顯示", + "terminal.slowRendering": "整合終端的標準轉譯器在您的電腦上似乎很慢。 您是否想要切換以 Dom-based 轉譯器以提高效能? [閱讀更多有關終端設定的資訊] (https://code.visualstudio.com/docs/editor/integrated-terminal#_changing-how-the-terminal-is-rendered).", "terminal.integrated.copySelection.noSelection": "終端機沒有任何選取項目可以複製", "terminal.integrated.exitedWithCode": "終端機處理序已終止,結束代碼為: {0}", "terminal.integrated.waitOnExit": "按任意鍵關閉終端機", diff --git a/i18n/cht/src/vs/workbench/parts/terminal/electron-browser/terminalPanel.i18n.json b/i18n/cht/src/vs/workbench/parts/terminal/electron-browser/terminalPanel.i18n.json index 6b413d0615..8547bf0ab9 100644 --- a/i18n/cht/src/vs/workbench/parts/terminal/electron-browser/terminalPanel.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/terminal/electron-browser/terminalPanel.i18n.json @@ -6,6 +6,8 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "terminal.useMonospace": "使用 'monospace'", + "terminal.monospaceOnly": "終端機僅支援等距字體。", "copy": "複製", "split": "分割", "paste": "貼上", diff --git a/i18n/cht/src/vs/workbench/parts/trust/electron-browser/unsupportedWorkspaceSettings.contribution.i18n.json b/i18n/cht/src/vs/workbench/parts/trust/electron-browser/unsupportedWorkspaceSettings.contribution.i18n.json index f5b624d143..35b3f7041f 100644 --- a/i18n/cht/src/vs/workbench/parts/trust/electron-browser/unsupportedWorkspaceSettings.contribution.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/trust/electron-browser/unsupportedWorkspaceSettings.contribution.i18n.json @@ -6,7 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "unsupportedWorkspaceSettings": "此工作區包含只能在 [使用者設定] 中進行的設定 ({0})。點擊 [這裡]({1}) 了解更多。", "openWorkspaceSettings": "開啟工作區設定", - "dontShowAgain": "不要再顯示" + "dontShowAgain": "不要再顯示", + "unsupportedWorkspaceSettings": "此工作區包含只能在 [使用者設定] 中進行的設定 ({0})。點擊 [這裡]({1}) 了解更多。" } \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/update/electron-browser/update.i18n.json b/i18n/cht/src/vs/workbench/parts/update/electron-browser/update.i18n.json index d6df33a190..3fdd15bb8f 100644 --- a/i18n/cht/src/vs/workbench/parts/update/electron-browser/update.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/update/electron-browser/update.i18n.json @@ -20,7 +20,7 @@ "later": "稍後", "updateAvailable": "已有可用的更新:{0} {1}", "installUpdate": "安裝更新", - "updateInstalling": "{0} {1} 正在背景執行安裝,完成後我們會通知您。", + "updateInstalling": "{0} {1} 正在背景安裝,我們會在安裝完成時通知您。", "updateAvailableAfterRestart": "重啟 {0} 以套用最新的更新。", "updateNow": "立即更新", "commandPalette": "命令選擇區...", diff --git a/i18n/cht/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThrough.contribution.i18n.json b/i18n/cht/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThrough.contribution.i18n.json index 4203fa6241..7f90b5d804 100644 --- a/i18n/cht/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThrough.contribution.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThrough.contribution.i18n.json @@ -7,6 +7,5 @@ "Do not edit this file. It is machine generated." ], "walkThrough.editor.label": "Interactive Playground", - "help": "說明", - "interactivePlayground": "Interactive Playground" + "help": "說明" } \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/services/bulkEdit/electron-browser/bulkEditService.i18n.json b/i18n/cht/src/vs/workbench/services/bulkEdit/electron-browser/bulkEditService.i18n.json new file mode 100644 index 0000000000..6b06734150 --- /dev/null +++ b/i18n/cht/src/vs/workbench/services/bulkEdit/electron-browser/bulkEditService.i18n.json @@ -0,0 +1,13 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "summary.0": "未進行任何編輯", + "summary.nm": "在 {1} 個檔案中進行了 {0} 項文字編輯", + "summary.n0": "在一個檔案中進行了 {0} 項文字編輯", + "conflict": "這些檔案已同時變更: {0}" +} \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/services/configuration/common/configurationExtensionPoint.i18n.json b/i18n/cht/src/vs/workbench/services/configuration/common/configurationExtensionPoint.i18n.json index 5db5a4ce9d..09a1966add 100644 --- a/i18n/cht/src/vs/workbench/services/configuration/common/configurationExtensionPoint.i18n.json +++ b/i18n/cht/src/vs/workbench/services/configuration/common/configurationExtensionPoint.i18n.json @@ -16,6 +16,7 @@ "vscode.extension.contributes.configuration": "提供組態設定。", "invalid.title": "'configuration.title' 必須是字串", "invalid.properties": "'configuration.properties' 必須是物件", + "invalid.property": "'configuration.property' 必須是物件", "invalid.allOf": "'configuration.allOf' 已取代而不應再使用。請改為將多個組態區段作為陣列,傳遞至「組態」貢獻點。", "workspaceConfig.folders.description": "要載入工作區之資料夾的清單。", "workspaceConfig.path.description": "檔案路徑,例如 `/root/folderA` 或 `./folderA` 即為會對工作區檔案位置解析的相關路徑。", diff --git a/i18n/cht/src/vs/workbench/services/configurationResolver/electron-browser/configurationResolverService.i18n.json b/i18n/cht/src/vs/workbench/services/configurationResolver/electron-browser/configurationResolverService.i18n.json index 35229bd669..d67fb8af8d 100644 --- a/i18n/cht/src/vs/workbench/services/configurationResolver/electron-browser/configurationResolverService.i18n.json +++ b/i18n/cht/src/vs/workbench/services/configurationResolver/electron-browser/configurationResolverService.i18n.json @@ -5,5 +5,6 @@ "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." - ] + ], + "stringsOnlySupported": "命令 {0} 未回傳字串結果。僅支援字串作為變數替換的命令結果。" } \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/services/files/electron-browser/remoteFileService.i18n.json b/i18n/cht/src/vs/workbench/services/files/electron-browser/remoteFileService.i18n.json index 09ee4d7e3e..8c23203dac 100644 --- a/i18n/cht/src/vs/workbench/services/files/electron-browser/remoteFileService.i18n.json +++ b/i18n/cht/src/vs/workbench/services/files/electron-browser/remoteFileService.i18n.json @@ -6,6 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "invalidPath": "資源 '{0}' 路徑必須為絕對路徑", "fileNotFoundError": "找不到檔案 ({0})", "fileIsDirectoryError": "檔案是目錄", "fileNotModifiedError": "未修改檔案的時間", diff --git a/i18n/cht/src/vs/workbench/services/themes/common/fileIconThemeSchema.i18n.json b/i18n/cht/src/vs/workbench/services/themes/common/fileIconThemeSchema.i18n.json index 69da987ef3..8bc7da21d7 100644 --- a/i18n/cht/src/vs/workbench/services/themes/common/fileIconThemeSchema.i18n.json +++ b/i18n/cht/src/vs/workbench/services/themes/common/fileIconThemeSchema.i18n.json @@ -21,7 +21,7 @@ "schema.languageId": "關聯的圖示定義識別碼。", "schema.fonts": "用在圖示定義中的字型。", "schema.id": "字型識別碼。", - "schema.src": "字型位置。", + "schema.src": "字型的位置。", "schema.font-path": "字型路徑,相對於目前的圖示佈景主題檔案。", "schema.font-format": "字型格式。", "schema.font-weight": "字型粗細。", diff --git a/i18n/deu/extensions/configuration-editing/out/extension.i18n.json b/i18n/deu/extensions/configuration-editing/out/extension.i18n.json index 8aa5957f6a..1a0029be12 100644 --- a/i18n/deu/extensions/configuration-editing/out/extension.i18n.json +++ b/i18n/deu/extensions/configuration-editing/out/extension.i18n.json @@ -6,5 +6,16 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "workspaceFolder": "Pfad des in VS Code geöffneten Ordners", + "workspaceFolderBasename": "Name des in VS Code geöffneten Ordners ohne Schrägstriche (/)", + "relativeFile": "Die aktuelle geöffnete Datei bezogen auf ${WorkspaceFolder}", + "file": "Die aktuelle geöffnete Datei", + "cwd": "Das aktuelle Arbeitsverzeichnis der Aufgabenausführung beim Start", + "lineNumber": "Die aktuelle ausgewählte Zeilennummer in der aktiven Datei", + "selectedText": "Der aktuelle ausgewählte Text in der aktiven Datei", + "fileDirname": "Der Verzeichnisname der aktuellen geöffneten Datei", + "fileExtname": "Die Erweiterung der aktuellen geöffneten Datei", + "fileBasename": "Der Basisname der aktuellen geöffneten Datei", + "fileBasenameNoExtension": "Der Basisname der aktuellen geöffneten Datei ohne Erweiterung", "exampleExtension": "Beispiel" } \ No newline at end of file diff --git a/i18n/deu/extensions/git/out/commands.i18n.json b/i18n/deu/extensions/git/out/commands.i18n.json index dc0196a882..1abad5f86e 100644 --- a/i18n/deu/extensions/git/out/commands.i18n.json +++ b/i18n/deu/extensions/git/out/commands.i18n.json @@ -2,7 +2,7 @@ "": [ "--------------------------------------------------------------------------------------------", "Copyright (c) Microsoft Corporation. All rights reserved.", - "Licensed under the Source EULA. See License.txt in the project root for license information.", + "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], @@ -10,10 +10,12 @@ "remote branch at": "Remotebranch unter {0}", "create branch": "$(plus) Neuen Branch erstellen", "repourl": "Repository-URL", - "parent": "Übergeordnetes Verzeichnis", + "selectFolder": "Repositoryspeicherort auswählen", "cloning": "Das Git-Repository \"{0}\" wird geklont …", - "openrepo": "Repository öffnen", "proposeopen": "Möchten Sie das geklonte Repository öffnen?", + "openrepo": "Repository öffnen", + "add": "Zum Arbeitsbereich hinzufügen", + "proposeopen2": "Möchten Sie das geklonte Repository öffnen oder es zum aktuellen Arbeitsbereich hinzufügen?", "init": "Arbeitsbereichsordner auswählen, in dem das Git-Repository initialisiert wird", "init repo": "Repository initialisieren", "create repo": "Repository initialisieren", diff --git a/i18n/deu/extensions/npm/out/npmView.i18n.json b/i18n/deu/extensions/npm/out/npmView.i18n.json index e56a09ae55..d672afcae9 100644 --- a/i18n/deu/extensions/npm/out/npmView.i18n.json +++ b/i18n/deu/extensions/npm/out/npmView.i18n.json @@ -6,6 +6,9 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "npm.noDebugOptions": "\"{0}\" konnte nicht zum Debuggen gestartet werden, da die Skripte keine Node-Debugging-Option enthalten wie z. B. \"--inspect-brk\".", - "npm.scriptInvalid": "Das Skript \"{0}\" wurde nicht gefunden. Versuchen Sie, die Ansicht zu aktualisieren." + "noScripts": "Keine Skripte gefunden.", + "noDebugOptions": "\"{0}\" konnte nicht zum Debuggen gestartet werden, da die Skripte keine Node-Debugging-Option enthalten wie z. B. \"--inspect-brk\".", + "learnMore": "Weitere Informationen", + "ok": "OK", + "scriptInvalid": "Das Skript \"{0}\" wurde nicht gefunden. Versuchen Sie, die Ansicht zu aktualisieren." } \ No newline at end of file diff --git a/i18n/deu/extensions/npm/package.i18n.json b/i18n/deu/extensions/npm/package.i18n.json index ba906568b8..8df7570442 100644 --- a/i18n/deu/extensions/npm/package.i18n.json +++ b/i18n/deu/extensions/npm/package.i18n.json @@ -12,15 +12,15 @@ "config.npm.runSilent": "npm-Befehle mit der Option \"--silent\" ausführen.", "config.npm.packageManager": "Der zu verwendende Paket-Manager, um Skripte auszuführen.", "config.npm.exclude": "Konfigurieren Sie Globmuster für Ordner, die von der automatischen Skripterkennung ausgeschlossen werden sollen.", - "config.npm.enableScriptExplorer": "Explorer-Ansicht für NPM-Skripte aktivieren, wenn der Arbeitsbereich die Datei \"package.json\" enthält.", + "config.npm.enableScriptExplorer": "Aktiviert eine Exploreransicht für npm-Skripts.", + "config.npm.scriptExplorerAction": "Die im Skript-Explorer verwendete Standardaktion für Klicks. Mögliche Werte sind \"open\" (Standard) und \"run\".", "npm.parseError": "NPM-Aufgabenerkennung: Fehler beim Analysieren der Datei {0}", "taskdef.script": "Das anzupassende NPM-Skript.", - "taskdef.path": "Der Pfad zu dem Ordner der Datei vom Typ \"package.json\", die das Skript bereitstellt. Kann ausgelassen werden.", - "view.name": "NPM-Skripte", + "taskdef.path": "Der Pfad zum Ordner der package.json-Datei, die das Skript bereitstellt. Kann weggelassen werden.", + "view.name": "npm-Skripts", "command.refresh": "Aktualisieren", "command.run": "Ausführen", "command.debug": "Debuggen", "command.openScript": "Öffnen", - "npm.scriptInvalid": "Das Skript \"{0}\" wurde nicht gefunden. Versuchen Sie, die Ansicht zu aktualisieren.", - "npm.noDebugOptions": "\"{0}\" konnte nicht zum Debuggen gestartet werden, da die Skripte keine Node-Debugging-Option enthalten wie z. B. \"--inspect-brk\"." + "command.runInstall": "Installation ausführen" } \ No newline at end of file diff --git a/i18n/deu/extensions/search-rg/package.i18n.json b/i18n/deu/extensions/search-rg/package.i18n.json new file mode 100644 index 0000000000..6f2200bf6e --- /dev/null +++ b/i18n/deu/extensions/search-rg/package.i18n.json @@ -0,0 +1,11 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "displayName": "Suchen (Ripgrep)", + "description": "Erlaubt die Suche mit ripgrep." +} \ No newline at end of file diff --git a/i18n/deu/extensions/typescript-language-features/out/features/updatePathsOnRename.i18n.json b/i18n/deu/extensions/typescript-language-features/out/features/updatePathsOnRename.i18n.json new file mode 100644 index 0000000000..c15eeca8a4 --- /dev/null +++ b/i18n/deu/extensions/typescript-language-features/out/features/updatePathsOnRename.i18n.json @@ -0,0 +1,14 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "prompt": "Sollen Importe für verschobene Datei \"{0}\" automatisch aktualisiert werden?", + "reject.title": "Nein", + "accept.title": "Ja", + "always.title": "Ja, Importe immer aktualisieren", + "never.title": "Nein, Importe nie aktualisieren" +} \ No newline at end of file diff --git a/i18n/deu/extensions/typescript-language-features/package.i18n.json b/i18n/deu/extensions/typescript-language-features/package.i18n.json index 8fa1df1b16..b4c912aea2 100644 --- a/i18n/deu/extensions/typescript-language-features/package.i18n.json +++ b/i18n/deu/extensions/typescript-language-features/package.i18n.json @@ -8,8 +8,7 @@ ], "displayName": "TypeScript- und JavaScript-Sprachfeatures", "description": "Bietet umfangreiche Sprachunterstützung für JavaScript und TypeScript.", - "typescript.reloadProjects.title": "Projekt erneut laden", - "javascript.reloadProjects.title": "Projekt erneut laden", + "reloadProjects.title": "Projekt erneut laden", "configuration.typescript": "TypeScript", "typescript.useCodeSnippetsOnMethodSuggest.dec": "Vervollständigen Sie Funktionen mit deren Parametersignatur.", "typescript.tsdk.desc": "Gibt den Ordnerpfad mit den zu verwendenden tsserver- und lib*.d.ts-Dateien an.", @@ -37,8 +36,7 @@ "format.placeOpenBraceOnNewLineForFunctions": "Definiert, ob eine öffnende geschweifte Klammer für Funktionen in eine neue Zeile eingefügt wird.", "format.placeOpenBraceOnNewLineForControlBlocks": "Definiert, ob eine öffnende geschweifte Klammer für Kontrollblöcke in eine neue Zeile eingefügt wird.", "javascript.validate.enable": "JavaScript-Überprüfung aktivieren/deaktivieren.", - "typescript.goToProjectConfig.title": "Zur Projektkonfiguration wechseln", - "javascript.goToProjectConfig.title": "Zur Projektkonfiguration wechseln", + "goToProjectConfig.title": "Zur Projektkonfiguration wechseln", "javascript.referencesCodeLens.enabled": "Aktiviert oder deaktiviert CodeLens-Verweise in JavaScript Dateien. Erfordert TypeScript 2.0.6 oder höher.", "typescript.referencesCodeLens.enabled": "Aktiviert oder deaktiviert CodeLens-Verweise in TypeScript Dateien. Erfordert TypeScript 2.0.6 oder höher.", "typescript.implementationsCodeLens.enabled": "Aktiviert oder deaktiviert CodeLens-Implementierungen. Erfordert TypeScript 2.2.0 oder höher.", @@ -55,11 +53,15 @@ "typescript.problemMatchers.tsc.label": "TypeScript-Probleme", "typescript.problemMatchers.tscWatch.label": "TypeScript-Probleme (Überwachungsmodus)", "typescript.quickSuggestionsForPaths": "Aktiviert oder deaktiviert Schnellvorschläge, wenn Sie einen Importpfad ausschreiben.", - "typescript.locale": "Legt das zum Melden von TypeScript-Fehlern verwendete Gebietsschema fest. Erfordert TypeScript 2.6.0 oder höher. Der Standardwert \"null\" verwendet für TypeScript-Fehler das Gebietsschema von VS Code.", + "typescript.locale": "Legt das zum Melden von JavaScript- und TypeScript-Fehlern verwendete Gebietsschema fest. Erfordert TypeScript 2.6.0 oder höher. Beim Der Standardwert \"null\" wird das Gebietsschema von VS Code verwendet.", "javascript.implicitProjectConfig.experimentalDecorators": "Aktiviert oder deaktiviert \"experimentalDecorators\" für JavaScript-Dateien, die nicht Teil eines Projekts sind. Vorhandene jsconfig.json- oder tsconfig.json-Dateien setzen diese Einstellung außer Kraft. Erfordert TypeScript 2.3.1 oder höher.", "typescript.autoImportSuggestions.enabled": "Aktiviert oder deaktiviert Vorschläge für den automatischen Import. Erfordert TypeScript 2.6.1 oder höher.", "typescript.experimental.syntaxFolding": "Aktiviert bzw. deaktiviert die syntaxabhängigen Faltungsmarkierungen.", "taskDefinition.tsconfig.description": "Die \"tsconfig\"-Datei, die den TS-Build definiert.", "javascript.suggestionActions.enabled": "Aktiviert/deaktiviert Vorschlagsdiagnosen für JavaScript-Dateien im Editor. Erfordert TypeScript 2.8 oder höher.", - "typescript.suggestionActions.enabled": "Aktiviert/deaktiviert Vorschlagsdiagnosen für TypeScript-Dateien im Editor. Erfordert TypeScript 2.8 oder höher." + "typescript.suggestionActions.enabled": "Aktiviert bzw. deaktiviert Vorschlagsdiagnosen für TypeScript-Dateien im Editor. Erfordert TypeScript 2.8 oder höher.", + "typescript.preferences.quoteStyle": "Der bevorzugte Stil für Anführungszeichen bei schnellen Problembehebungen. Mögliche Werte sind \"single\" (einfache Anführungszeichen), \"double\" (doppelte Anführungszeichen) und \"auto\" (hierbei wird der Stil für Anführungszeichen aus bestehenden Importen abgeleitet). Erfordert TypeScript 2.9 oder höher.", + "typescript.preferences.importModuleSpecifier": "Bevorzugter Pfadstil für den automatischen Import. Mögliche Werte sind:\n- \"relative\" (relativ zum Dateispeicherort)\n- \"non-relative\" (nicht-relativ, d. h. auf Grundlage des in der Datei \"jsconfig.json\" oder \"tsconfig.json\" konfigurierten Werts für \"baseUrl\")\n- \"auto\" (ermittelt den jeweils kürzeren Pfadtyp)\nErfordert TypeScript 2.9 oder höher.", + "typescript.showUnused": "Aktiviert bzw. deaktiviert das Hervorheben unbenutzter Variablen im Code. Erforderlich TypeScript 2.9 oder höher.", + "typescript.updateImportsOnFileMove.enabled": "Aktiviert bzw. deaktiviert die automatische Änderungen von Importpfaden, wenn Sie eine Datei in VS Code umbenennen oder verschieben. Mögliche Werte sind \"prompt\" (fordert bei jeder Umbenennung zur Auswahl auf), \"always\" (aktualisiert Pfade automatisch\" und \"never\" (Pfade werden nie geändert). Erfordert TypeScript 2.9 oder höher." } \ No newline at end of file diff --git a/i18n/deu/src/vs/base/node/zip.i18n.json b/i18n/deu/src/vs/base/node/zip.i18n.json index a509943704..558084d9d0 100644 --- a/i18n/deu/src/vs/base/node/zip.i18n.json +++ b/i18n/deu/src/vs/base/node/zip.i18n.json @@ -2,10 +2,10 @@ "": [ "--------------------------------------------------------------------------------------------", "Copyright (c) Microsoft Corporation. All rights reserved.", - "Licensed under the Source EULA. See License.txt in the project root for license information.", + "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "incompleteExtract": "Unvollständig. {0} von {1} Einträgen wurden extrahiert", + "incompleteExtract": "Unvollständig. {0} von {1} Einträgen gefunden", "notFound": "{0} wurde im ZIP nicht gefunden." } \ No newline at end of file diff --git a/i18n/deu/src/vs/code/electron-browser/issue/issueReporterMain.i18n.json b/i18n/deu/src/vs/code/electron-browser/issue/issueReporterMain.i18n.json index ee5978abf0..5bc9127f7c 100644 --- a/i18n/deu/src/vs/code/electron-browser/issue/issueReporterMain.i18n.json +++ b/i18n/deu/src/vs/code/electron-browser/issue/issueReporterMain.i18n.json @@ -6,6 +6,8 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "hide": "Ausblenden", + "show": "Anzeigen", "previewOnGitHub": "Vorschau in GitHub", "loadingData": "Daten werden geladen …", "rateLimited": "GitHub-Abfragebeschränkung überschritten. Bitte warten.", diff --git a/i18n/deu/src/vs/code/electron-browser/issue/issueReporterPage.i18n.json b/i18n/deu/src/vs/code/electron-browser/issue/issueReporterPage.i18n.json index 50c036699d..b2207b414a 100644 --- a/i18n/deu/src/vs/code/electron-browser/issue/issueReporterPage.i18n.json +++ b/i18n/deu/src/vs/code/electron-browser/issue/issueReporterPage.i18n.json @@ -17,13 +17,12 @@ "issueTitleLabel": "Titel", "issueTitleRequired": "Geben Sie einen Titel ein.", "titleLengthValidation": "Der Titel ist zu lang.", - "systemInfo": "Eigene Systeminformationen", - "sendData": "Eigene Daten senden", - "processes": "Derzeit ausgeführte Prozesse", - "workspaceStats": "Eigene Arbeitsbereichsstatistiken", - "extensions": "Eigene Erweiterungen", - "searchedExtensions": "Gesuchte Erweiterungen", - "settingsSearchDetails": "Details der Einstellungssuche", "details": "Geben Sie Details ein.", - "loadingData": "Daten werden geladen …" + "sendSystemInfo": "Meine Systeminformationen einschließen ({0})", + "show": "Anzeigen", + "sendProcessInfo": "Meine derzeit ausgeführten Prozesse einschließen ({0})", + "sendWorkspaceInfo": "Metadaten zu meinem Arbeitsbereich einschließen ({0})", + "sendExtensions": "Meine aktivierten Erweiterungen einschließen ({0})", + "sendSearchedExtensions": "Gesuchte Erweiterungen senden ({0})", + "sendSettingsSearchDetails": "Details der Einstellungssuche senden ({0})" } \ No newline at end of file diff --git a/i18n/deu/src/vs/code/electron-browser/processExplorer/processExplorerMain.i18n.json b/i18n/deu/src/vs/code/electron-browser/processExplorer/processExplorerMain.i18n.json index a692133c83..b9932f0e51 100644 --- a/i18n/deu/src/vs/code/electron-browser/processExplorer/processExplorerMain.i18n.json +++ b/i18n/deu/src/vs/code/electron-browser/processExplorer/processExplorerMain.i18n.json @@ -11,5 +11,7 @@ "pid": "PID", "name": "Name", "killProcess": "Prozess beenden", - "forceKillProcess": "Beenden des Prozesses erzwingen" + "forceKillProcess": "Beenden des Prozesses erzwingen", + "copy": "Kopieren", + "copyAll": "Alles kopieren" } \ No newline at end of file diff --git a/i18n/deu/src/vs/code/electron-main/menus.i18n.json b/i18n/deu/src/vs/code/electron-main/menus.i18n.json index e71ea740d4..a4d8520498 100644 --- a/i18n/deu/src/vs/code/electron-main/menus.i18n.json +++ b/i18n/deu/src/vs/code/electron-main/menus.i18n.json @@ -88,7 +88,6 @@ "miToggleDebugConsole": "De&&bugkonsole", "miToggleIntegratedTerminal": "&&Integriertes Terminal", "miMarker": "&&Probleme", - "miAdditionalViews": "Z&&usätzliche Ansichten", "miCommandPalette": "&&Befehlspalette...", "miOpenView": "&&Ansicht öffnen …", "miToggleFullScreen": "&&Vollbild umschalten", @@ -144,7 +143,7 @@ "miContinue": "&&Fortfahren", "miToggleBreakpoint": "Haltepunkt &&umschalten", "miConditionalBreakpoint": "&&Bedingter Haltepunkt...", - "miColumnBreakpoint": "S&&paltenhaltepunkt", + "miInlineBreakpoint": "Inlinehaltep&&unkt", "miFunctionBreakpoint": "&&Funktionshaltepunkt...", "miLogPoint": "&&Protokollpunkt …", "miNewBreakpoint": "&&Neuer Haltepunkt", diff --git a/i18n/deu/src/vs/editor/browser/widget/codeEditorWidget.i18n.json b/i18n/deu/src/vs/editor/browser/widget/codeEditorWidget.i18n.json new file mode 100644 index 0000000000..ebc919fd7a --- /dev/null +++ b/i18n/deu/src/vs/editor/browser/widget/codeEditorWidget.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "cursors.maximum": "Die Anzahl der Cursors wurde auf {0} beschränkt." +} \ No newline at end of file diff --git a/i18n/deu/src/vs/editor/common/config/commonEditorConfig.i18n.json b/i18n/deu/src/vs/editor/common/config/commonEditorConfig.i18n.json index 05f4d5c9ce..c51ad35eeb 100644 --- a/i18n/deu/src/vs/editor/common/config/commonEditorConfig.i18n.json +++ b/i18n/deu/src/vs/editor/common/config/commonEditorConfig.i18n.json @@ -26,6 +26,7 @@ "detectIndentation": "Beim Öffnen einer Datei werden \"editor.tabSize\" und \"editor.insertSpaces\" basierend auf den Dateiinhalten erkannt.", "roundedSelection": "Steuert, ob die Auswahl runde Ecken aufweist.", "scrollBeyondLastLine": "Legt fest, ob der Editor Bildläufe über die letzte Zeile hinaus ausführt.", + "scrollBeyondLastColumn": "Steuert die Anzahl der zusätzlichen Zeichen, nach denen der Editor horizontal scrollt.", "smoothScrolling": "Legt fest, ob der Editor Bildläufe animiert ausführt.", "minimap.enabled": "Steuert, ob die Minikarte angezeigt wird", "minimap.side": "Steuert die Seite, wo die Minikarte gerendert wird.", @@ -41,7 +42,7 @@ "wordWrap.bounded": "Der Zeilenumbruch erfolgt beim Mindestanzeigebereich und \"editor.wordWrapColumn\".", "wordWrap": "Steuert den Zeilenumbruch. Mögliche Einstellungen sind:\n - \"off\" (Umbruch deaktivieren),\n - \"on\" (Anzeigebereichsumbruch),\n - \"wordWrapColumn\" (Umbruch bei \"editor.wordWrapColumn\") oder\n - \"bounded\" (der Zeilenumbruch erfolgt beim Mindestanzeigebereich und \"editor.wordWrapColumn\").", "wordWrapColumn": "Steuert die Umbruchspalte des Editors, wenn für \"editor.wordWrap\" die Option \"wordWrapColumn\" oder \"bounded\" festgelegt ist.", - "wrappingIndent": "Steuert den Einzug der umbrochenen Zeilen. Der Wert kann \"none\", \"same\" oder \"indent\" sein.", + "wrappingIndent": "Steuert den Einzug umbrochener Zeilen. Der Wert kann „none“, „same“, „indent“ oder „deepIndent“ sein.", "mouseWheelScrollSensitivity": "Ein Multiplikator, der für die Mausrad-Bildlaufereignisse \"deltaX\" und \"deltaY\" verwendet werden soll.", "multiCursorModifier.ctrlCmd": "Ist unter Windows und Linux der Taste \"STRG\" und unter macOSX der Befehlstaste zugeordnet.", "multiCursorModifier.alt": "Ist unter Windows und Linux der Taste \"Alt\" und unter macOSX der Wahltaste zugeordnet. ", diff --git a/i18n/deu/src/vs/editor/common/view/editorColorRegistry.i18n.json b/i18n/deu/src/vs/editor/common/view/editorColorRegistry.i18n.json index 12934235d5..2833733735 100644 --- a/i18n/deu/src/vs/editor/common/view/editorColorRegistry.i18n.json +++ b/i18n/deu/src/vs/editor/common/view/editorColorRegistry.i18n.json @@ -32,6 +32,7 @@ "infoBorder": "Rahmenfarbe von Informationsunterstreichungen im Editor.", "hintForeground": "Vordergrundfarbe der Hinweisunterstreichungen im Editor.", "hintBorder": "Rahmenfarbe der Hinweisunterstreichungen im Editor.", + "unnecessaryForeground": "Vordergrundfarbe für nicht benötigten Code im Editor.", "overviewRulerRangeHighlight": "Übersichtslineal-Markierungsfarbe für Bereichshervorhebungen. Die Farbe muss durchsichtig sein, um dahinterliegende Dekorationen nicht zu verbergen.", "overviewRuleError": "Übersichtslineal-Markierungsfarbe für Fehler.", "overviewRuleWarning": "Übersichtslineal-Markierungsfarbe für Warnungen.", diff --git a/i18n/deu/src/vs/editor/contrib/codeAction/codeActionCommands.i18n.json b/i18n/deu/src/vs/editor/contrib/codeAction/codeActionCommands.i18n.json index d3a255e112..87a58e790f 100644 --- a/i18n/deu/src/vs/editor/contrib/codeAction/codeActionCommands.i18n.json +++ b/i18n/deu/src/vs/editor/contrib/codeAction/codeActionCommands.i18n.json @@ -9,8 +9,8 @@ "quickFixWithKb": "Korrekturen anzeigen ({0})", "quickFix": "Korrekturen anzeigen", "quickfix.trigger.label": "Schnelle Problembehebung …", - "editor.action.quickFix.noneMessage": "Keine Code-Aktionen verfügbar", - "refactor.label": "Umgestalten...", + "editor.action.quickFix.noneMessage": "Keine Codeaktionen verfügbar", + "refactor.label": "Refactoring durchführen...", "editor.action.refactor.noneMessage": "Keine Refactorings verfügbar", "source.label": "Quellaktion…", "editor.action.source.noneMessage": "Keine Quellaktionen verfügbar", diff --git a/i18n/deu/src/vs/editor/contrib/fontZoom/fontZoom.i18n.json b/i18n/deu/src/vs/editor/contrib/fontZoom/fontZoom.i18n.json new file mode 100644 index 0000000000..4050df46d2 --- /dev/null +++ b/i18n/deu/src/vs/editor/contrib/fontZoom/fontZoom.i18n.json @@ -0,0 +1,12 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "EditorFontZoomIn.label": "Editorschriftart vergrößern", + "EditorFontZoomOut.label": "Editorschriftart verkleinern", + "EditorFontZoomReset.label": "Editor Schriftart Vergrößerung zurücksetzen" +} \ No newline at end of file diff --git a/i18n/deu/src/vs/editor/contrib/format/formatActions.i18n.json b/i18n/deu/src/vs/editor/contrib/format/formatActions.i18n.json index d0bb0368ca..4d730ec596 100644 --- a/i18n/deu/src/vs/editor/contrib/format/formatActions.i18n.json +++ b/i18n/deu/src/vs/editor/contrib/format/formatActions.i18n.json @@ -12,7 +12,7 @@ "hintnn": "{0} Formatierungen zwischen Zeilen {1} und {2} vorgenommen", "no.provider": "Es ist kein Formatierer für \"{0}\"-Dateien installiert. ", "formatDocument.label": "Dokument formatieren", - "no.documentprovider": "Es ist kein Dokument-Formatierer für \"{0}\"-Dateien installiert.", + "no.documentprovider": "Es ist kein Dokumentformatierer für \"{0}\"-Dateien installiert.", "formatSelection.label": "Auswahl formatieren", "no.selectionprovider": "Es ist kein Auswahl-Formatierer für \"{0}\"-Dateien installiert. " } \ No newline at end of file diff --git a/i18n/deu/src/vs/editor/contrib/goToDefinition/goToDefinitionCommands.i18n.json b/i18n/deu/src/vs/editor/contrib/goToDefinition/goToDefinitionCommands.i18n.json new file mode 100644 index 0000000000..598bbb2392 --- /dev/null +++ b/i18n/deu/src/vs/editor/contrib/goToDefinition/goToDefinitionCommands.i18n.json @@ -0,0 +1,25 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "noResultWord": "Keine Definition gefunden für \"{0}\".", + "generic.noResults": "Keine Definition gefunden", + "meta.title": " – {0} Definitionen", + "actions.goToDecl.label": "Gehe zu Definition", + "actions.goToDeclToSide.label": "Definition an der Seite öffnen", + "actions.previewDecl.label": "Peek-Definition", + "goToImplementation.noResultWord": "Keine Implementierung gefunden für \"{0}\"", + "goToImplementation.generic.noResults": "Keine Implementierung gefunden", + "meta.implementations.title": "{0} Implementierungen", + "actions.goToImplementation.label": "Zur Implementierung wechseln", + "actions.peekImplementation.label": "Vorschau der Implementierung anzeigen", + "goToTypeDefinition.noResultWord": "Keine Typendefinition gefunden für \"{0}\"", + "goToTypeDefinition.generic.noResults": "Keine Typendefinition gefunden", + "meta.typeDefinitions.title": "{0} Typdefinitionen", + "actions.goToTypeDefinition.label": "Zur Typdefinition wechseln", + "actions.peekTypeDefinition.label": "Vorschau der Typdefinition anzeigen" +} \ No newline at end of file diff --git a/i18n/deu/src/vs/editor/contrib/goToDefinition/goToDefinitionMouse.i18n.json b/i18n/deu/src/vs/editor/contrib/goToDefinition/goToDefinitionMouse.i18n.json new file mode 100644 index 0000000000..6214a65759 --- /dev/null +++ b/i18n/deu/src/vs/editor/contrib/goToDefinition/goToDefinitionMouse.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "multipleResults": "Klicken Sie, um {0} Definitionen anzuzeigen." +} \ No newline at end of file diff --git a/i18n/deu/src/vs/editor/contrib/gotoError/gotoError.i18n.json b/i18n/deu/src/vs/editor/contrib/gotoError/gotoError.i18n.json index 4a2b893362..e5212f449c 100644 --- a/i18n/deu/src/vs/editor/contrib/gotoError/gotoError.i18n.json +++ b/i18n/deu/src/vs/editor/contrib/gotoError/gotoError.i18n.json @@ -7,5 +7,7 @@ "Do not edit this file. It is machine generated." ], "markerAction.next.label": "Gehe zu nächstem Problem (Fehler, Warnung, Information)", - "markerAction.previous.label": "Gehe zu vorigem Problem (Fehler, Warnung, Information)" + "markerAction.previous.label": "Gehe zu vorigem Problem (Fehler, Warnung, Information)", + "markerAction.nextInFiles.label": "Gehe zu dem nächsten Problem in den Dateien (Fehler, Warnung, Info) ", + "markerAction.previousInFiles.label": "Gehe zu dem vorherigen Problem in den Dateien (Fehler, Warnung, Info) " } \ No newline at end of file diff --git a/i18n/deu/src/vs/editor/contrib/indentation/indentation.i18n.json b/i18n/deu/src/vs/editor/contrib/indentation/indentation.i18n.json index 606fa75522..d6664392e8 100644 --- a/i18n/deu/src/vs/editor/contrib/indentation/indentation.i18n.json +++ b/i18n/deu/src/vs/editor/contrib/indentation/indentation.i18n.json @@ -13,5 +13,6 @@ "indentUsingTabs": "Einzug mithilfe von Tabstopps", "indentUsingSpaces": "Einzug mithilfe von Leerzeichen", "detectIndentation": "Einzug aus Inhalt erkennen", - "editor.reindentlines": "Neuen Einzug für Zeilen festlegen" + "editor.reindentlines": "Neuen Einzug für Zeilen festlegen", + "editor.reindentselectedlines": "Gewählte Zeilen zurückziehen" } \ No newline at end of file diff --git a/i18n/deu/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json b/i18n/deu/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json index f708991d81..efdaa6c50b 100644 --- a/i18n/deu/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json +++ b/i18n/deu/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json @@ -25,8 +25,6 @@ "uninstallDependeciesConfirmation": "Möchten Sie nur \"{0}\" oder auch die zugehörigen Abhängigkeiten deinstallieren?", "uninstallOnly": "Nur Erweiterung", "uninstallAll": "Alle deinstallieren", - "uninstallConfirmation": "Möchten Sie \"{0}\" deinstallieren?", - "ok": "OK", "singleDependentError": "Die Erweiterung \"{0}\" kann nicht deinstalliert werden. Die Erweiterung \"{1}\" hängt von dieser Erweiterung ab.", "twoDependentsError": "Die Erweiterung \"{0}\" kann nicht deinstalliert werden. Die Erweiterungen \"{1}\" und \"{2}\" hängen von dieser Erweiterung ab.", "multipleDependentsError": "Die Erweiterung \"{0}\" kann nicht deinstalliert werden. Die Erweiterungen \"{1}\" und \"{2}\" sowie weitere hängen von dieser Erweiterung ab.", diff --git a/i18n/deu/src/vs/platform/node/minimalTranslations.i18n.json b/i18n/deu/src/vs/platform/node/minimalTranslations.i18n.json new file mode 100644 index 0000000000..7cd9c11ca0 --- /dev/null +++ b/i18n/deu/src/vs/platform/node/minimalTranslations.i18n.json @@ -0,0 +1,13 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "showLanguagePackExtensions": "VS Code ist auf {0} erhältlich. Auf dem Marketplace finden Sie Language Packs für den Einstieg.", + "searchMarketplace": "Marketplace durchsuchen", + "installAndRestartMessage": "VS Code ist auf {0} erhältlich. Installieren Sie das Language Pack, und legen Sie los. Hierzu ist ein Neustart erforderlich.", + "installAndRestart": "Installieren und neu starten" +} \ No newline at end of file diff --git a/i18n/deu/src/vs/platform/theme/common/colorRegistry.i18n.json b/i18n/deu/src/vs/platform/theme/common/colorRegistry.i18n.json index b35ebab1bb..b32f03c31f 100644 --- a/i18n/deu/src/vs/platform/theme/common/colorRegistry.i18n.json +++ b/i18n/deu/src/vs/platform/theme/common/colorRegistry.i18n.json @@ -2,7 +2,7 @@ "": [ "--------------------------------------------------------------------------------------------", "Copyright (c) Microsoft Corporation. All rights reserved.", - "Licensed under the Source EULA. See License.txt in the project root for license information.", + "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], @@ -16,7 +16,7 @@ "selectionBackground": "Hintergrundfarbe der Textauswahl in der Workbench (z. B. für Eingabefelder oder Textbereiche). Diese Farbe gilt nicht für die Auswahl im Editor. ", "textSeparatorForeground": "Farbe für Text-Trennzeichen.", "textLinkForeground": "Vordergrundfarbe für Links im Text.", - "textLinkActiveForeground": "Vordergrundfarbe für aktive Links im Text.", + "textLinkActiveForeground": "Vordergrundfarbe für angeklickte Links im Text und beim Zeigen darauf mit der Maus.", "textPreformatForeground": "Vordergrundfarbe für vorformatierte Textsegmente.", "textBlockQuoteBackground": "Hintergrundfarbe für block quotes im Text.", "textBlockQuoteBorder": "Rahmenfarbe für block quotes im Text.", @@ -48,6 +48,8 @@ "listDropBackground": "Drag & Drop-Hintergrund der Liste/Struktur, wenn Elemente mithilfe der Maus verschoben werden.", "highlight": "Vordergrundfarbe der Liste/Struktur zur Trefferhervorhebung beim Suchen innerhalb der Liste/Struktur.", "invalidItemForeground": "Liste/Baum Vordergrundfarbe für ungültige Elemente, z. B. eine ungelöste Wurzel im Explorer.", + "listErrorForeground": "Vordergrundfarbe für Listenelemente, die Fehler enthalten.", + "listWarningForeground": "Vordergrundfarbe für Listenelemente, die Warnungen enthalten.", "pickerGroupForeground": "Schnellauswahlfarbe für das Gruppieren von Bezeichnungen.", "pickerGroupBorder": "Schnellauswahlfarbe für das Gruppieren von Rahmen.", "buttonForeground": "Vordergrundfarbe der Schaltfläche.", @@ -58,7 +60,7 @@ "scrollbarShadow": "Schatten der Scrollleiste, um anzuzeigen, dass die Ansicht gescrollt wird.", "scrollbarSliderBackground": "Hintergrundfarbe vom Scrollbar-Schieber", "scrollbarSliderHoverBackground": "Hintergrundfarbe des Schiebereglers, wenn darauf gezeigt wird.", - "scrollbarSliderActiveBackground": "Hintergrundfarbe des Schiebereglers, wenn dieser aktiv ist.", + "scrollbarSliderActiveBackground": "Hintergrundfarbe des Schiebereglers, wenn darauf geklickt wird.", "progressBarBackground": "Hintergrundfarbe des Fortschrittbalkens, der für lang ausgeführte Vorgänge angezeigt werden kann.", "editorBackground": "Hintergrundfarbe des Editors.", "editorForeground": "Standardvordergrundfarbe des Editors.", @@ -75,6 +77,7 @@ "editorFindMatchBorder": "Randfarbe des aktuellen Suchergebnisses.", "findMatchHighlightBorder": "Randfarbe der anderen Suchtreffer.", "findRangeHighlightBorder": "Rahmenfarbe des Bereichs zur Einschränkung der Suche. Die Farbe muss durchsichtig sein, um dahinterliegende Dekorationen nicht zu verbergen.", + "findWidgetResizeBorder": "Rahmenfarbe der Größenänderungsleiste im Suchwidget.", "hoverHighlight": "Hervorhebung eines Worts, unter dem ein Mauszeiger angezeigt wird. Die Farbe muss durchsichtig sein, um dahinterliegende Dekorationen nicht zu verbergen. ", "hoverBackground": "Background color of the editor hover.", "hoverBorder": "Rahmenfarbe des Editor-Mauszeigers.", diff --git a/i18n/deu/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.i18n.json b/i18n/deu/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.i18n.json index 3077316f15..963c535d99 100644 --- a/i18n/deu/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.i18n.json +++ b/i18n/deu/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.i18n.json @@ -6,5 +6,5 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "confirmUrl": "Soll die Erweiterung {0} die folgende URL öffnen?" + "confirmUrl": "Darf eine Erweiterung diese URL öffnen?" } \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json b/i18n/deu/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json index d4fffac7aa..f7f318e718 100644 --- a/i18n/deu/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json +++ b/i18n/deu/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json @@ -8,13 +8,12 @@ ], "vscode.extension.contributes.views.containers.id": "Eindeutige ID, die zum Bestimmen des Containers verwendet wird, in dem Ansichten mithilfe des Beitragspunkts \"views\" beigetragen werden können.", "vscode.extension.contributes.views.containers.title": "Visuell lesbare Zeichenfolge zum Rendern des Containers", - "vscode.extension.contributes.views.containers.icon": "Pfad zum Containersymbol. Symbole sind 24x24 groß und zentriert in einem Rechteck (50x40), und ihre Füllfarbe ist \"rgb(215, 218, 224)\" oder \"#d7dae0\". SVG-Symbole werden empfohlen, es wird allerdings jeder Bilddateityp akzeptiert.", + "vscode.extension.contributes.views.containers.icon": "Pfad zum Containersymbol. Symbole sind 24×24 groß und in einem Rechteck (50×40) zentriert. Die Füllfarbe ist \"rgb(215, 218, 224)\" bzw. \"#d7dae0\". Zwar werden alle Bilddateitypen akzeptiert, es werden jedoch SVG-Symbole empfohlen.", "vscode.extension.contributes.viewsContainers": "Trägt Ansichtencontainer zum Editor bei", "views.container.activitybar": "Trägt Ansichtencontainer zur Aktivitätsleiste bei", "test": "Test", - "proposed": "Der Beitrag \"viewsContainers\" ist nur verfügbar, wenn er außerhalb der Entwicklung ausgeführt wird oder mithilfe des folgenden Befehlszeilenschalters: --enable-proposed-api {0}", "requirearray": "Ansichtencontainer müssen ein Array sein", - "requireidstring": "Die Eigenschaft \"{0}\" ist erforderlich. Sie muss vom Typ \"string\" sein. Nur alphanumerische Buchstaben, \"_\", \"-\" sind zulässig.", + "requireidstring": "Die Eigenschaft \"{0}\" ist erforderlich. Sie muss vom Typ \"string\" sein. Nur alphanumerische Buchstaben sowie \"_\" und \"-\" sind zulässig.", "requirestring": "Die Eigenschaft \"{0}\" ist erforderlich. Sie muss vom Typ \"string\" sein.", "showViewlet": "{0} anzeigen", "view": "Anzeigen" diff --git a/i18n/deu/src/vs/workbench/browser/actions/workspaceActions.i18n.json b/i18n/deu/src/vs/workbench/browser/actions/workspaceActions.i18n.json index 039a196583..5b016a4c46 100644 --- a/i18n/deu/src/vs/workbench/browser/actions/workspaceActions.i18n.json +++ b/i18n/deu/src/vs/workbench/browser/actions/workspaceActions.i18n.json @@ -15,5 +15,5 @@ "saveWorkspace": "Arbeitsbereich speichern", "openWorkspaceAction": "Arbeitsbereich öffnen...", "openWorkspaceConfigFile": "Konfigurationsdatei des Arbeitsbereichs öffnen", - "openFolderAsWorkspaceInNewWindow": "Ordner als Arbeitsbereich in neuem Fenster öffnen" + "duplicateWorkspaceInNewWindow": "Duplikat des Arbeitsbereichs in neuem Fenster erstellen" } \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/browser/parts/panel/panelPart.i18n.json b/i18n/deu/src/vs/workbench/browser/parts/panel/panelPart.i18n.json index d91a0ba4d8..782f9ecbd3 100644 --- a/i18n/deu/src/vs/workbench/browser/parts/panel/panelPart.i18n.json +++ b/i18n/deu/src/vs/workbench/browser/parts/panel/panelPart.i18n.json @@ -1,8 +1,10 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the Source EULA. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ -// Do not edit this file. It is machine generated. { - "panelSwitcherBarAriaLabel": "Umschaltung für aktiven Bereich" + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "hidePanel": "Bereich ausblenden" } \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/browser/parts/quickopen/quickOpenController.i18n.json b/i18n/deu/src/vs/workbench/browser/parts/quickopen/quickOpenController.i18n.json index 982c1d663d..ac9a16f0e8 100644 --- a/i18n/deu/src/vs/workbench/browser/parts/quickopen/quickOpenController.i18n.json +++ b/i18n/deu/src/vs/workbench/browser/parts/quickopen/quickOpenController.i18n.json @@ -6,8 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "inputModeEntryDescription": "{0} (Drücken Sie die EINGABETASTE zur Bestätigung oder ESC, um den Vorgang abzubrechen.)", - "inputModeEntry": "Drücken Sie die EINGABETASTE, um Ihre Eingabe zu bestätigen, oder ESC, um den Vorgang abzubrechen.", "emptyPicks": "Es sind keine Einträge zur Auswahl verfügbar.", "quickOpenInput": "Geben Sie \"?\" ein, um Hilfe zu den Aktionen zu erhalten, die hier zur Verfügung stehen.", "historyMatches": "zuletzt geöffnet", diff --git a/i18n/deu/src/vs/workbench/browser/parts/views/viewsViewlet.i18n.json b/i18n/deu/src/vs/workbench/browser/parts/views/viewsViewlet.i18n.json index 3dd2270310..6291adcc64 100644 --- a/i18n/deu/src/vs/workbench/browser/parts/views/viewsViewlet.i18n.json +++ b/i18n/deu/src/vs/workbench/browser/parts/views/viewsViewlet.i18n.json @@ -6,5 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "cannot toggle": "Für diese Sicht {0} kann die Sichtbarkeit nicht umgeschaltet werden.", + "cannot show": "Für diese Sicht \"{0}\" kann die Sichtbarkeit nicht umgeschaltet werden, weil sie aufgrund ihrer \"when\"-Bedingung ausgeblendet ist.", "hideView": "Ausblenden" } \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/common/theme.i18n.json b/i18n/deu/src/vs/workbench/common/theme.i18n.json index 002d8f7fe0..8c78eaf1bc 100644 --- a/i18n/deu/src/vs/workbench/common/theme.i18n.json +++ b/i18n/deu/src/vs/workbench/common/theme.i18n.json @@ -11,8 +11,10 @@ "tabHoverBackground": "Hintergrundfarbe der Registerkarte beim Daraufzeigen. Registerkarten sind die Container für Editoren im Editorbereich. In einer Editorgruppe können mehrere Registerkarten geöffnet werden. Mehrere Editorgruppen können vorhanden sein.", "tabUnfocusedHoverBackground": "Hintergrundfarbe für Registerkarten in einer unfokussierten Gruppe beim Daraufzeigen. Registerkarten sind die Container für Editoren im Editor-Bereich. In einer Editor-Gruppe können mehrere Registerkarten geöffnet werden. Mehrere Editor-Gruppen sind möglich.", "tabBorder": "Rahmen zum Trennen von Registerkarten. Registerkarten sind die Container für Editoren im Editor-Bereich. In einer Editor-Gruppe können mehrere Registerkarten geöffnet werden. Mehrere Editor-Gruppen sind möglich.", - "tabActiveBorder": "Rahmen zum Hervorheben aktiver Registerkarten. Registerkarten sind die Container für Editoren im Editor-Bereich. In einer Editor-Gruppe können mehrere Registerkarten geöffnet werden. Mehrere Editor-Gruppen sind möglich.", - "tabActiveUnfocusedBorder": "Rahmen zum Hervorheben aktiver Registerkarten in einer unfokussierten Gruppe. Registerkarten sind die Container für Editoren im Editor-Bereich. In einer Editor-Gruppe können mehrere Registerkarten geöffnet werden. Mehrere Editor-Gruppen sind möglich.", + "tabActiveBorder": "Rahmen am unteren Rand einer aktiven Registerkarte. Registerkarten sind die Container für Editoren im Editor-Bereich. In einer Editor-Gruppe können mehrere Registerkarten geöffnet werden. Mehrere Editor-Gruppen sind möglich.", + "tabActiveBorderTop": "Rahmen am oberen Rand einer aktiven Registerkarte. Registerkarten sind die Container für Editoren im Editor-Bereich. In einer Editor-Gruppe können mehrere Registerkarten geöffnet werden. Mehrere Editor-Gruppen sind möglich.", + "tabActiveUnfocusedBorder": "Rahmen am unteren Rand einer aktiven Registerkarte in einer unfokussierten Gruppe. Registerkarten sind die Container für Editoren im Editor-Bereich. In einer Editor-Gruppe können mehrere Registerkarten geöffnet werden. Mehrere Editor-Gruppen sind möglich.", + "tabActiveUnfocusedBorderTop": "Rahmen am oberen Rand einer aktiven Registerkarte in einer unfokussierten Gruppe. Registerkarten sind die Container für Editoren im Editor-Bereich. In einer Editor-Gruppe können mehrere Registerkarten geöffnet werden. Mehrere Editor-Gruppen sind möglich.", "tabHoverBorder": "Rahmen zum Hervorheben von Registerkarten beim Daraufzeigen. Registerkarten sind die Container für Editoren im Editor-Bereich. In einer Editor-Gruppe können mehrere Registerkarten geöffnet werden. Mehrere Editor-Gruppen sind möglich.", "tabUnfocusedHoverBorder": "Rahmen zum Hervorheben von Registerkarten in einer unfokussierten Gruppe beim Daraufzeigen. Registerkarten sind die Container für Editoren im Editor-Bereich. In einer Editor-Gruppe können mehrere Registerkarten geöffnet werden. Mehrere Editor-Gruppen sind möglich.", "tabActiveForeground": "Vordergrundfarbe der aktiven Registerkarte in einer aktiven Gruppe. Registerkarten sind die Container für Editors im Editorbereich. In einer Editorgruppe können mehrere Registerkarten geöffnet werden. Mehrere Editorgruppen können vorhanden sein.", diff --git a/i18n/deu/src/vs/workbench/parts/codeEditor/electron-browser/largeFileOptimizations.i18n.json b/i18n/deu/src/vs/workbench/parts/codeEditor/electron-browser/largeFileOptimizations.i18n.json new file mode 100644 index 0000000000..badefe674f --- /dev/null +++ b/i18n/deu/src/vs/workbench/parts/codeEditor/electron-browser/largeFileOptimizations.i18n.json @@ -0,0 +1,13 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "largeFile": "{0}: Tokenisierung, Umbruch und Faltung wurden für diese große Datei deaktiviert, um die Speicherauslastung zu verringern und ein Einfrieren oder einen Absturz zu vermeiden.", + "neverShowAgain": "Verstanden, nicht mehr anzeigen", + "removeOptimizations": "Aktivieren von Funktionen erzwingen", + "reopenFilePrompt": "Bitte öffnen Sie die Datei erneut, damit diese Einstellung wirksam wird." +} \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/debug/browser/debugActions.i18n.json b/i18n/deu/src/vs/workbench/parts/debug/browser/debugActions.i18n.json index b190a00a18..a5b05810d3 100644 --- a/i18n/deu/src/vs/workbench/parts/debug/browser/debugActions.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/debug/browser/debugActions.i18n.json @@ -41,7 +41,7 @@ "debugConsoleAction": "Debugging-Konsole", "unreadOutput": "Neue Ausgabe in Debugging-Konsole", "debugFocusConsole": "Focus-Debugging-Konsole", - "focusProcess": "Fokus auf Prozess", + "focusSession": "Fokus auf Sitzung", "stepBackDebug": "Schritt zurück", "reverseContinue": "Umkehren" } \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/debug/browser/debugCommands.i18n.json b/i18n/deu/src/vs/workbench/parts/debug/browser/debugCommands.i18n.json index 1654780001..a3ed83ce38 100644 --- a/i18n/deu/src/vs/workbench/parts/debug/browser/debugCommands.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/debug/browser/debugCommands.i18n.json @@ -7,7 +7,7 @@ "Do not edit this file. It is machine generated." ], "noFolderDebugConfig": "Öffnen Sie bitte einen Ordner, um erweitertes Debuggen zu konfigurieren.", - "columnBreakpoint": "Spaltenhaltepunkt", + "inlineBreakpoint": "Inlinehaltepunkt", "debug": "Debuggen", - "addColumnBreakpoint": "Spaltenhaltepunkt hinzufügen" + "addInlineBreakpoint": "Inlinehaltepunkt hinzufügen" } \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/debug/browser/debugEditorActions.i18n.json b/i18n/deu/src/vs/workbench/parts/debug/browser/debugEditorActions.i18n.json index 938ba8aa98..6c12dd7268 100644 --- a/i18n/deu/src/vs/workbench/parts/debug/browser/debugEditorActions.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/debug/browser/debugEditorActions.i18n.json @@ -12,5 +12,7 @@ "runToCursor": "Ausführen bis Cursor", "debugEvaluate": "Debuggen: Auswerten", "debugAddToWatch": "Debuggen: Zur Überwachung hinzufügen", - "showDebugHover": "Debuggen: Hover anzeigen" + "showDebugHover": "Debuggen: Hover anzeigen", + "goToNextBreakpoint": "Debuggen: Zum nächsten Haltepunkt wechseln", + "goToPreviousBreakpoint": "Debuggen: Zum vorherigen Haltepunkt wechseln" } \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/debug/browser/debugViewlet.i18n.json b/i18n/deu/src/vs/workbench/parts/debug/browser/debugViewlet.i18n.json index ebd94c1d8e..a42dd180b2 100644 --- a/i18n/deu/src/vs/workbench/parts/debug/browser/debugViewlet.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/debug/browser/debugViewlet.i18n.json @@ -6,6 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "startAdditionalSession": "Zusätzliche Session starten", "debugFocusVariablesView": "Fokus-Variablen", "debugFocusWatchView": "Fokus-Watch", "debugFocusCallStackView": "Fokus-CallStack", diff --git a/i18n/deu/src/vs/workbench/parts/debug/common/debugSchemas.i18n.json b/i18n/deu/src/vs/workbench/parts/debug/common/debugSchemas.i18n.json new file mode 100644 index 0000000000..896264443a --- /dev/null +++ b/i18n/deu/src/vs/workbench/parts/debug/common/debugSchemas.i18n.json @@ -0,0 +1,38 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "vscode.extension.contributes.debuggers": "Trägt Debugadapter bei.", + "vscode.extension.contributes.debuggers.type": "Der eindeutige Bezeichner für diese Debugadapter.", + "vscode.extension.contributes.debuggers.label": "Der Anzeigename für diese Debugadapter.", + "vscode.extension.contributes.debuggers.program": "Der Pfad zum Debugadapterprogramm. Der Pfad ist absolut oder relativ zum Erweiterungsordner.", + "vscode.extension.contributes.debuggers.args": "Optionale Argumente, die an den Adapter übergeben werden sollen.", + "vscode.extension.contributes.debuggers.runtime": "Optionale Laufzeit für den Fall, dass das Programmattribut keine ausführbare Datei ist und eine Laufzeit erfordert.", + "vscode.extension.contributes.debuggers.runtimeArgs": "Optionale Laufzeitargumente.", + "vscode.extension.contributes.debuggers.variables": "Eine Zuordnung von interaktiven Variablen (z. B. \"${action.pickProcess}\") in \"launch.json\" zu einem Befehl.", + "vscode.extension.contributes.debuggers.initialConfigurations": "Konfigurationen zum Generieren der anfänglichen Datei \"launch.json\".", + "vscode.extension.contributes.debuggers.languages": "Liste der Sprachen, für die die Debugerweiterung als \"Standarddebugger\" angesehen werden kann", + "vscode.extension.contributes.debuggers.adapterExecutableCommand": "Wenn dies festgelegt ist, ruft der VS Code diesen Befehl auf, um den ausführbaren Pfad des Debugadapters und die zu übergebenden Argumente zu bestimmen.", + "vscode.extension.contributes.debuggers.configurationSnippets": "Snippets zum Hinzufügen neuer Konfigurationen in \"launch.json\".", + "vscode.extension.contributes.debuggers.configurationAttributes": "JSON-Schemakonfigurationen zum Überprüfen von \"launch.json\".", + "vscode.extension.contributes.debuggers.windows": "Windows-spezifische Einstellungen.", + "vscode.extension.contributes.debuggers.windows.runtime": "Die für Windows verwendete Laufzeit.", + "vscode.extension.contributes.debuggers.osx": "macOS-spezifische Einstellungen.", + "vscode.extension.contributes.debuggers.osx.runtime": "Für macOS verwendete Laufzeit.", + "vscode.extension.contributes.debuggers.linux": "Linux-spezifische Einstellungen.", + "vscode.extension.contributes.debuggers.linux.runtime": "Die für Linux verwendete Laufzeit.", + "vscode.extension.contributes.breakpoints": "Trägt Haltepunkte bei.", + "vscode.extension.contributes.breakpoints.language": "Lässt Haltepunkte für diese Sprache zu.", + "app.launch.json.title": "Starten", + "app.launch.json.version": "Die Version dieses Dateiformats.", + "app.launch.json.configurations": "Die Liste der Konfigurationen. Fügen Sie neue Konfigurationen hinzu, oder bearbeiten Sie vorhandene Konfigurationen mit IntelliSense.", + "app.launch.json.compounds": "Liste der Verbundelemente. Jeder Verbund verweist auf mehrere Konfigurationen, die zusammen gestartet werden.", + "app.launch.json.compound.name": "Name des Verbunds. Wird im Dropdownmenü der Startkonfiguration angezeigt.", + "useUniqueNames": "Verwenden Sie eindeutige Konfigurationsnamen.", + "app.launch.json.compound.folder": "Name des Ordners, in dem sich der Verbund befindet.", + "app.launch.json.compounds.configurations": "Namen von Konfigurationen, die als Bestandteil dieses Verbunds gestartet werden." +} \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/debug/electron-browser/callStackView.i18n.json b/i18n/deu/src/vs/workbench/parts/debug/electron-browser/callStackView.i18n.json index b7e67e4080..bb16f54ea5 100644 --- a/i18n/deu/src/vs/workbench/parts/debug/electron-browser/callStackView.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/debug/electron-browser/callStackView.i18n.json @@ -9,7 +9,7 @@ "callstackSection": "Aufruflistenabschnitt", "debugStopped": "Angehalten bei {0}", "callStackAriaLabel": "Aufrufliste debuggen", - "process": "Prozess", + "session": "Sitzung", "paused": "Angehalten", "running": "Wird ausgeführt", "thread": "Thread", diff --git a/i18n/deu/src/vs/workbench/parts/debug/electron-browser/debug.contribution.i18n.json b/i18n/deu/src/vs/workbench/parts/debug/electron-browser/debug.contribution.i18n.json index 8a4cb86f55..cc4868f2cf 100644 --- a/i18n/deu/src/vs/workbench/parts/debug/electron-browser/debug.contribution.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/debug/electron-browser/debug.contribution.i18n.json @@ -21,11 +21,12 @@ "allowBreakpointsEverywhere": "Ermöglicht das Festlegen von Haltepunkten für alle Dateien.", "openExplorerOnEnd": "Hiermit wird am Ende einer Debugsitzung automatisch eine Explorer-Ansicht geöffnet.", "inlineValues": "Variablenwerte beim Debuggen in Editor eingebunden anzeigen", - "hideActionBar": "Steuert, ob die unverankerte Debugaktionsleiste ausgeblendet werden soll", + "toolBarLocation": "Steuert die Position der Debugsymbolleiste. Mögliche Werte sind \"floating\" (schwebend in allen Ansichten), \"docked\" (verankert in der Debugansicht) oder \"hidden\" (ausgeblendet).", "never": "Debuggen nie in Statusleiste anzeigen", "always": "Debuggen immer in Statusleiste anzeigen", "onFirstSessionStart": "Debuggen nur in Statusleiste anzeigen, nachdem das Debuggen erstmals gestartet wurde", "showInStatusBar": "Steuert, wann die Debug-Statusleiste angezeigt werden soll", "openDebug": "Steuert, ob das Debug-Menü beim Start der Debugsitzung offen ist.", + "enableAllHovers": "Legt fest, ob Nicht-Debughover beim Debuggen aktiviert sind. Bei \"true\" werden die Hoveranbieter aufgerufen, um einen Hover bereitstellen. Reguläre Hover werden auch bei der Einstellung \"true\" nicht angezeigt.", "launch": "Startkonfiguration für globales Debuggen. Sollte als Alternative zu \"launch.json\" verwendet werden, das übergreifend von mehreren Arbeitsbereichen genutzt wird" } \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.i18n.json b/i18n/deu/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.i18n.json index 49b0d91b1e..7c5d10d550 100644 --- a/i18n/deu/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.i18n.json @@ -2,39 +2,10 @@ "": [ "--------------------------------------------------------------------------------------------", "Copyright (c) Microsoft Corporation. All rights reserved.", - "Licensed under the Source EULA. See License.txt in the project root for license information.", + "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "vscode.extension.contributes.debuggers": "Trägt Debugadapter bei.", - "vscode.extension.contributes.debuggers.type": "Der eindeutige Bezeichner für diese Debugadapter.", - "vscode.extension.contributes.debuggers.label": "Der Anzeigename für diese Debugadapter.", - "vscode.extension.contributes.debuggers.program": "Der Pfad zum Debugadapterprogramm. Der Pfad ist absolut oder relativ zum Erweiterungsordner.", - "vscode.extension.contributes.debuggers.args": "Optionale Argumente, die an den Adapter übergeben werden sollen.", - "vscode.extension.contributes.debuggers.runtime": "Optionale Laufzeit für den Fall, dass das Programmattribut keine ausführbare Datei ist und eine Laufzeit erfordert.", - "vscode.extension.contributes.debuggers.runtimeArgs": "Optionale Laufzeitargumente.", - "vscode.extension.contributes.debuggers.variables": "Eine Zuordnung von interaktiven Variablen (z. B. \"${action.pickProcess}\") in \"launch.json\" zu einem Befehl.", - "vscode.extension.contributes.debuggers.initialConfigurations": "Konfigurationen zum Generieren der anfänglichen Datei \"launch.json\".", - "vscode.extension.contributes.debuggers.languages": "Liste der Sprachen, für die die Debugerweiterung als \"Standarddebugger\" angesehen werden kann", - "vscode.extension.contributes.debuggers.adapterExecutableCommand": "Wenn dies festgelegt ist, ruft der VS Code diesen Befehl auf, um den ausführbaren Pfad des Debugadapters und die zu übergebenden Argumente zu bestimmen.", - "vscode.extension.contributes.debuggers.configurationSnippets": "Snippets zum Hinzufügen neuer Konfigurationen in \"launch.json\".", - "vscode.extension.contributes.debuggers.configurationAttributes": "JSON-Schemakonfigurationen zum Überprüfen von \"launch.json\".", - "vscode.extension.contributes.debuggers.windows": "Windows-spezifische Einstellungen.", - "vscode.extension.contributes.debuggers.windows.runtime": "Die für Windows verwendete Laufzeit.", - "vscode.extension.contributes.debuggers.osx": "macOS-spezifische Einstellungen.", - "vscode.extension.contributes.debuggers.osx.runtime": "Für macOS verwendete Laufzeit.", - "vscode.extension.contributes.debuggers.linux": "Linux-spezifische Einstellungen.", - "vscode.extension.contributes.debuggers.linux.runtime": "Die für Linux verwendete Laufzeit.", - "vscode.extension.contributes.breakpoints": "Trägt Haltepunkte bei.", - "vscode.extension.contributes.breakpoints.language": "Lässt Haltepunkte für diese Sprache zu.", - "app.launch.json.title": "Starten", - "app.launch.json.version": "Die Version dieses Dateiformats.", - "app.launch.json.configurations": "Die Liste der Konfigurationen. Fügen Sie neue Konfigurationen hinzu, oder bearbeiten Sie vorhandene Konfigurationen mit IntelliSense.", - "app.launch.json.compounds": "Liste der Verbundelemente. Jeder Verbund verweist auf mehrere Konfigurationen, die zusammen gestartet werden.", - "app.launch.json.compound.name": "Name des Verbunds. Wird im Dropdownmenü der Startkonfiguration angezeigt.", - "useUniqueNames": "Verwenden Sie eindeutige Konfigurationsnamen.", - "app.launch.json.compound.folder": "Name des Ordners, in dem sich der Verbund befindet.", - "app.launch.json.compounds.configurations": "Namen von Konfigurationen, die als Bestandteil dieses Verbunds gestartet werden.", "debugNoType": "Der Debugger \"type\" darf nicht ausgelassen werden und muss den Typ \"string\" aufweisen.", "selectDebug": "Umgebung auswählen", "DebugConfig.failed": "Die Datei \"launch.json\" kann nicht im Ordner \".vscode\" erstellt werden ({0}).", diff --git a/i18n/deu/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json b/i18n/deu/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json index 3841294e91..9f7922a839 100644 --- a/i18n/deu/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json @@ -13,15 +13,15 @@ "disableBreakpoint": "{0} deaktivieren", "enableBreakpoint": "{0} aktivieren", "removeBreakpoints": "Haltepunkte entfernen", - "removeBreakpointOnColumn": "Haltepunkt in Spalte {0} entfernen", + "removeInlineBreakpointOnColumn": "Inlinehaltepunkt in Spalte {0} entfernen", "removeLineBreakpoint": "Zeilenhaltepunkt entfernen", "editBreakpoints": "Haltepunkte bearbeiten", - "editBreakpointOnColumn": "Haltepunkt in Spalte {0} bearbeiten", + "editInlineBreakpointOnColumn": "Inlinehaltepunkt in Spalte {0} bearbeiten", "editLineBrekapoint": "Zeilenhaltepunkt bearbeiten", "enableDisableBreakpoints": "Haltepunkte aktivieren/deaktivieren", - "disableColumnBreakpoint": "Haltepunkt in Spalte {0} deaktivieren", + "disableInlineColumnBreakpoint": "Inlinehaltepunkt in Spalte {0} deaktivieren", "disableBreakpointOnLine": "Zeilenhaltepunkt deaktivieren", - "enableBreakpoints": "Haltepunkt in Spalte {0} aktivieren", + "enableBreakpoints": "Inlinehaltepunkt in Spalte {0} aktivieren", "enableBreakpointOnLine": "Zeilenhaltepunkt aktivieren", "addBreakpoint": "Haltepunkt hinzufügen", "addConditionalBreakpoint": "Bedingten Haltepunkt hinzufügen...", diff --git a/i18n/deu/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.i18n.json b/i18n/deu/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.i18n.json index 78913a24b2..34a1a3d6da 100644 --- a/i18n/deu/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.i18n.json @@ -16,9 +16,13 @@ "repository": "Repository", "license": "Lizenz", "details": "Details", + "detailstooltip": "Details zur Erweiterung, die aus der Datei \"README.md\" der Erweiterung gerendert wurden", "contributions": "Beiträge", + "contributionstooltip": "Listet Beiträge zu VS Code durch diese Erweiterung auf", "changelog": "ChangeLog", + "changelogtooltip": "Updateverlauf der Erweiterung, der aus der Datei \"CHANGELOG.md\" der Erweiterung gerendert wurde", "dependencies": "Abhängigkeiten", + "dependenciestooltip": "Listet Erweiterungen auf, von denen diese Erweiterung abhängig ist", "noReadme": "Keine INFODATEI verfügbar.", "noChangelog": "Es ist kein ChangeLog verfügbar.", "noContributions": "Keine Beiträge", @@ -30,6 +34,10 @@ "debuggers": "Debugger ({0})", "debugger name": "Name", "debugger type": "Typ", + "viewContainers": "Container anzeigen ({0})", + "view container id": "ID", + "view container title": "Titel", + "view container location": "Wo", "views": "Ansichten ({0})", "view id": "ID", "view name": "Name", diff --git a/i18n/deu/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json b/i18n/deu/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json index 163437737c..0ad48e768b 100644 --- a/i18n/deu/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json @@ -8,7 +8,6 @@ ], "neverShowAgain": "Nicht mehr anzeigen", "searchMarketplace": "Marketplace durchsuchen", - "showLanguagePackExtensions": "Der Marketplace enthält Erweiterungen, die beim Lokalisieren von VS Code in die Sprache \"{0}\" behilflich sein können.", "dynamicWorkspaceRecommendation": "Diese Erweiterung ist für Sie möglicherweise interessant, da sie von vielen anderen Benutzern des Repositorys {0} verwendet wird.", "exeBasedRecommendation": "Diese Erweiterung wird empfohlen, da Sie {0} installiert haben.", "fileBasedRecommendation": "Ausgehend von den kürzlich geöffneten Dateien wird diese Erweiterung empfohlen.", diff --git a/i18n/deu/src/vs/workbench/parts/extensions/node/extensionsWorkbenchService.i18n.json b/i18n/deu/src/vs/workbench/parts/extensions/node/extensionsWorkbenchService.i18n.json index 52746fae6a..76d9a0da43 100644 --- a/i18n/deu/src/vs/workbench/parts/extensions/node/extensionsWorkbenchService.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/extensions/node/extensionsWorkbenchService.i18n.json @@ -10,12 +10,12 @@ "malicious": "Diese Erweiterung wird als problematisch gemeldet.", "installingMarketPlaceExtension": "Die Erweiterung wird aus dem Marketplace installiert …", "uninstallingExtension": "Die Erweiterung wird deinstalliert …", - "enableDependeciesConfirmation": "Durch Aktivieren von \"{0}\" werden auch die dazugehörigen Abhängigkeiten aktiviert. Möchten Sie fortfahren?", + "enableDependeciesConfirmation": "Durch das Aktivieren einer Erweiterung werden auch deren Abhängigkeiten aktiviert. Möchten Sie den Vorgang fortsetzen?", "enable": "Ja", "doNotEnable": "Nein", - "disableDependeciesConfirmation": "Möchten Sie nur \"{0}\" oder auch die dazugehörigen Abhängigkeiten deaktivieren?", - "disableOnly": "Nur", - "disableAll": "Alle", + "disableDependeciesConfirmation": "Möchten Sie die Abhängigkeiten der Erweiterungen ebenfalls deaktivieren?", + "yes": "Ja", + "no": "Nein", "cancel": "Abbrechen", "singleDependentError": "Die Erweiterung \"{0}\" kann nicht deaktiviert werden. Die Erweiterung \"{1}\" ist davon abhängig.", "twoDependentsError": "Die Erweiterung \"{0}\" kann nicht deaktiviert werden. Die Erweiterungen \"{1}\" und \"{2}\" sind davon abhängig.", diff --git a/i18n/deu/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.i18n.json b/i18n/deu/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.i18n.json index d3b6302160..a450d3a29c 100644 --- a/i18n/deu/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.i18n.json @@ -7,6 +7,7 @@ "Do not edit this file. It is machine generated." ], "updateLocale": "Möchten Sie die Sprache der Benutzeroberfläche von VS Code in {0} ändern und einen Neustart durchführen?", + "activateLanguagePack": "Möchten Sie VS Code neu starten, um das soeben installierte Language Pack zu aktivieren?", "yes": "Ja", "no": "Nein", "neverAgain": "Nicht mehr anzeigen", diff --git a/i18n/deu/src/vs/workbench/parts/localizations/electron-browser/localizationsActions.i18n.json b/i18n/deu/src/vs/workbench/parts/localizations/electron-browser/localizationsActions.i18n.json index ecb522366f..e54226aa42 100644 --- a/i18n/deu/src/vs/workbench/parts/localizations/electron-browser/localizationsActions.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/localizations/electron-browser/localizationsActions.i18n.json @@ -6,7 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "configureLocale": "Sprache konfigurieren", + "configureLocale": "Anzeigesprache konfigurieren", "displayLanguage": "Definiert die Anzeigesprache von VSCode.", "doc": "Unter {0} finden Sie eine Liste der unterstützten Sprachen.", "restart": "Das Ändern dieses Wertes erfordert einen Neustart von VSCode.", diff --git a/i18n/deu/src/vs/workbench/parts/outline/electron-browser/outline.contribution.i18n.json b/i18n/deu/src/vs/workbench/parts/outline/electron-browser/outline.contribution.i18n.json new file mode 100644 index 0000000000..7e236e6950 --- /dev/null +++ b/i18n/deu/src/vs/workbench/parts/outline/electron-browser/outline.contribution.i18n.json @@ -0,0 +1,12 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "name": "Gliederung", + "category.focus": "Datei", + "label.focus": "Fokus auf Gliederung" +} \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/outline/electron-browser/outlinePanel.i18n.json b/i18n/deu/src/vs/workbench/parts/outline/electron-browser/outlinePanel.i18n.json new file mode 100644 index 0000000000..beeeade9c2 --- /dev/null +++ b/i18n/deu/src/vs/workbench/parts/outline/electron-browser/outlinePanel.i18n.json @@ -0,0 +1,17 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "filter": "Filter", + "collapse": "Alle zuklappen", + "sortByPosition": "Sortieren nach: Position", + "sortByName": "Sortieren nach: Name", + "sortByKind": "Sortieren nach: Typ", + "live": "Cursor folgen", + "no-editor": "Es gibt keine Editoren geöffnet, die Informationen über die Gliederung geben können.", + "too-many-symbols": "Leider ist diese Datei zu groß, um eine Gliederung anzeigen zu können." +} \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/outline/electron-browser/outlineTree.i18n.json b/i18n/deu/src/vs/workbench/parts/outline/electron-browser/outlineTree.i18n.json new file mode 100644 index 0000000000..e35f2bd06e --- /dev/null +++ b/i18n/deu/src/vs/workbench/parts/outline/electron-browser/outlineTree.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "outline.title": "Zeile {0} in {1}" +} \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/output/browser/outputPanel.i18n.json b/i18n/deu/src/vs/workbench/parts/output/browser/outputPanel.i18n.json index 1008d8e237..db7dae2b0d 100644 --- a/i18n/deu/src/vs/workbench/parts/output/browser/outputPanel.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/output/browser/outputPanel.i18n.json @@ -6,6 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "output": "Ausgabe", "outputPanelWithInputAriaLabel": "{0}, Ausgabebereich", "outputPanelAriaLabel": "Ausgabebereich" } \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/preferences/browser/keybindingWidgets.i18n.json b/i18n/deu/src/vs/workbench/parts/preferences/browser/keybindingWidgets.i18n.json index 74d7877cb3..25f399ab9a 100644 --- a/i18n/deu/src/vs/workbench/parts/preferences/browser/keybindingWidgets.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/preferences/browser/keybindingWidgets.i18n.json @@ -6,6 +6,8 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "defineKeybinding.oneExists": "Diese Tastenzordnung ist 1 vorhandenen Befehl zugewiesen", + "defineKeybinding.existing": "Diese Tastenzordnung ist {0} vorhandenen Befehlen zugewiesen ", "defineKeybinding.initial": "Drücken Sie die gewünschte Tastenkombination, und betätigen Sie anschließend die EINGABETASTE.", "defineKeybinding.chordsTo": "Tastenkombination zu" } \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json b/i18n/deu/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json index 19ff10a082..50ba118401 100644 --- a/i18n/deu/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json @@ -7,6 +7,7 @@ "Do not edit this file. It is machine generated." ], "openRawDefaultSettings": "Raw-Standardeinstellungen öffnen", + "openSettings2": "Einstellungen öffnen (Vorschau)", "openSettings": "Einstellungen öffnen", "openGlobalSettings": "Benutzereinstellungen öffnen", "openGlobalKeybindings": "Tastaturkurzbefehle öffnen", diff --git a/i18n/deu/src/vs/workbench/parts/preferences/browser/settingsEditor2.i18n.json b/i18n/deu/src/vs/workbench/parts/preferences/browser/settingsEditor2.i18n.json new file mode 100644 index 0000000000..6e71ffcfae --- /dev/null +++ b/i18n/deu/src/vs/workbench/parts/preferences/browser/settingsEditor2.i18n.json @@ -0,0 +1,18 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "previewWarning": "Vorschau", + "previewLabel": "Dies ist eine Vorschau unseres neuen Einstellungs-Editors", + "SearchSettings.AriaLabel": "Einstellungen suchen", + "SearchSettings.Placeholder": "Einstellungen suchen", + "advancedCustomizationLabel": "Öffnen und bearbeiten Sie die folgende Datei, um erweiterte Anpassungen vorzunehmen:", + "openSettingsLabel": "settings.json", + "showOverriddenOnly": "Nur geänderte anzeigen", + "treeAriaLabel": "Einstellungen", + "feedbackButtonLabel": "Feedback geben" +} \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/preferences/browser/settingsTree.i18n.json b/i18n/deu/src/vs/workbench/parts/preferences/browser/settingsTree.i18n.json new file mode 100644 index 0000000000..995e0dc2c7 --- /dev/null +++ b/i18n/deu/src/vs/workbench/parts/preferences/browser/settingsTree.i18n.json @@ -0,0 +1,19 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "modifiedItemForeground": "Die Vordergrundfarbe für eine geänderte Einstellung.", + "workspace": "Arbeitsbereich", + "user": "Benutzer", + "resetButtonTitle": "Zurücksetzen", + "configured": "Geändert am", + "alsoConfiguredIn": "Auch geändert in", + "configuredIn": "Geändert in", + "editInSettingsJson": "In \"settings.json\" bearbeiten", + "settingRowAriaLabel": "{0} {1}, Einstellung", + "groupRowAriaLabel": "{0}, Gruppe" +} \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/preferences/electron-browser/preferences.contribution.i18n.json b/i18n/deu/src/vs/workbench/parts/preferences/electron-browser/preferences.contribution.i18n.json index 6d96aa610c..1deb001324 100644 --- a/i18n/deu/src/vs/workbench/parts/preferences/electron-browser/preferences.contribution.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/preferences/electron-browser/preferences.contribution.i18n.json @@ -7,6 +7,7 @@ "Do not edit this file. It is machine generated." ], "defaultPreferencesEditor": "Standardeditor für Einstellungen", + "settingsEditor2": "Einstellungs-Editor 2", "keybindingsEditor": "Editor für Tastenzuordnungen", "preferences": "Einstellungen" } \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/search/browser/searchActions.i18n.json b/i18n/deu/src/vs/workbench/parts/search/browser/searchActions.i18n.json index 12cb9f97eb..1951b4c07f 100644 --- a/i18n/deu/src/vs/workbench/parts/search/browser/searchActions.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/search/browser/searchActions.i18n.json @@ -12,6 +12,8 @@ "previousSearchExcludePattern": "Vorheriges Suchausschlussmuster anzeigen", "nextSearchTerm": "Nächsten Suchbegriff anzeigen", "previousSearchTerm": "Vorherigen Suchbegriff anzeigen", + "nextReplaceTerm": "Nächsten Such-/Ersetzungsbegriff anzeigen", + "previousReplaceTerm": "Vorherigen Such-/Ersetzungsbegriff anzeigen ", "findInFiles": "In Dateien suchen", "replaceInFiles": "In Dateien ersetzen", "RefreshAction.label": "Aktualisieren", diff --git a/i18n/deu/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json b/i18n/deu/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json index 5ce5bde400..24b953a60a 100644 --- a/i18n/deu/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json @@ -31,5 +31,5 @@ "search.followSymlinks": "Steuert, ob Symlinks während der Suche gefolgt werden.", "search.smartCase": "Sucht ohne Berücksichtigung von Groß-/Kleinschreibung, wenn das Muster kleingeschrieben ist, andernfalls wird mit Berücksichtigung von Groß-/Kleinschreibung gesucht.", "search.globalFindClipboard": "Steuert, ob die Suchansicht die freigegebene Suchzwischenablage auf macOS lesen oder verändern soll", - "search.location": "Steuert, ob die Suche als Ansicht in der Seitenleiste oder als Bedienfeld im Bedienfeldbereich angezeigt wird, damit horizontal mehr Platz zur Verfügung steht. In der nächsten Version wird das horizontale Layout im Bedienfeld verbessert, und dies wird keine Vorschau mehr sein." + "search.location": "Steuert, ob die Suche als Ansicht in der Seitenleiste oder als Bereich angezeigt wird (die zweite Variante bietet mehr Platz in der Horizontalen)." } \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/tasks/electron-browser/jsonSchema_v2.i18n.json b/i18n/deu/src/vs/workbench/parts/tasks/electron-browser/jsonSchema_v2.i18n.json index 7fbb2130f1..4747184dd8 100644 --- a/i18n/deu/src/vs/workbench/parts/tasks/electron-browser/jsonSchema_v2.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/tasks/electron-browser/jsonSchema_v2.i18n.json @@ -28,6 +28,7 @@ "JsonSchema.tasks.group.none": "Weist die Aufgabe keiner Gruppe zu.", "JsonSchema.tasks.group": "Definiert die Ausführungsgruppe, zu der diese Aufgabe gehört. Zum Hinzufügen der Aufgabe zur Buildgruppe wird \"build\" unterstützt und zum Hinzufügen zur Testgruppe \"test\".", "JsonSchema.tasks.type": "Definiert, ob die Aufgabe als Prozess oder als Befehl innerhalb einer Shell ausgeführt wird.", + "JsonSchema.commandArray": "Der auszuführende Shell-Befehl. Arrayelemente werden mit einem Leerzeichen verknüpft.", "JsonSchema.command.quotedString.value": "Der tatsächliche Sollwert", "JsonSchema.tasks.quoting.escape": "Fügt mithilfe des Escapezeichens der Shell vor Zeichen Escapezeichen ein (z. B. `  bei PowerShell und \\ bei Bash).", "JsonSchema.tasks.quoting.strong": "Setzt das Argument mithilfe des starken Anführungszeichens der Shell in Anführungszeichen (z. B. \" bei PowerShell und Bash).", diff --git a/i18n/deu/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.i18n.json b/i18n/deu/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.i18n.json index 519550fdee..3e2065b99e 100644 --- a/i18n/deu/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.i18n.json @@ -19,6 +19,7 @@ "terminal.integrated.copyOnSelection": "Wenn gesetzt, wird der im Terminal ausgewählte Text in die Zwischenablage kopiert.", "terminal.integrated.fontFamily": "Steuert die Schriftartfamilie des Terminals. Der Standardwert ist \"editor.fontFamily\".", "terminal.integrated.fontSize": "Steuert den Schriftgrad des Terminals in Pixeln.", + "terminal.integrated.letterSpacing": "Steuert den Buchstabenabstand im Terminal. Dies ist ein Integerwert, der die Anzahl der zusätzlichen Pixel zwischen den einzelnen Zeichen darstellt.", "terminal.integrated.lineHeight": "Steuert die Zeilenhöhe für das Terminal. Dieser Wert wird mit dem Schriftgrad des Terminals multipliziert, um die tatsächliche Zeilenhöhe in Pixeln zu erhalten.", "terminal.integrated.fontWeight": "Die innerhalb des Terminals zu verwendende Schriftbreite für nicht fetten Text.", "terminal.integrated.fontWeightBold": "Die innerhalb des Terminals zu verwendende Schriftbreite für fetten Text.", @@ -26,7 +27,8 @@ "terminal.integrated.cursorStyle": "Steuert den Stil des Terminalcursors.", "terminal.integrated.scrollback": "Steuert die maximale Anzahl von Zeilen, die das Terminal im Puffer beibehält.", "terminal.integrated.setLocaleVariables": "Steuert, ob Gebietsschemavariablen beim Start des Terminals festgelegt werden. Der Standardwert ist unter OS X TRUE und FALSE auf anderen Plattformen.", - "terminal.integrated.rightClickBehavior": "Steuert, wie das Terminal auf einen Rechtsklick reagiert. Möglich sind \"default\", \"copyPaste\", und \"selectWord\". \"default\" zeigt das Kontextmenü an, \"copyPaste\" kopiert, wenn eine Auswahl vorhanden ist, \"selectWord\" wählt das Wort unter dem Cursor aus und zeigt das Kontextmenü an.", + "terminal.integrated.rendererType": "Hiermit wird gesteuert, wie das Terminal gerendert wird. Mögliche Werte sind \"canvas\" für den (schnellen) Standardbereichsrenderer, \"dom\" für den als Ersatz gedachten DOM-basierten Renderer oder \"auto\" (hierbei bestimmt VS Code den geeignetsten Renderer automatisch). VS Code muss neu geladen werden, damit Änderungen wirksam werden.", + "terminal.integrated.rightClickBehavior": "Steuert, wie das Terminal auf Rechtsklicks reagiert. Mögliche Werte sind \"default\", \"copyPaste\" und \"selectWord\". Bei \"default\" wird das Kontextmenü angezeigt. Bei \"copyPaste\" wird, wenn eine Auswahl getroffen wurde, diese in die Zwischenablage kopiert oder, wenn keine Auswahl getroffen wurde, der Inhalt der Zwischenablage eingefügt. Bei \"selectWord\" schließlich wird das Wort unter dem Cursor ausgewählt und das Kontextmenü angezeigt.", "terminal.integrated.cwd": "Ein expliziter Startpfad zum Starten des Terminals, dies dient als das aktuelle Arbeitsverzeichnis (CWD) für den Shellprozess. Dies ist insbesondere in Arbeitsbereichseinstellungen praktisch, wenn das Stammverzeichnis kein passendes CWD ist.", "terminal.integrated.confirmOnExit": "Ob aktive Terminalsitzungen beim Beenden bestätigt werden sollen.", "terminal.integrated.enableBell": "Gibt an, ob die Terminalglocke aktiviert ist.", diff --git a/i18n/deu/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json b/i18n/deu/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json index dc99fa2383..17f468b874 100644 --- a/i18n/deu/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json @@ -57,5 +57,7 @@ "workbench.action.terminal.scrollToPreviousCommand": "Zu vorherigem Befehl scrollen", "workbench.action.terminal.scrollToNextCommand": "Zu nächstem Befehl scrollen", "workbench.action.terminal.selectToPreviousCommand": "Auswählen bis zu vorherigem Befehl", - "workbench.action.terminal.selectToNextCommand": "Auswählen bis zu nächstem Befehl" + "workbench.action.terminal.selectToNextCommand": "Auswählen bis zu nächstem Befehl", + "workbench.action.terminal.selectToPreviousLine": " Auswählen bis zur vorherigen Zeile ", + "workbench.action.terminal.selectToNextLine": "Auswählen bis zur nächsten Zeile" } \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.i18n.json b/i18n/deu/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.i18n.json index c4511678dd..aa2b4267c1 100644 --- a/i18n/deu/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.i18n.json @@ -9,6 +9,11 @@ "terminal.integrated.a11yBlankLine": "Leere Zeile", "terminal.integrated.a11yPromptLabel": "Terminaleingabe", "terminal.integrated.a11yTooMuchOutput": "Zu viele Ausgaben zum Anzeigen, navigieren Sie manuell zu den Zeilen, um sie zu lesen", + "yes": "Ja", + "terminal.rendererInAllNewTerminals": "Alle neu erstellten Terminals verwenden den Nicht-GPU-Renderer.", + "no": "Nein", + "dontShowAgain": "Nicht mehr anzeigen", + "terminal.slowRendering": "Der Standardrenderer für das integrierte Terminal ist auf Ihrem Computer offenbar langsam. Möchten Sie zum alternativen DOM-basierten Renderer wechseln? Hierdurch kann die Leistung verbessert werden. [Weitere Informationen zu Terminaleinstellungen](https://code.visualstudio.com/docs/editor/integrated-terminal#_changing-how-the-terminal-is-rendered)", "terminal.integrated.copySelection.noSelection": "Das Terminal enthält keine Auswahl zum Kopieren.", "terminal.integrated.exitedWithCode": "Der Terminalprozess wurde mit folgendem Exitcode beendet: {0}", "terminal.integrated.waitOnExit": "Betätigen Sie eine beliebige Taste, um das Terminal zu schließen.", diff --git a/i18n/deu/src/vs/workbench/parts/terminal/electron-browser/terminalPanel.i18n.json b/i18n/deu/src/vs/workbench/parts/terminal/electron-browser/terminalPanel.i18n.json index 7472ebf7b1..9728fd29eb 100644 --- a/i18n/deu/src/vs/workbench/parts/terminal/electron-browser/terminalPanel.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/terminal/electron-browser/terminalPanel.i18n.json @@ -6,6 +6,8 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "terminal.useMonospace": "\"monospace\" verwenden", + "terminal.monospaceOnly": "Das Terminal unterstützt nur Monospace-Schriftarten.", "copy": "Kopieren", "split": "Teilen", "paste": "Einfügen", diff --git a/i18n/deu/src/vs/workbench/parts/trust/electron-browser/unsupportedWorkspaceSettings.contribution.i18n.json b/i18n/deu/src/vs/workbench/parts/trust/electron-browser/unsupportedWorkspaceSettings.contribution.i18n.json index 263349083b..bd0406d499 100644 --- a/i18n/deu/src/vs/workbench/parts/trust/electron-browser/unsupportedWorkspaceSettings.contribution.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/trust/electron-browser/unsupportedWorkspaceSettings.contribution.i18n.json @@ -6,7 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "unsupportedWorkspaceSettings": "Dieser Arbeitsbereich enthält Einstellungen, die nur in den Benutzereinstellungen festgelegt werden können ({0}). Klicken Sie [hier]({1}), um mehr zu erfahren.", "openWorkspaceSettings": "Arbeitsbereichseinstellungen öffnen", "dontShowAgain": "Nicht mehr anzeigen", "unsupportedWorkspaceSettings": "Dieser Arbeitsbereich enthält Einstellungen, die nur in den Benutzereinstellungen festgelegt werden können ({0}). Klicken Sie [hier]({1}), um mehr zu erfahren." diff --git a/i18n/deu/src/vs/workbench/parts/update/electron-browser/update.i18n.json b/i18n/deu/src/vs/workbench/parts/update/electron-browser/update.i18n.json index 7ad30b14c4..dca9f59735 100644 --- a/i18n/deu/src/vs/workbench/parts/update/electron-browser/update.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/update/electron-browser/update.i18n.json @@ -20,7 +20,7 @@ "later": "Später", "updateAvailable": "Ein Update ist verfügbar: {0} {1}", "installUpdate": "Update installieren", - "updateInstalling": "{0} {1} wird im Hintergrund installiert. Wir informieren Sie, wenn dies abgeschlossen ist.", + "updateInstalling": "{0} {1} wird im Hintergrund installiert. Wir informieren Sie, wenn der Vorgng abgeschlossen ist.", "updateAvailableAfterRestart": "Starten Sie {0} neu, um das neueste Update zu installieren.", "updateNow": "Jetzt aktualisieren", "commandPalette": "Befehlspalette...", diff --git a/i18n/deu/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json b/i18n/deu/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json index c693d1cf95..32b9b62035 100644 --- a/i18n/deu/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json @@ -2,7 +2,7 @@ "": [ "--------------------------------------------------------------------------------------------", "Copyright (c) Microsoft Corporation. All rights reserved.", - "Licensed under the Source EULA. See License.txt in the project root for license information.", + "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], @@ -28,7 +28,7 @@ "welcomePage.installExtensionPacksDescription": "Unterstützung für {0} und {1} installieren", "welcomePage.moreExtensions": "mehr", "welcomePage.installKeymapDescription": "Einstellungen und Tastenzuordnungen", - "welcomePage.installKeymapExtension": "Installieren Sie die Einstellungen und Tastenkombinationen von {0} und {1}", + "welcomePage.installKeymapExtension": "Installieren Sie die Einstellungen und Tastenkombinationen von {0} und {1}.", "welcomePage.others": "Andere", "welcomePage.colorTheme": "Farbdesign", "welcomePage.colorThemeDescription": "Passen Sie das Aussehen des Editors und Ihres Codes an Ihre Wünsche an.", diff --git a/i18n/deu/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThrough.contribution.i18n.json b/i18n/deu/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThrough.contribution.i18n.json index 2ad8280b32..1ed1df70d3 100644 --- a/i18n/deu/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThrough.contribution.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThrough.contribution.i18n.json @@ -7,6 +7,5 @@ "Do not edit this file. It is machine generated." ], "walkThrough.editor.label": "Interaktiver Playground", - "help": "Hilfe", - "interactivePlayground": "Interaktiver Playground" + "help": "Hilfe" } \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/services/bulkEdit/electron-browser/bulkEditService.i18n.json b/i18n/deu/src/vs/workbench/services/bulkEdit/electron-browser/bulkEditService.i18n.json new file mode 100644 index 0000000000..e2cea319b3 --- /dev/null +++ b/i18n/deu/src/vs/workbench/services/bulkEdit/electron-browser/bulkEditService.i18n.json @@ -0,0 +1,13 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "summary.0": "Keine Änderungen vorgenommen", + "summary.nm": "{0} Änderungen am Text in {1} Dateien vorgenommen", + "summary.n0": "{0} Änderungen am Text in einer Datei vorgenommen", + "conflict": "Die folgenden Dateien wurden in der Zwischenzeit geändert: {0}" +} \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/services/configuration/common/configurationExtensionPoint.i18n.json b/i18n/deu/src/vs/workbench/services/configuration/common/configurationExtensionPoint.i18n.json index 19c52861ee..ff58431435 100644 --- a/i18n/deu/src/vs/workbench/services/configuration/common/configurationExtensionPoint.i18n.json +++ b/i18n/deu/src/vs/workbench/services/configuration/common/configurationExtensionPoint.i18n.json @@ -16,6 +16,7 @@ "vscode.extension.contributes.configuration": "Trägt Konfigurationseigenschaften bei.", "invalid.title": "configuration.title muss eine Zeichenfolge sein.", "invalid.properties": "\"configuration.properties\" muss ein Objekt sein.", + "invalid.property": "\"configuration.property\" muss ein Objekt sein.", "invalid.allOf": "\"configuration.allOf\" ist veraltet und sollte nicht mehr verwendet werden. Übergeben Sie stattdessen mehrere Konfigurationsabschnitte als Array an den Beitragspunkt \"configuration\".", "workspaceConfig.folders.description": "Liste von Ordnern, die in den Arbeitsbereich geladen werden.", "workspaceConfig.path.description": "Ein Dateipfad, z. B. \" /root/folderA\" oder \"./folderA\" bei einem relativen Pfad, der in Bezug auf den Speicherort der Arbeitsbereichsdatei aufgelöst wird.", diff --git a/i18n/deu/src/vs/workbench/services/configurationResolver/electron-browser/configurationResolverService.i18n.json b/i18n/deu/src/vs/workbench/services/configurationResolver/electron-browser/configurationResolverService.i18n.json index 35229bd669..bfc2bc1f14 100644 --- a/i18n/deu/src/vs/workbench/services/configurationResolver/electron-browser/configurationResolverService.i18n.json +++ b/i18n/deu/src/vs/workbench/services/configurationResolver/electron-browser/configurationResolverService.i18n.json @@ -5,5 +5,6 @@ "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." - ] + ], + "stringsOnlySupported": "Der Befehl {0} hat keine Zeichenfolge als Ergebnis zurückgegeben. Als Ergebnisse für Befehle, die zur Variablenersetzung verwendet werden, werden nur Zeichenfolgen unterstützt." } \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/services/files/electron-browser/remoteFileService.i18n.json b/i18n/deu/src/vs/workbench/services/files/electron-browser/remoteFileService.i18n.json index 8a5efc2fb7..f971f5bb68 100644 --- a/i18n/deu/src/vs/workbench/services/files/electron-browser/remoteFileService.i18n.json +++ b/i18n/deu/src/vs/workbench/services/files/electron-browser/remoteFileService.i18n.json @@ -2,14 +2,15 @@ "": [ "--------------------------------------------------------------------------------------------", "Copyright (c) Microsoft Corporation. All rights reserved.", - "Licensed under the Source EULA. See License.txt in the project root for license information.", + "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "invalidPath": "Der Pfad der Ressource \"{0}\" muss ein absoluter Pfad sein.", "fileNotFoundError": "Die Datei wurde nicht gefunden ({0}).", "fileIsDirectoryError": "Die Datei ist ein Verzeichnis", "fileNotModifiedError": "Datei nicht geändert seit", "fileBinaryError": "Die Datei scheint eine Binärdatei zu sein und kann nicht als Text geöffnet werden.", - "err.create": "Fehler beim Erstellen der Datei {0}", + "err.create": "Fehler beim Erstellen der Datei {0}.", "fileMoveConflict": "Verschieben/Kopieren kann nicht ausgeführt werden. Die Datei ist am Ziel bereits vorhanden." } \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/services/themes/common/fileIconThemeSchema.i18n.json b/i18n/deu/src/vs/workbench/services/themes/common/fileIconThemeSchema.i18n.json index 4f929e09c9..6314abda44 100644 --- a/i18n/deu/src/vs/workbench/services/themes/common/fileIconThemeSchema.i18n.json +++ b/i18n/deu/src/vs/workbench/services/themes/common/fileIconThemeSchema.i18n.json @@ -21,7 +21,7 @@ "schema.languageId": "Die ID der Symboldefinition für die Zuordnung.", "schema.fonts": "Schriftarten, die in den Symboldefinitionen verwendet werden.", "schema.id": "Die ID der Schriftart.", - "schema.src": "Die Speicherorte der Schriftart.", + "schema.src": "Der Speicherort der Schriftart.", "schema.font-path": "Der Schriftartpfad relativ zur aktuellen Symboldesigndatei.", "schema.font-format": "Das Format der Schriftart.", "schema.font-weight": "Die Gewichtung der Schriftart.", diff --git a/i18n/esn/extensions/configuration-editing/out/extension.i18n.json b/i18n/esn/extensions/configuration-editing/out/extension.i18n.json index 29185aa0bc..cdad9a5675 100644 --- a/i18n/esn/extensions/configuration-editing/out/extension.i18n.json +++ b/i18n/esn/extensions/configuration-editing/out/extension.i18n.json @@ -6,5 +6,16 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "workspaceFolder": "La ruta de la carpeta abierta en VS Code", + "workspaceFolderBasename": "El nombre de la carpeta abierta en VS Code sin ninguna barra diagonal (/)", + "relativeFile": "El archivo abierto actualmente relativo a ${workspaceFolder}", + "file": "El archivo abierto actualmente", + "cwd": "El directorio de trabajo del ejecutor de tarea en el arranque", + "lineNumber": "El número de línea seleccionado actual en el archivo activo", + "selectedText": "El texto actual seleccionado en el archivo activo ", + "fileDirname": "Nombre del directorio del archivo abierto actual", + "fileExtname": "Extensión de archivo abierto actual", + "fileBasename": "Nombre base del archivo abierto actual ", + "fileBasenameNoExtension": "Nombre base del archivo abierto actual sin extensión de archivo ", "exampleExtension": "Ejemplo" } \ No newline at end of file diff --git a/i18n/esn/extensions/git/out/commands.i18n.json b/i18n/esn/extensions/git/out/commands.i18n.json index cfff5f12aa..022bf20d57 100644 --- a/i18n/esn/extensions/git/out/commands.i18n.json +++ b/i18n/esn/extensions/git/out/commands.i18n.json @@ -2,7 +2,7 @@ "": [ "--------------------------------------------------------------------------------------------", "Copyright (c) Microsoft Corporation. All rights reserved.", - "Licensed under the Source EULA. See License.txt in the project root for license information.", + "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], @@ -10,10 +10,12 @@ "remote branch at": "Rama remota en {0}", "create branch": "$(plus) crear nueva rama", "repourl": "URL del repositorio", - "parent": "Directorio principal", + "selectFolder": "Seleccione la ubicación del repositorio", "cloning": "Clonación del repositorio git ' {0} '...", - "openrepo": "Abrir repositorio", "proposeopen": "¿Desea abrir el repositorio clonado?", + "openrepo": "Abrir repositorio", + "add": "Añadir a espacio de trabajo", + "proposeopen2": "¿Desea abrir el repositorio clonado, o añadir al espacio de trabajo actual?", "init": "Seleccione una carpeta de área de trabajo en la que inicializar el repositorio de git", "init repo": "Inicializar el repositorio", "create repo": "Inicializar el repositorio", diff --git a/i18n/esn/extensions/npm/out/npmView.i18n.json b/i18n/esn/extensions/npm/out/npmView.i18n.json index 5d96d5850a..7b8986ac97 100644 --- a/i18n/esn/extensions/npm/out/npmView.i18n.json +++ b/i18n/esn/extensions/npm/out/npmView.i18n.json @@ -6,6 +6,9 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "npm.noDebugOptions": "No se pudo iniciar \"{0} \" para la depuración porque las secuencias de comandos carecen de una opción de depuración de nodo, por ejemplo \"--inspect-brk\".", - "npm.scriptInvalid": "No se pudo encontrar la secuencia de comandos \"{0}\". Trate de actualizar la vista." + "noScripts": "No se encontraron scripts", + "noDebugOptions": "No se pudo iniciar \"{0} \" para la depuración porque las secuencias de comandos carecen de una opción de depuración de nodo, por ejemplo \"--inspect-brk\".", + "learnMore": "Más información", + "ok": "Aceptar", + "scriptInvalid": "No se pudo encontrar la secuencia de comandos \"{0}\". Trate de actualizar la vista." } \ No newline at end of file diff --git a/i18n/esn/extensions/npm/package.i18n.json b/i18n/esn/extensions/npm/package.i18n.json index 4649fdc6be..7e73e482c8 100644 --- a/i18n/esn/extensions/npm/package.i18n.json +++ b/i18n/esn/extensions/npm/package.i18n.json @@ -12,15 +12,15 @@ "config.npm.runSilent": "Ejecutar comandos de npm con la opción '--silent'", "config.npm.packageManager": "El administrador de paquetes utilizado para ejecutar secuencias de comandos. ", "config.npm.exclude": "Configura patrones globales para carpetas que deben excluirse de la detección automática de scripts. ", - "config.npm.enableScriptExplorer": "Habilitar la vista del Explorador para los scripts de la NMP, cuando el espacio de trabajo contiene un archivo 'package.json'.", + "config.npm.enableScriptExplorer": "Habilitar una vista de explorador para scripts de npm.", + "config.npm.scriptExplorerAction": "La acción de clic predeterminada utilizada en el explorador de secuencias de comandos: 'abrir' o 'ejecutar', el valor predeterminado es 'abrir'.", "npm.parseError": "Detección de tareas de nueva gestión pública: no se pudo analizar el archivo {0}", "taskdef.script": "Script npm que debe personalizarse.", - "taskdef.path": "Ruta de acceso a la carpeta del archivo package.json que proporciona el script. Se puede omitir.", + "taskdef.path": "La ruta de la carpeta del archivo package.json que proporciona la secuencia de comandos. Se puede omitir.", "view.name": "Scripts Npm ", "command.refresh": "Actualizar", "command.run": "Ejecutar", "command.debug": "Depurar", "command.openScript": "Abrir", - "npm.scriptInvalid": "No se pudo encontrar el script '{0}'. Trate de actualizar la vista.", - "npm.noDebugOptions": "No se pudo iniciar ' {0} ' para la depuración porque las secuencias de comandos carecen de una opción de depuración de nodo, por ejemplo '--inspect-brk'." + "command.runInstall": "Ejecutar instalación" } \ No newline at end of file diff --git a/i18n/esn/extensions/search-rg/package.i18n.json b/i18n/esn/extensions/search-rg/package.i18n.json new file mode 100644 index 0000000000..25dc288867 --- /dev/null +++ b/i18n/esn/extensions/search-rg/package.i18n.json @@ -0,0 +1,11 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "displayName": "Búsqueda (ripgrep)", + "description": "Proporciona búsqueda mediante Ripgrep." +} \ No newline at end of file diff --git a/i18n/esn/extensions/typescript-language-features/out/features/organizeImports.i18n.json b/i18n/esn/extensions/typescript-language-features/out/features/organizeImports.i18n.json index 226cfad118..8e78298322 100644 --- a/i18n/esn/extensions/typescript-language-features/out/features/organizeImports.i18n.json +++ b/i18n/esn/extensions/typescript-language-features/out/features/organizeImports.i18n.json @@ -6,5 +6,5 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "oraganizeImportsAction.title": "Organizar las importaciones" + "oraganizeImportsAction.title": "Organizar Importaciones" } \ No newline at end of file diff --git a/i18n/esn/extensions/typescript-language-features/out/features/updatePathsOnRename.i18n.json b/i18n/esn/extensions/typescript-language-features/out/features/updatePathsOnRename.i18n.json new file mode 100644 index 0000000000..2b03dcbd25 --- /dev/null +++ b/i18n/esn/extensions/typescript-language-features/out/features/updatePathsOnRename.i18n.json @@ -0,0 +1,14 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "prompt": "¿Actualizar automáticamente las importaciones del archivo movido: ' {0} '?", + "reject.title": "No", + "accept.title": "Sí", + "always.title": "Sí, siempre actualizar las importaciones", + "never.title": "No, nunca actualizar las importaciones" +} \ No newline at end of file diff --git a/i18n/esn/extensions/typescript-language-features/package.i18n.json b/i18n/esn/extensions/typescript-language-features/package.i18n.json index 4963282d83..9f1ce1dc88 100644 --- a/i18n/esn/extensions/typescript-language-features/package.i18n.json +++ b/i18n/esn/extensions/typescript-language-features/package.i18n.json @@ -8,8 +8,7 @@ ], "displayName": "Características del lenguaje JavaScript y TypeScript", "description": "Proporciona soporte de lenguaje enriquecido para JavaScript y TypeScript.", - "typescript.reloadProjects.title": "Volver a cargar el proyecto", - "javascript.reloadProjects.title": "Volver a cargar el proyecto", + "reloadProjects.title": "Volver a cargar el proyecto", "configuration.typescript": "TypeScript", "typescript.useCodeSnippetsOnMethodSuggest.dec": "Complete las funciones con la signatura de parámetro.", "typescript.tsdk.desc": "Especifica la ruta de acceso de carpeta que contiene los archivos lib*.d.ts y tsserver que se van a usar.", @@ -37,8 +36,7 @@ "format.placeOpenBraceOnNewLineForFunctions": "Define si una llave de apertura se incluye en una nueva línea para las funciones o no.", "format.placeOpenBraceOnNewLineForControlBlocks": "Define si una llave de apertura se incluye en una nueva línea para los bloques de control o no.", "javascript.validate.enable": "Habilita o deshabilita la validación de JavaScript.", - "typescript.goToProjectConfig.title": "Ir a configuración del proyecto", - "javascript.goToProjectConfig.title": "Ir a configuración del proyecto", + "goToProjectConfig.title": "Ir a configuración del proyecto", "javascript.referencesCodeLens.enabled": "Habilitar/deshabilitar las referencias de CodeLens en los archivos de JavaScript.", "typescript.referencesCodeLens.enabled": "Habilitar/deshabilitar las referencias de CodeLens en los archivos de TypeScript. Requiere TypeScript >= 2.0.6.", "typescript.implementationsCodeLens.enabled": "Habilita o deshabilita implementaciones de CodeLens. Requiere TypeScript >= 2.2.0.", @@ -55,11 +53,15 @@ "typescript.problemMatchers.tsc.label": "Problemas de TypeScript", "typescript.problemMatchers.tscWatch.label": "Problemas de TypeScript (modo de inspección)", "typescript.quickSuggestionsForPaths": "Activar o desactiva las sugerencias rápidas al escribir una ruta de importación.", - "typescript.locale": "Establece la configuración regional para reportar errores de TypeScript. Requiere TypeScript > = 2.6.0. Por defecto, utiliza el valor 'null' de VS Code para errores de TypeScript.", - "javascript.implicitProjectConfig.experimentalDecorators": "Activar/desactivar 'experimentalDecorators' para los archivos JavaScript que no son parte de un proyecto. Los archivos jsconfig.json o tsconfig.json reemplazan esta configuración. Requiere inicio > = 2.3.1. ", - "typescript.autoImportSuggestions.enabled": "Habilita o deshabilita sugerencias de importación automática.  Requiere TypeScript >= 2.6.1.", + "typescript.locale": "Establece la configuración regional utilizada para reportar errores de JavaScript y TypeScript. Requiere TypeScript > = 2.6.0. El valor predeterminado es 'null' y utiliza la configuración regional de VS Code.", + "javascript.implicitProjectConfig.experimentalDecorators": "Activar/desactivar 'experimentalDecorators' para los archivos JavaScript que no son parte de un proyecto. Los archivos jsconfig.json o tsconfig.json reemplazan esta configuración. Requiere inicio > = 2.3.1.", + "typescript.autoImportSuggestions.enabled": "Activar o desactivar sugerencias de importación automática. Requiere TypeScript > = 2.6.1 ", "typescript.experimental.syntaxFolding": "Habilita/deshabilita los marcadores de plegado sensibles a la sintaxis.", "taskDefinition.tsconfig.description": "Archivo tsconfig que define la compilación de TS.", "javascript.suggestionActions.enabled": "Habilitar/deshabilitar sugerencias de diagnóstico para los archivos JavaScript en el editor. Requiere TypeScript > = 2.8 ", - "typescript.suggestionActions.enabled": "Habilitar/deshabilitar sugerencias de diagnóstico para los archivos JavaScript en el editor. Requiere TypeScript > = 2.8 " + "typescript.suggestionActions.enabled": "Habilitar/deshabilitar diagnosticos de sugerencia para los archivos TypeScript en el editor. Requiere TypeScript > = 2.8 ", + "typescript.preferences.quoteStyle": "Estilo de cita preferido para utilizar en soluciones rápidas: comilla 'simple', comilla 'doble' o 'auto' deduce el tipo comilla de importaciones vigentes. Requiere TypeScript > = 2.9", + "typescript.preferences.importModuleSpecifier": "Estilo preferido de ruta para las importaciones automáticas: \n'relativa' a la ubicación del archivo\n'no-relativa' basado en el ' baseUrl ' configurado en su ' jsconfig.json'/' tsconfig.json '.\n'auto' deduce el tipo de ruta más corto. \nRequiere TypeScript > = 2.9", + "typescript.showUnused": "Activar o desactivar el resaltado de variables no utilizadas en el código. Requiere TypeScript > = 2.9", + "typescript.updateImportsOnFileMove.enabled": "Habilitar/deshabilitar la actualización automática de las rutas de importación cuando cambie el nombre o mueva un archivo en VS Code. Los valores posibles son: ' preguntar' en cada cambio de nombre, ' siempre ' actualizar rutas automáticamente, y ' nunca ' cambiar el nombre de rutas y no preguntar. Requiere TypeScript >= 2.9" } \ No newline at end of file diff --git a/i18n/esn/src/vs/base/node/zip.i18n.json b/i18n/esn/src/vs/base/node/zip.i18n.json index 944c7bac4e..274942890e 100644 --- a/i18n/esn/src/vs/base/node/zip.i18n.json +++ b/i18n/esn/src/vs/base/node/zip.i18n.json @@ -6,6 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "incompleteExtract": "Incompleta. Extraído {0} de {1} entradas", + "incompleteExtract": "Incompleta. Se encontró {0} de {1} entradas", "notFound": "{0} no se encontró dentro del archivo zip." } \ No newline at end of file diff --git a/i18n/esn/src/vs/code/electron-browser/issue/issueReporterMain.i18n.json b/i18n/esn/src/vs/code/electron-browser/issue/issueReporterMain.i18n.json index efeedf7059..c55f03b532 100644 --- a/i18n/esn/src/vs/code/electron-browser/issue/issueReporterMain.i18n.json +++ b/i18n/esn/src/vs/code/electron-browser/issue/issueReporterMain.i18n.json @@ -6,13 +6,15 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "hide": "ocultar", + "show": "Mostrar", "previewOnGitHub": "Visualizar en GitHub", "loadingData": "Cargando datos...", "rateLimited": "Límite de consulta de GitHub excedido. Espera.", "similarIssues": "Problemas similares", "open": "Abrir", "closed": "Cerrado", - "noSimilarIssues": "No hay problemas similares encontrados", + "noSimilarIssues": "No se han encontrado problemas similares", "settingsSearchIssue": "Problema de búsqueda de configuración", "bugReporter": "Informe de errores", "featureRequest": "Solicitud de característica", diff --git a/i18n/esn/src/vs/code/electron-browser/issue/issueReporterPage.i18n.json b/i18n/esn/src/vs/code/electron-browser/issue/issueReporterPage.i18n.json index ad772087dc..9333872d13 100644 --- a/i18n/esn/src/vs/code/electron-browser/issue/issueReporterPage.i18n.json +++ b/i18n/esn/src/vs/code/electron-browser/issue/issueReporterPage.i18n.json @@ -17,13 +17,12 @@ "issueTitleLabel": "Título", "issueTitleRequired": "Por favor, introduzca un título.", "titleLengthValidation": "El título es demasiado largo.", - "systemInfo": "Mi información del sistema", - "sendData": "Enviar mis datos", - "processes": "Procesos actualmente en ejecución", - "workspaceStats": "Estadísticas de mi área de trabajo", - "extensions": "Mis extensiones", - "searchedExtensions": "Extensiones que se han buscado", - "settingsSearchDetails": "Detalles de la búsqueda de configuración", "details": "Especifique los detalles.", - "loadingData": "Cargando datos..." + "sendSystemInfo": "Incluir la información de mi sistema ({0})", + "show": "mostrar", + "sendProcessInfo": "Incluir mis procesos actualmente en ejecución ({0})", + "sendWorkspaceInfo": "Incluir los metadatos de mi espacio de trabajo ({0})", + "sendExtensions": "Incluir mis extensiones habilitadas ({0})", + "sendSearchedExtensions": "Enviar extensiones examinadas ({0})", + "sendSettingsSearchDetails": "Enviar configuración detalles de búsqueda ({0})" } \ No newline at end of file diff --git a/i18n/esn/src/vs/code/electron-browser/processExplorer/processExplorerMain.i18n.json b/i18n/esn/src/vs/code/electron-browser/processExplorer/processExplorerMain.i18n.json index c10a769e35..655b2ff1f2 100644 --- a/i18n/esn/src/vs/code/electron-browser/processExplorer/processExplorerMain.i18n.json +++ b/i18n/esn/src/vs/code/electron-browser/processExplorer/processExplorerMain.i18n.json @@ -10,6 +10,8 @@ "memory": "Memoria (MB)", "pid": "pid", "name": "Nombre", - "killProcess": "Matar proceso", - "forceKillProcess": "Forzar matar proceso" + "killProcess": "Terminar proceso", + "forceKillProcess": "Forzar matar proceso", + "copy": "Copiar", + "copyAll": "Copiar todo" } \ No newline at end of file diff --git a/i18n/esn/src/vs/code/electron-main/menus.i18n.json b/i18n/esn/src/vs/code/electron-main/menus.i18n.json index d32fd15625..2173ae65d3 100644 --- a/i18n/esn/src/vs/code/electron-main/menus.i18n.json +++ b/i18n/esn/src/vs/code/electron-main/menus.i18n.json @@ -2,7 +2,7 @@ "": [ "--------------------------------------------------------------------------------------------", "Copyright (c) Microsoft Corporation. All rights reserved.", - "Licensed under the Source EULA. See License.txt in the project root for license information.", + "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], @@ -88,7 +88,6 @@ "miToggleDebugConsole": "Consola de de&&puración", "miToggleIntegratedTerminal": "&&Terminal integrado", "miMarker": "&&Problemas", - "miAdditionalViews": "Vistas &&adicionales", "miCommandPalette": "&&Paleta de comandos...", "miOpenView": "&& Vista abierta...", "miToggleFullScreen": "Alternar &&pantalla completa", @@ -144,9 +143,9 @@ "miContinue": "&&Continuar", "miToggleBreakpoint": "Alter&&nar punto de interrupción", "miConditionalBreakpoint": "Punto de interrupción &&condicional...", - "miColumnBreakpoint": "Punto de interrupción de c&&olumna", + "miInlineBreakpoint": "Punt&&o de interrupción en línea", "miFunctionBreakpoint": "Punto de interrupción de &&función...", - "miLogPoint": "&& Logpoint...", + "miLogPoint": "&&Punto de registro", "miNewBreakpoint": "&&Nuevo punto de interrupción", "miEnableAllBreakpoints": "Habilitar todos los puntos de interrupción", "miDisableAllBreakpoints": "&&Deshabilitar todos los puntos de interrupción", diff --git a/i18n/esn/src/vs/editor/browser/widget/codeEditorWidget.i18n.json b/i18n/esn/src/vs/editor/browser/widget/codeEditorWidget.i18n.json new file mode 100644 index 0000000000..d60d995d48 --- /dev/null +++ b/i18n/esn/src/vs/editor/browser/widget/codeEditorWidget.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "cursors.maximum": "El número de cursores se ha limitado a {0}." +} \ No newline at end of file diff --git a/i18n/esn/src/vs/editor/common/config/commonEditorConfig.i18n.json b/i18n/esn/src/vs/editor/common/config/commonEditorConfig.i18n.json index 541af19f49..6ad3e3ebd5 100644 --- a/i18n/esn/src/vs/editor/common/config/commonEditorConfig.i18n.json +++ b/i18n/esn/src/vs/editor/common/config/commonEditorConfig.i18n.json @@ -2,7 +2,7 @@ "": [ "--------------------------------------------------------------------------------------------", "Copyright (c) Microsoft Corporation. All rights reserved.", - "Licensed under the Source EULA. See License.txt in the project root for license information.", + "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], @@ -16,7 +16,7 @@ "lineNumbers.on": "Los números de línea se muestran como un número absoluto.", "lineNumbers.relative": "Los números de línea se muestran como distancia en líneas a la posición del cursor.", "lineNumbers.interval": "Los números de línea se muestran cada 10 líneas.", - "lineNumbers": "Controla la visualización de números de línea.", + "lineNumbers": "Controla la visualización de los números de línea.", "rulers": "Representar reglas verticales después de un cierto número de caracteres monoespacio. Usar multiples valores para multiples reglas. No se dibuja ninguna regla si la matriz esta vacía.", "wordSeparators": "Caracteres que se usarán como separadores de palabras al realizar operaciones o navegaciones relacionadas con palabras.", "tabSize": "El número de espacios a los que equivale una tabulación. Este valor se invalida según el contenido del archivo cuando `editor.detectIndentation` está activado.", @@ -26,9 +26,10 @@ "detectIndentation": "Al abrir un archivo, se detectarán `editor.tabSize` y `editor.insertSpaces` en función del contenido del archivo.", "roundedSelection": "Controla si las selecciones tienen esquinas redondeadas", "scrollBeyondLastLine": "Controla si el editor se seguirá desplazando después de la última línea", + "scrollBeyondLastColumn": "Controla el número de caracteres adicionales a partir del cual el editor se desplazará horizontalmente", "smoothScrolling": "Controla si el editor se desplaza con una animación", "minimap.enabled": "Controla si se muestra el minimapa", - "minimap.side": "Controla el lado dónde rendir el minimapa.", + "minimap.side": "Controla en qué lado se muestra el minimapa.", "minimap.showSlider": "Controla si el control deslizante del minimapa es ocultado automáticamente.", "minimap.renderCharacters": "Presentar los caracteres reales en una línea (por oposición a bloques de color)", "minimap.maxColumn": "Limitar el ancho del minimapa para presentar como mucho un número de columnas determinado", @@ -41,7 +42,7 @@ "wordWrap.bounded": "Las líneas se ajustarán al valor que sea inferior: el tamaño de la ventanilla o el valor de \"editor.wordWrapColumn\".", "wordWrap": "Controla cómo se deben ajustar las líneas. Pueden ser:\n - \"off\" (deshabilitar ajuste),\n - \"on\" (ajuste de ventanilla),\n - \"wordWrapColumn\" (ajustar en \"editor.wordWrapColumn\") o\n - \"bounded\" (ajustar en la parte mínima de la ventanilla y \"editor.wordWrapColumn\").", "wordWrapColumn": "Controls the wrapping column of the editor when `editor.wordWrap` is 'wordWrapColumn' or 'bounded'.", - "wrappingIndent": "Controla el sangrado de las líneas ajustadas. Puede ser uno los valores 'none', 'same' o 'indent'.", + "wrappingIndent": "Controla el sangrado de las líneas ajustadas. Puede ser uno de 'none', ' same ', ' indent' o ' deepIndent '.", "mouseWheelScrollSensitivity": "Se utilizará un multiplicador en los eventos de desplazamiento de la rueda del mouse `deltaX` y `deltaY`", "multiCursorModifier.ctrlCmd": "Se asigna a \"Control\" en Windows y Linux y a \"Comando\" en macOS.", "multiCursorModifier.alt": "Se asigna a \"Alt\" en Windows y Linux y a \"Opción\" en macOS.", @@ -77,7 +78,7 @@ "occurrencesHighlight": "Controla si el editor debe resaltar los símbolos semánticos.", "overviewRulerLanes": "Controla el número de decoraciones que pueden aparecer en la misma posición en la regla de visión general", "overviewRulerBorder": "Controla si debe dibujarse un borde alrededor de la regla de información general.", - "cursorBlinking": "Controlar el estilo de animación del cursor.", + "cursorBlinking": "Controla el estilo de animación del cursor.", "mouseWheelZoom": "Ampliar la fuente del editor cuando se use la rueda del mouse mientras se presiona Ctrl", "cursorStyle": "Controla el estilo del cursor. Los valores aceptados son \"block\", \"block-outline\", \"line\", \"line-thin\", \"underline\" y \"underline-thin\"", "cursorWidth": "Controla el ancho del cursor cuando editor.cursorStyle se establece a 'line'", diff --git a/i18n/esn/src/vs/editor/common/view/editorColorRegistry.i18n.json b/i18n/esn/src/vs/editor/common/view/editorColorRegistry.i18n.json index 5a2a61ef9c..da5be7211e 100644 --- a/i18n/esn/src/vs/editor/common/view/editorColorRegistry.i18n.json +++ b/i18n/esn/src/vs/editor/common/view/editorColorRegistry.i18n.json @@ -32,6 +32,7 @@ "infoBorder": "Color del borde de los subrayados ondulados informativos en el editor.", "hintForeground": "Color de primer plano de pista squigglies en el editor.", "hintBorder": "Color de borde de pista squigglies en el editor.", + "unnecessaryForeground": "Color de primer plano de código innecesario en el editor.", "overviewRulerRangeHighlight": "Resumen de color de marcador para destacar rangos. El color no debe ser opaco para no ocultar las decoraciones subyacentes.", "overviewRuleError": "Color de marcador de regla de información general para errores. ", "overviewRuleWarning": "Color de marcador de regla de información general para advertencias.", diff --git a/i18n/esn/src/vs/editor/contrib/codeAction/codeActionCommands.i18n.json b/i18n/esn/src/vs/editor/contrib/codeAction/codeActionCommands.i18n.json index 121ba9263c..de3b9342e2 100644 --- a/i18n/esn/src/vs/editor/contrib/codeAction/codeActionCommands.i18n.json +++ b/i18n/esn/src/vs/editor/contrib/codeAction/codeActionCommands.i18n.json @@ -8,12 +8,12 @@ ], "quickFixWithKb": "Mostrar correcciones ({0})", "quickFix": "Mostrar correcciones", - "quickfix.trigger.label": "Solución rápida...", + "quickfix.trigger.label": "Corrección Rápida", "editor.action.quickFix.noneMessage": "No hay acciones de código disponibles", "refactor.label": "Refactorizar...", "editor.action.refactor.noneMessage": "No hay refactorizaciones disponibles", - "source.label": "Acción de la fuente...", - "editor.action.source.noneMessage": "No hay acciones de fuente disponibles", + "source.label": "Acción de Origen...", + "editor.action.source.noneMessage": "No hay acciones de origen disponibles", "organizeImports.label": "Organizar Importaciones", "editor.action.organize.noneMessage": "No hay acciones de importación disponibles" } \ No newline at end of file diff --git a/i18n/esn/src/vs/editor/contrib/fontZoom/fontZoom.i18n.json b/i18n/esn/src/vs/editor/contrib/fontZoom/fontZoom.i18n.json new file mode 100644 index 0000000000..491ee23a00 --- /dev/null +++ b/i18n/esn/src/vs/editor/contrib/fontZoom/fontZoom.i18n.json @@ -0,0 +1,12 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "EditorFontZoomIn.label": "Acercarse a la tipografía del editor", + "EditorFontZoomOut.label": "Alejarse de la tipografía del editor", + "EditorFontZoomReset.label": "Restablecer alejamiento de la tipografía del editor" +} \ No newline at end of file diff --git a/i18n/esn/src/vs/editor/contrib/goToDefinition/goToDefinitionCommands.i18n.json b/i18n/esn/src/vs/editor/contrib/goToDefinition/goToDefinitionCommands.i18n.json new file mode 100644 index 0000000000..f2342ad1ff --- /dev/null +++ b/i18n/esn/src/vs/editor/contrib/goToDefinition/goToDefinitionCommands.i18n.json @@ -0,0 +1,25 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "noResultWord": "No se encontró ninguna definición para \"{0}\"", + "generic.noResults": "No se encontró ninguna definición", + "meta.title": " – {0} definiciones", + "actions.goToDecl.label": "Ir a definición", + "actions.goToDeclToSide.label": "Abrir definición en el lateral", + "actions.previewDecl.label": "Ver la definición", + "goToImplementation.noResultWord": "No se encontró ninguna implementación para \"{0}\"", + "goToImplementation.generic.noResults": "No se encontró ninguna implementación", + "meta.implementations.title": "{0} implementaciones", + "actions.goToImplementation.label": "Ir a implementación", + "actions.peekImplementation.label": "Inspeccionar implementación", + "goToTypeDefinition.noResultWord": "No se encontró ninguna definición de tipo para \"{0}\"", + "goToTypeDefinition.generic.noResults": "No se encontró ninguna definición de tipo", + "meta.typeDefinitions.title": " – {0} definiciones de tipo", + "actions.goToTypeDefinition.label": "Ir a la definición de tipo", + "actions.peekTypeDefinition.label": "Inspeccionar definición de tipo" +} \ No newline at end of file diff --git a/i18n/esn/src/vs/editor/contrib/goToDefinition/goToDefinitionMouse.i18n.json b/i18n/esn/src/vs/editor/contrib/goToDefinition/goToDefinitionMouse.i18n.json new file mode 100644 index 0000000000..65fc038b92 --- /dev/null +++ b/i18n/esn/src/vs/editor/contrib/goToDefinition/goToDefinitionMouse.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "multipleResults": "Haga clic para mostrar {0} definiciones." +} \ No newline at end of file diff --git a/i18n/esn/src/vs/editor/contrib/gotoError/gotoError.i18n.json b/i18n/esn/src/vs/editor/contrib/gotoError/gotoError.i18n.json index 807eba3205..d20fbf64ad 100644 --- a/i18n/esn/src/vs/editor/contrib/gotoError/gotoError.i18n.json +++ b/i18n/esn/src/vs/editor/contrib/gotoError/gotoError.i18n.json @@ -7,5 +7,7 @@ "Do not edit this file. It is machine generated." ], "markerAction.next.label": "Ir al siguiente problema (Error, Advertencia, Información)", - "markerAction.previous.label": "Ir al problema anterior (Error, Advertencia, Información)" + "markerAction.previous.label": "Ir al problema anterior (Error, Advertencia, Información)", + "markerAction.nextInFiles.label": "Ir al siguiente problema en Archivos (Error, Advertencia, Información)", + "markerAction.previousInFiles.label": "Ir al problema anterior en Archivos (Error, Advertencia, Información)" } \ No newline at end of file diff --git a/i18n/esn/src/vs/editor/contrib/indentation/indentation.i18n.json b/i18n/esn/src/vs/editor/contrib/indentation/indentation.i18n.json index 34f25cbaad..cf341e4d7e 100644 --- a/i18n/esn/src/vs/editor/contrib/indentation/indentation.i18n.json +++ b/i18n/esn/src/vs/editor/contrib/indentation/indentation.i18n.json @@ -13,5 +13,6 @@ "indentUsingTabs": "Aplicar sangría con tabulaciones", "indentUsingSpaces": "Aplicar sangría con espacios", "detectIndentation": "Detectar sangría del contenido", - "editor.reindentlines": "Volver a aplicar sangría a líneas" + "editor.reindentlines": "Volver a aplicar sangría a líneas", + "editor.reindentselectedlines": "Volver a aplicar sangría a líneas seleccionadas" } \ No newline at end of file diff --git a/i18n/esn/src/vs/editor/contrib/message/messageController.i18n.json b/i18n/esn/src/vs/editor/contrib/message/messageController.i18n.json index bc97e24608..e94c4a50a7 100644 --- a/i18n/esn/src/vs/editor/contrib/message/messageController.i18n.json +++ b/i18n/esn/src/vs/editor/contrib/message/messageController.i18n.json @@ -6,5 +6,5 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "editor.readonly": "No se puede editar en editor de sólo lectura" + "editor.readonly": "No se puede editar en un editor de sólo lectura" } \ No newline at end of file diff --git a/i18n/esn/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json b/i18n/esn/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json index 5e55b7d238..862953cea1 100644 --- a/i18n/esn/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json +++ b/i18n/esn/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json @@ -25,8 +25,6 @@ "uninstallDependeciesConfirmation": "¿Quiere desinstalar solo '{0}' o también sus dependencias?", "uninstallOnly": "Sólo extensión", "uninstallAll": "Desinstalar todo", - "uninstallConfirmation": "¿Seguro que quiere desinstalar '{0}'?", - "ok": "Aceptar", "singleDependentError": "No se puede desinstalar la extensión '{0}'. La extensión '{1}' depende de esta.", "twoDependentsError": "No se puede desinstalar la extensión '{0}'. Las extensiones '{1}' y '{2}' dependen de esta.", "multipleDependentsError": "No se puede desinstalar la extensión '{0}'. Las extensiones '{1}' y '{2}', entre otras, dependen de esta.", diff --git a/i18n/esn/src/vs/platform/issue/electron-main/issueService.i18n.json b/i18n/esn/src/vs/platform/issue/electron-main/issueService.i18n.json index ba1f2ff8be..511b6439e1 100644 --- a/i18n/esn/src/vs/platform/issue/electron-main/issueService.i18n.json +++ b/i18n/esn/src/vs/platform/issue/electron-main/issueService.i18n.json @@ -7,5 +7,5 @@ "Do not edit this file. It is machine generated." ], "issueReporter": "Reportero de tema", - "processExplorer": "Process Explorer" + "processExplorer": "Explorador de Procesos" } \ No newline at end of file diff --git a/i18n/esn/src/vs/platform/node/minimalTranslations.i18n.json b/i18n/esn/src/vs/platform/node/minimalTranslations.i18n.json new file mode 100644 index 0000000000..907113b973 --- /dev/null +++ b/i18n/esn/src/vs/platform/node/minimalTranslations.i18n.json @@ -0,0 +1,13 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "showLanguagePackExtensions": "VS Code está disponible en {0}. Busque los paquetes de idiomas en el Marketplace para empezar.", + "searchMarketplace": "Buscar en Marketplace ", + "installAndRestartMessage": "VS Code está disponible en {0}. Instale el paquete de idioma para empezar. Se requiere un reinicio.", + "installAndRestart": "Instalar y Reiniciar" +} \ No newline at end of file diff --git a/i18n/esn/src/vs/platform/theme/common/colorRegistry.i18n.json b/i18n/esn/src/vs/platform/theme/common/colorRegistry.i18n.json index 0c443073b8..df47f2d252 100644 --- a/i18n/esn/src/vs/platform/theme/common/colorRegistry.i18n.json +++ b/i18n/esn/src/vs/platform/theme/common/colorRegistry.i18n.json @@ -2,7 +2,7 @@ "": [ "--------------------------------------------------------------------------------------------", "Copyright (c) Microsoft Corporation. All rights reserved.", - "Licensed under the Source EULA. See License.txt in the project root for license information.", + "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], @@ -16,7 +16,7 @@ "selectionBackground": "El color de fondo del texto seleccionado en el área de trabajo (por ejemplo, campos de entrada o áreas de texto). Esto no se aplica a las selecciones dentro del editor.", "textSeparatorForeground": "Color para los separadores de texto.", "textLinkForeground": "Color de primer plano para los vínculos en el texto.", - "textLinkActiveForeground": "Color de primer plano para los vínculos activos en el texto.", + "textLinkActiveForeground": "Color de primer plano para los enlaces de texto, al hacer clic o pasar el mouse sobre ellos.", "textPreformatForeground": "Color de primer plano para los segmentos de texto con formato previo.", "textBlockQuoteBackground": "Color de fondo para los bloques en texto.", "textBlockQuoteBorder": "Color de borde para los bloques en texto.", @@ -48,6 +48,8 @@ "listDropBackground": "Fondo de arrastrar y colocar la lista o el árbol al mover los elementos con el mouse.", "highlight": "Color de primer plano de la lista o el árbol de las coincidencias resaltadas al buscar dentro de la lista o el ábol.", "invalidItemForeground": "Color de primer plano de una lista o árbol para los elementos inválidos, por ejemplo una raiz sin resolver en el explorador.", + "listErrorForeground": "Color del primer plano de elementos de lista que contienen errores.", + "listWarningForeground": "Color del primer plano de elementos de lista que contienen advertencias.", "pickerGroupForeground": "Selector de color rápido para la agrupación de etiquetas.", "pickerGroupBorder": "Selector de color rápido para la agrupación de bordes.", "buttonForeground": "Color de primer plano del botón.", @@ -58,7 +60,7 @@ "scrollbarShadow": "Sombra de la barra de desplazamiento indica que la vista se ha despazado.", "scrollbarSliderBackground": "Color de fondo de control deslizante de barra de desplazamiento.", "scrollbarSliderHoverBackground": "Color de fondo de barra de desplazamiento cursor cuando se pasar sobre el control.", - "scrollbarSliderActiveBackground": "Color de fondo de barra de desplazamiento cursor cuando está activo.", + "scrollbarSliderActiveBackground": "Color de fondo de la barra de desplazamiento al hacer clic.", "progressBarBackground": "Color de fondo para la barra de progreso que se puede mostrar para las operaciones de larga duración.", "editorBackground": "Color de fondo del editor.", "editorForeground": "Color de primer plano predeterminado del editor.", @@ -75,6 +77,7 @@ "editorFindMatchBorder": "Color de borde de la coincidencia de búsqueda actual.", "findMatchHighlightBorder": "Color de borde de otra búsqueda que coincide.", "findRangeHighlightBorder": "Color de borde de la gama que limita la búsqueda. El color no debe ser opaco para no ocultar las decoraciones subyacentes.", + "findWidgetResizeBorder": "Color del borde de la barra de tamaño del widget de búsqueda.", "hoverHighlight": "Resalte debajo de la palabra para la cual se muestra un Hover. El color no debe ser opaco para no ocultar las decoraciones subyacentes.", "hoverBackground": "Color de fondo al mantener el puntero en el editor.", "hoverBorder": "Color del borde al mantener el puntero en el editor.", diff --git a/i18n/esn/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.i18n.json b/i18n/esn/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.i18n.json index 635a825e0a..5b939de4c5 100644 --- a/i18n/esn/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.i18n.json +++ b/i18n/esn/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.i18n.json @@ -6,5 +6,5 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "confirmUrl": "¿desea que la extensión {0} abra la siguiente URL?" + "confirmUrl": "¿Permitir a una extensión abrir esta URL?" } \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json b/i18n/esn/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json index 90efea7a4b..f7ce405925 100644 --- a/i18n/esn/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json +++ b/i18n/esn/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json @@ -8,13 +8,12 @@ ], "vscode.extension.contributes.views.containers.id": "Identificador único utilizado para identificar el contenedor en el que se pueden aportar vistas mediante el punto de contribución \"vistas\"", "vscode.extension.contributes.views.containers.title": "Cadena de texto en lenguaje natural usada para mostrar el contenedor. ", - "vscode.extension.contributes.views.containers.icon": "Ruta para el icono del contenedor. Los iconos son de 24x24 centrados en un cuadrado 50x40 y tienen un color de relleno de ' RGB (215, 218, 224) ' o ' #d7dae0 '. Se recomienda que los iconos estén en SVG, aunque se acepte cualquier tipo de archivo de imagen.", + "vscode.extension.contributes.views.containers.icon": "Ruta para el icono del contenedor. Los iconos son de 24 x 24 centrados en un bloque de 50 x 40 y tienen un color de relleno de 'rgb (215, 218, 224)' o '#d7dae0'. Se recomienda que los iconos sean en SVG, aunque se acepta cualquier tipo de archivo de imagen. ", "vscode.extension.contributes.viewsContainers": "Contribuye con vistas de contenedores al editor ", "views.container.activitybar": "Contribuir vistas de contenedores a la barra de actividades", "test": "Prueba", - "proposed": "la contribución ' viewsContainers ' sólo está disponible cuando se está ejecutando fuera de desarrollo con el siguiente modificador de línea de comandos: --enable-proposed-API {0}", "requirearray": "contenedores de vistas deben ser una matriz", - "requireidstring": "la propiedad ' {0} ' es obligatoria y debe ser de tipo 'String'. Sólo se permiten letras alfanuméricas, ' _ ', '-'.", + "requireidstring": "la propiedad `{0}` is mandatoria y debe ser del tipo `cadena`. Solo son permitidos carácteres alfanuméricos, '_' y '-'.", "requirestring": "la propiedad `{0}` es obligatoria y debe ser de tipo \"string\"", "showViewlet": "Mostrar {0}", "view": "Ver" diff --git a/i18n/esn/src/vs/workbench/browser/actions/workspaceActions.i18n.json b/i18n/esn/src/vs/workbench/browser/actions/workspaceActions.i18n.json index b548b8b187..a36bd22d06 100644 --- a/i18n/esn/src/vs/workbench/browser/actions/workspaceActions.i18n.json +++ b/i18n/esn/src/vs/workbench/browser/actions/workspaceActions.i18n.json @@ -15,5 +15,5 @@ "saveWorkspace": "Guardar área de trabajo", "openWorkspaceAction": "Abrir área de trabajo...", "openWorkspaceConfigFile": "Abrir archivo de configuración del área de trabajo", - "openFolderAsWorkspaceInNewWindow": "Abrir carpeta como Área de trabajo en una Nueva Ventana" + "duplicateWorkspaceInNewWindow": "Duplicar el área de trabajo en una ventana nueva" } \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/browser/parts/panel/panelPart.i18n.json b/i18n/esn/src/vs/workbench/browser/parts/panel/panelPart.i18n.json index 5bd1010a93..f2c84bc783 100644 --- a/i18n/esn/src/vs/workbench/browser/parts/panel/panelPart.i18n.json +++ b/i18n/esn/src/vs/workbench/browser/parts/panel/panelPart.i18n.json @@ -1,8 +1,10 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the Source EULA. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ -// Do not edit this file. It is machine generated. { - "panelSwitcherBarAriaLabel": "Activar el conmutador de panel" + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "hidePanel": "Ocultar panel" } \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/browser/parts/quickopen/quickOpenController.i18n.json b/i18n/esn/src/vs/workbench/browser/parts/quickopen/quickOpenController.i18n.json index eead577ad6..52d54641ab 100644 --- a/i18n/esn/src/vs/workbench/browser/parts/quickopen/quickOpenController.i18n.json +++ b/i18n/esn/src/vs/workbench/browser/parts/quickopen/quickOpenController.i18n.json @@ -6,8 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "inputModeEntryDescription": "{0} (Presione \"Entrar\" para confirmar o \"Esc\" para cancelar)", - "inputModeEntry": "Presione \"Entrar\" para confirmar su entrada o \"Esc\" para cancelar", "emptyPicks": "No hay entradas para seleccionar", "quickOpenInput": "Escriba '?' para obtener ayuda con las acciones que puede realizar desde aquí", "historyMatches": "abiertos recientemente", diff --git a/i18n/esn/src/vs/workbench/browser/parts/views/viewsViewlet.i18n.json b/i18n/esn/src/vs/workbench/browser/parts/views/viewsViewlet.i18n.json index e16ac7cfe0..0a1ebe0dfa 100644 --- a/i18n/esn/src/vs/workbench/browser/parts/views/viewsViewlet.i18n.json +++ b/i18n/esn/src/vs/workbench/browser/parts/views/viewsViewlet.i18n.json @@ -6,5 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "cannot toggle": "La visibilidad no puede ser fijada para esta vista {0} ", + "cannot show": "Esta vista {0} no puede ser visualizada porque está oculta por su condición 'when'", "hideView": "Ocultar" } \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/common/theme.i18n.json b/i18n/esn/src/vs/workbench/common/theme.i18n.json index ce982c8eae..22f29644d6 100644 --- a/i18n/esn/src/vs/workbench/common/theme.i18n.json +++ b/i18n/esn/src/vs/workbench/common/theme.i18n.json @@ -11,8 +11,10 @@ "tabHoverBackground": "Color de fondo de la pestaña activa. Las pestañas son los contenedores de los editores en el área de editores. Se pueden abrir varias pestañas en un grupo de editores. Puede haber varios grupos de editores. ", "tabUnfocusedHoverBackground": "Color de fondo de tabulación en un grupo no enfocado cuando se pasa. Las fichas son los contenedores para los editores en el área del editor. Se pueden abrir varias fichas en un grupo de editores. Puede haber varios grupos de editores.", "tabBorder": "Borde para separar las pestañas entre sí. Las pestañas son contenedores de editores en el área de editores. Se pueden abrir varias pestañas en un grupo de editores. Puede haber varios grupos de editores.", - "tabActiveBorder": "Borde para resaltar las fichas activas. Las fichas son los contenedores de los editores en el área de editores. Se pueden abrir varias fichas en un grupo de editores. Puede haber varios grupos de editores.", - "tabActiveUnfocusedBorder": "Borde para resaltar las fichas activas en un grupo que no tiene el foco. Las fichas son los contenedores de los editores en el área de editores. Se pueden abrir varias fichas en un grupo de editores. Puede haber varios grupos de editores. ", + "tabActiveBorder": "Borde en la parte inferior de una ficha activa. Las fichas son los contenedores para los editores en el área de edición. Múltiple pestañas pueden abrirse en un grupo de editor. Puede haber múltiples grupos de editor. ", + "tabActiveBorderTop": "Borde a la parte superior de una pestaña activa. Las pestañas son los contenedores para los editores en el área del editor. Se pueden abrir múltiples pestañas en un grupo de editores. Puede haber múltiples grupos de editores.", + "tabActiveUnfocusedBorder": "Borde en la parte inferior de una pestaña activa para un grupo no seleccionado. Las pestañas son los contenedores para los editores en el área del editor. Se pueden abrir múltiples pestañas en un grupo de editores. Puede haber múltiples grupos de editores.", + "tabActiveUnfocusedBorderTop": "Borde en la parte superior de una pestaña activa para un grupo no seleccionado. Las pestañas son los contenedores para los editores en el área del editor. Se pueden abrir múltiples pestañas en un grupo de editores. Puede haber múltiples grupos de editores.", "tabHoverBorder": "Borde para resaltar tabulaciones cuando se activan. Las fichas son los contenedores para los editores en el área del editor. Se pueden abrir varias fichas en un grupo de editores. Puede haber varios grupos de editores. ", "tabUnfocusedHoverBorder": "Borde para resaltar tabulaciones cuando se activan. Las fichas son los contenedores para los editores en el área del editor. Se pueden abrir varias fichas en un grupo de editores. Puede haber varios grupos de editores. ", "tabActiveForeground": "Color de primer plano de la pestaña activa en un grupo activo. Las pestañas son los contenedores de los editores en el área de editores. Se pueden abrir varias pestañas en un grupo de editores. Puede haber varios grupos de editores.", diff --git a/i18n/esn/src/vs/workbench/parts/codeEditor/electron-browser/largeFileOptimizations.i18n.json b/i18n/esn/src/vs/workbench/parts/codeEditor/electron-browser/largeFileOptimizations.i18n.json new file mode 100644 index 0000000000..a2543152c8 --- /dev/null +++ b/i18n/esn/src/vs/workbench/parts/codeEditor/electron-browser/largeFileOptimizations.i18n.json @@ -0,0 +1,13 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "largeFile": "{0}: la tokenización, ajuste y plegado han sido desactivadas para este archivo de gran tamaño con el fin de reducir el uso de memoria y evitar su cierre o bloqueo.", + "neverShowAgain": "De acuerdo. No volver a mostrar.", + "removeOptimizations": "Forzar la activación de características", + "reopenFilePrompt": "Vuelva a abrir el archivo para que esta configuración surta efecto." +} \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/debug/browser/debugActions.i18n.json b/i18n/esn/src/vs/workbench/parts/debug/browser/debugActions.i18n.json index 7489251a59..8cf427f772 100644 --- a/i18n/esn/src/vs/workbench/parts/debug/browser/debugActions.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/debug/browser/debugActions.i18n.json @@ -41,7 +41,7 @@ "debugConsoleAction": "Consola de depuración", "unreadOutput": "Nueva salida en la consola de depuración", "debugFocusConsole": "Enfocar consola de depuración", - "focusProcess": "Proceso Foco", + "focusSession": "Sesión de foco", "stepBackDebug": "Retroceder", "reverseContinue": "Invertir" } \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/debug/browser/debugCommands.i18n.json b/i18n/esn/src/vs/workbench/parts/debug/browser/debugCommands.i18n.json index c5d33ec874..a205730bcf 100644 --- a/i18n/esn/src/vs/workbench/parts/debug/browser/debugCommands.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/debug/browser/debugCommands.i18n.json @@ -7,7 +7,7 @@ "Do not edit this file. It is machine generated." ], "noFolderDebugConfig": "Abra una carpeta para trabajar con la configuración avanzada de depuración.", - "columnBreakpoint": "Punto de interrupción de columna", + "inlineBreakpoint": "Punto de interrupción insertado", "debug": "Depurar", - "addColumnBreakpoint": "Agregar punto de interrupción de columna" + "addInlineBreakpoint": "Agregar punto de interrupción insertado" } \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/debug/browser/debugEditorActions.i18n.json b/i18n/esn/src/vs/workbench/parts/debug/browser/debugEditorActions.i18n.json index 8ba86168ee..712a034280 100644 --- a/i18n/esn/src/vs/workbench/parts/debug/browser/debugEditorActions.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/debug/browser/debugEditorActions.i18n.json @@ -2,15 +2,17 @@ "": [ "--------------------------------------------------------------------------------------------", "Copyright (c) Microsoft Corporation. All rights reserved.", - "Licensed under the Source EULA. See License.txt in the project root for license information.", + "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], "toggleBreakpointAction": "Depuración: Alternar punto de interrupción", "conditionalBreakpointEditorAction": "Depuración: agregar punto de interrupción condicional...", - "logPointEditorAction": "Depuración: Añadir Logpoint...", + "logPointEditorAction": "Depuración: Agregar punto de registro...", "runToCursor": "Ejecutar hasta el cursor", "debugEvaluate": "Depuración: Evaluar", "debugAddToWatch": "Depuración: Agregar a inspección", - "showDebugHover": "Depuración: Mostrar al mantener el puntero" + "showDebugHover": "Depuración: Mostrar al mantener el puntero", + "goToNextBreakpoint": "Depuración: Ir al siguiente punto de interrupción", + "goToPreviousBreakpoint": "Depuración: Ir al punto de interrupción anterior" } \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/debug/browser/debugViewlet.i18n.json b/i18n/esn/src/vs/workbench/parts/debug/browser/debugViewlet.i18n.json index 6dc7b4647b..aec00e253d 100644 --- a/i18n/esn/src/vs/workbench/parts/debug/browser/debugViewlet.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/debug/browser/debugViewlet.i18n.json @@ -6,6 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "startAdditionalSession": "Iniciar otra sesión", "debugFocusVariablesView": "Variables de Enfoque ", "debugFocusWatchView": "Reloj de enfoque", "debugFocusCallStackView": "Pila de Enfoque ", diff --git a/i18n/esn/src/vs/workbench/parts/debug/common/debugSchemas.i18n.json b/i18n/esn/src/vs/workbench/parts/debug/common/debugSchemas.i18n.json new file mode 100644 index 0000000000..7ea3ee3807 --- /dev/null +++ b/i18n/esn/src/vs/workbench/parts/debug/common/debugSchemas.i18n.json @@ -0,0 +1,38 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "vscode.extension.contributes.debuggers": "Aporta adaptadores de depuración.", + "vscode.extension.contributes.debuggers.type": "Identificador único de este adaptador de depuración.", + "vscode.extension.contributes.debuggers.label": "Nombre para mostrar del adaptador de depuración.", + "vscode.extension.contributes.debuggers.program": "Ruta de acceso al programa de adaptadores de depuración, que puede ser absoluta o relativa respecto a la carpeta de extensión.", + "vscode.extension.contributes.debuggers.args": "Argumentos opcionales que se pasarán al adaptador.", + "vscode.extension.contributes.debuggers.runtime": "Entorno de ejecución opcional en caso de que el atributo del programa no sea un ejecutable pero requiera un entorno de ejecución.", + "vscode.extension.contributes.debuggers.runtimeArgs": "Argumentos de entorno de ejecución opcionales.", + "vscode.extension.contributes.debuggers.variables": "Asignación de variables interactivas (por ejemplo, ${action.pickProcess}) en `launch.json` a un comando.", + "vscode.extension.contributes.debuggers.initialConfigurations": "Configuraciones para generar el archivo \"launch.json\" inicial.", + "vscode.extension.contributes.debuggers.languages": "Lista de lenguajes para los que la extensión de depuración podría considerarse el \"depurador predeterminado\".", + "vscode.extension.contributes.debuggers.adapterExecutableCommand": "Si se especifica, VS Code llamará a este comando para determinar la ruta de acceso ejecutable del adaptador de depuración y los argumentos que se deben pasar.", + "vscode.extension.contributes.debuggers.configurationSnippets": "Fragmentos de código para agregar nuevas configuraciones a \"launch.json\".", + "vscode.extension.contributes.debuggers.configurationAttributes": "Configuraciones de esquema JSON para validar \"launch.json\".", + "vscode.extension.contributes.debuggers.windows": "Configuración específica de Windows.", + "vscode.extension.contributes.debuggers.windows.runtime": "Entorno de ejecución que se usa para Windows.", + "vscode.extension.contributes.debuggers.osx": "Configuración específica de macOS", + "vscode.extension.contributes.debuggers.osx.runtime": "Entorno de ejecución utilizado para macOS.", + "vscode.extension.contributes.debuggers.linux": "Configuración específica de Linux.", + "vscode.extension.contributes.debuggers.linux.runtime": "Entorno de ejecución que se usa para Linux.", + "vscode.extension.contributes.breakpoints": "Aporta puntos de interrupción.", + "vscode.extension.contributes.breakpoints.language": "Permite puntos de interrupción para este lenguaje.", + "app.launch.json.title": "Iniciar", + "app.launch.json.version": "Versión de este formato de archivo.", + "app.launch.json.configurations": "Lista de configuraciones. Agregue configuraciones nuevas o edite las ya existentes con IntelliSense.", + "app.launch.json.compounds": "Lista de elementos compuestos. Cada elemento compuesto hace referencia a varias configuraciones, que se iniciarán conjuntamente.", + "app.launch.json.compound.name": "Nombre del elemento compuesto. Aparece en el menú desplegable de la configuración de inicio.", + "useUniqueNames": "Por favor utilice nombres de configuración exclusivos.", + "app.launch.json.compound.folder": "Nombre de la carpeta en la que se encuentra el compuesto.", + "app.launch.json.compounds.configurations": "Nombres de las configuraciones que se iniciarán como parte de este elemento compuesto." +} \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/debug/electron-browser/callStackView.i18n.json b/i18n/esn/src/vs/workbench/parts/debug/electron-browser/callStackView.i18n.json index 1dd043fdd3..72e9cf1d5e 100644 --- a/i18n/esn/src/vs/workbench/parts/debug/electron-browser/callStackView.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/debug/electron-browser/callStackView.i18n.json @@ -9,7 +9,7 @@ "callstackSection": "Sección de la pila de llamadas", "debugStopped": "En pausa en {0}", "callStackAriaLabel": "Pila de llamadas de la depuración", - "process": "Proceso", + "session": "Sesión", "paused": "En pausa", "running": "En ejecución", "thread": "Subproceso", diff --git a/i18n/esn/src/vs/workbench/parts/debug/electron-browser/debug.contribution.i18n.json b/i18n/esn/src/vs/workbench/parts/debug/electron-browser/debug.contribution.i18n.json index 81e2bc5787..109da65711 100644 --- a/i18n/esn/src/vs/workbench/parts/debug/electron-browser/debug.contribution.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/debug/electron-browser/debug.contribution.i18n.json @@ -21,11 +21,12 @@ "allowBreakpointsEverywhere": "Permite establecer un punto de interrupción en cualquier archivo.", "openExplorerOnEnd": "Abrir automáticamente la vista del explorador al final de una sesión de depuración", "inlineValues": "Mostrar valores de variable en línea en el editor durante la depuración", - "hideActionBar": "Controla si debe ocultarse la barra flotante de acciones de depuración", + "toolBarLocation": "Controla la ubicación de la barra de herramientas de depuración: \"floating\" (flotante) en todas las vistas, \"docked\" (acoplada) en la vista de depuración o \"hidden\" (oculta).", "never": "Nunca mostrar debug en la barra de estado", "always": "Siempre mostrar debug en la barra de estado", "onFirstSessionStart": "Mostrar debug en la barra de estado solamente después del primero uso de debug", "showInStatusBar": "Controla cuando se debe mostrar la barra de estado de depuración", "openDebug": "Controla si debe abrirse la vista de depuración al iniciar una sesión de depuración.", + "enableAllHovers": "Controla si el indicador de no depuración debe estar habilitado durante la depuración. Si es cierto, se llamará a los proveedores de flotadores para que proporcionen un flotador. No se mostrarán los flotadores regulares incluso si este ajuste es verdadero.", "launch": "Configuración de lanzamiento para depuración global. Debe utilizarse como una alternativa a “launch.json” en espacios de trabajo compartidos." } \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.i18n.json b/i18n/esn/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.i18n.json index d5d1fc1967..f119fb8edb 100644 --- a/i18n/esn/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.i18n.json @@ -6,35 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "vscode.extension.contributes.debuggers": "Aporta adaptadores de depuración.", - "vscode.extension.contributes.debuggers.type": "Identificador único de este adaptador de depuración.", - "vscode.extension.contributes.debuggers.label": "Nombre para mostrar del adaptador de depuración.", - "vscode.extension.contributes.debuggers.program": "Ruta de acceso al programa de adaptadores de depuración, que puede ser absoluta o relativa respecto a la carpeta de extensión.", - "vscode.extension.contributes.debuggers.args": "Argumentos opcionales que se pasarán al adaptador.", - "vscode.extension.contributes.debuggers.runtime": "Entorno de ejecución opcional en caso de que el atributo del programa no sea un ejecutable pero requiera un entorno de ejecución.", - "vscode.extension.contributes.debuggers.runtimeArgs": "Argumentos de entorno de ejecución opcionales.", - "vscode.extension.contributes.debuggers.variables": "Asignación de variables interactivas (por ejemplo, ${action.pickProcess}) en `launch.json` a un comando.", - "vscode.extension.contributes.debuggers.initialConfigurations": "Configuraciones para generar el archivo \"launch.json\" inicial.", - "vscode.extension.contributes.debuggers.languages": "Lista de lenguajes para los que la extensión de depuración podría considerarse el \"depurador predeterminado\".", - "vscode.extension.contributes.debuggers.adapterExecutableCommand": "Si se especifica, VS Code llamará a este comando para determinar la ruta de acceso ejecutable del adaptador de depuración y los argumentos que se deben pasar.", - "vscode.extension.contributes.debuggers.configurationSnippets": "Fragmentos de código para agregar nuevas configuraciones a \"launch.json\".", - "vscode.extension.contributes.debuggers.configurationAttributes": "Configuraciones de esquema JSON para validar \"launch.json\".", - "vscode.extension.contributes.debuggers.windows": "Configuración específica de Windows.", - "vscode.extension.contributes.debuggers.windows.runtime": "Entorno de ejecución que se usa para Windows.", - "vscode.extension.contributes.debuggers.osx": "Configuración específica de macOS", - "vscode.extension.contributes.debuggers.osx.runtime": "Entorno de ejecución utilizado para macOS.", - "vscode.extension.contributes.debuggers.linux": "Configuración específica de Linux.", - "vscode.extension.contributes.debuggers.linux.runtime": "Entorno de ejecución que se usa para Linux.", - "vscode.extension.contributes.breakpoints": "Aporta puntos de interrupción.", - "vscode.extension.contributes.breakpoints.language": "Permite puntos de interrupción para este lenguaje.", - "app.launch.json.title": "Iniciar", - "app.launch.json.version": "Versión de este formato de archivo.", - "app.launch.json.configurations": "Lista de configuraciones. Agregue configuraciones nuevas o edite las ya existentes con IntelliSense.", - "app.launch.json.compounds": "Lista de elementos compuestos. Cada elemento compuesto hace referencia a varias configuraciones, que se iniciarán conjuntamente.", - "app.launch.json.compound.name": "Nombre del elemento compuesto. Aparece en el menú desplegable de la configuración de inicio.", - "useUniqueNames": "Por favor utilice nombres de configuración exclusivos.", - "app.launch.json.compound.folder": "Nombre de la carpeta en la que se encuentra el compuesto.", - "app.launch.json.compounds.configurations": "Nombres de las configuraciones que se iniciarán como parte de este elemento compuesto.", "debugNoType": "El 'tipo' de depurador no se puede omitir y debe ser de tipo 'cadena'. ", "selectDebug": "Seleccionar entorno", "DebugConfig.failed": "No se puede crear el archivo \"launch.json\" dentro de la carpeta \".vscode\" ({0}).", diff --git a/i18n/esn/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json b/i18n/esn/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json index 877d792dbe..fcf6be03f0 100644 --- a/i18n/esn/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json @@ -2,35 +2,35 @@ "": [ "--------------------------------------------------------------------------------------------", "Copyright (c) Microsoft Corporation. All rights reserved.", - "Licensed under the Source EULA. See License.txt in the project root for license information.", + "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "logPoint": "Logpoint", + "logPoint": "Punto de registro", "breakpoint": "Punto de interrupción", "removeBreakpoint": "Quitar {0}", "editBreakpoint": "Editar {0}...", - "disableBreakpoint": "Desactivar {0}", + "disableBreakpoint": "Deshabilitar {0}", "enableBreakpoint": "Activar {0}", "removeBreakpoints": "Quitar puntos de interrupción", - "removeBreakpointOnColumn": "Quitar punto de interrupción en la columna {0}", + "removeInlineBreakpointOnColumn": "Quitar el punto de interrupción insertado en la columna {0}", "removeLineBreakpoint": "Quitar punto de interrupción de línea", "editBreakpoints": "Editar puntos de interrupción", - "editBreakpointOnColumn": "Editar punto de interrupción en la columna {0}", + "editInlineBreakpointOnColumn": "Editar el punto de interrupción insertado en la columna {0}", "editLineBrekapoint": "Editar punto de interrupción de línea", "enableDisableBreakpoints": "Habilitar o deshabilitar puntos de interrupción", - "disableColumnBreakpoint": "Deshabilitar punto de interrupción en la columna {0}", + "disableInlineColumnBreakpoint": "Deshabilitar el punto de interrupción insertado en la columna {0}", "disableBreakpointOnLine": "Deshabilitar punto de interrupción de línea", - "enableBreakpoints": "Habilitar punto de interrupción en la columna {0}", + "enableBreakpoints": "Habilitar el punto de interrupción insertado en la columna {0}", "enableBreakpointOnLine": "Habilitar punto de interrupción de línea", "addBreakpoint": "Agregar punto de interrupción", "addConditionalBreakpoint": "Agregar punto de interrupción condicional...", - "addLogPoint": "Añadir Logpoint...", + "addLogPoint": "Agregar punto de registro", "breakpointHasCondition": "Este {0} tiene una {1} que se perderá al quitarla. Considere la posibilidad de desactivar el {0} en su lugar.", "message": "mensaje", "condition": "condición", "removeLogPoint": "Quitar {0}", - "disableLogPoint": "Desactivar {0}", + "disableLogPoint": "Deshabilitar {0}", "cancel": "Cancelar", "addConfiguration": "Agregar configuración..." } \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/debug/node/debugger.i18n.json b/i18n/esn/src/vs/workbench/parts/debug/node/debugger.i18n.json index b916d2192f..ea147e6e5a 100644 --- a/i18n/esn/src/vs/workbench/parts/debug/node/debugger.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/debug/node/debugger.i18n.json @@ -6,7 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "launch.config.comment1": "Utilizar IntelliSense para aprender acerca de los posibles atributos.", + "launch.config.comment1": "Use IntelliSense para saber los atributos posibles.", "launch.config.comment2": "Mantenga el puntero para ver las descripciones de los existentes atributos ", "launch.config.comment3": "Para más información, visite: {0}", "debugType": "Tipo de configuración.", diff --git a/i18n/esn/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.i18n.json b/i18n/esn/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.i18n.json index b632b359f0..c17e1a9593 100644 --- a/i18n/esn/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.i18n.json @@ -16,9 +16,13 @@ "repository": "Repositorio", "license": "Licencia", "details": "Detalles", + "detailstooltip": "Detalles de la extensión, mostrados en el archivo 'README.md' de la extensión", "contributions": "Contribuciones", + "contributionstooltip": "Enumera las contribuciones de esta extensión a VS Code", "changelog": "Registro de cambios", + "changelogtooltip": "Historial de actualización de extensiones renderizado desde el archivo 'changelog.MD' ", "dependencies": "Dependencias", + "dependenciestooltip": "Enumera las extensiones de las que depende esta extensión", "noReadme": "No hay ningún archivo LÉAME disponible.", "noChangelog": "No hay ningún objeto CHANGELOG disponible.", "noContributions": "No hay contribuciones.", @@ -30,6 +34,10 @@ "debuggers": "Depuradores ({0})", "debugger name": "Nombre", "debugger type": "Tipo", + "viewContainers": "Ver contenedores ({0})", + "view container id": "Id.", + "view container title": "Título", + "view container location": "Donde", "views": "Vistas ({0})", "view id": "Id.", "view name": "Nombre", diff --git a/i18n/esn/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json b/i18n/esn/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json index 622a09f888..550f4b142f 100644 --- a/i18n/esn/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json @@ -8,7 +8,6 @@ ], "neverShowAgain": "No volver a mostrar", "searchMarketplace": "Buscar en Marketplace ", - "showLanguagePackExtensions": "Marketplace tiene extensiones que pueden facilitar la adaptación de VS Code a la configuración regional \"{0}\"", "dynamicWorkspaceRecommendation": "Esta extensión podría interesarle porque muchos otros usuarios del repositorio {0} la utilizan.", "exeBasedRecommendation": "Se recomienda esta extensión porque tiene instalado {0} . ", "fileBasedRecommendation": "Esta extensión se recomienda basado en los archivos que abrió recientemente.", diff --git a/i18n/esn/src/vs/workbench/parts/extensions/node/extensionsWorkbenchService.i18n.json b/i18n/esn/src/vs/workbench/parts/extensions/node/extensionsWorkbenchService.i18n.json index 7a3e6b51e5..81b30efed5 100644 --- a/i18n/esn/src/vs/workbench/parts/extensions/node/extensionsWorkbenchService.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/extensions/node/extensionsWorkbenchService.i18n.json @@ -10,12 +10,12 @@ "malicious": "Se reporta que esta extensión es problemática.", "installingMarketPlaceExtension": "Instalando Extension desde Marketplace...", "uninstallingExtension": "Desinstalando la extensión....", - "enableDependeciesConfirmation": "Si habilita \"{0}\", también se habilitarán sus dependencias. ¿Desea continuar?", + "enableDependeciesConfirmation": "Habilitando una extensión también se habilitan sus dependencias. ¿Desea continuar?", "enable": "Sí", "doNotEnable": "No", - "disableDependeciesConfirmation": "¿Desea deshabilitar solo \"{0}\" o también sus dependencias?", - "disableOnly": "Solo", - "disableAll": "Todo", + "disableDependeciesConfirmation": "¿Desea deshabilitar las dependencias de las extensiones?", + "yes": "Sí", + "no": "No", "cancel": "Cancelar", "singleDependentError": "No se puede deshabilitar la extensión \"{0}\". La extensión \"{1}\" depende de ella.", "twoDependentsError": "No se puede deshabilitar la extensión \"{0}\". Las extensiones \"{1}\" y \"{2}\" dependen de ella.", diff --git a/i18n/esn/src/vs/workbench/parts/files/browser/editors/textFileEditor.i18n.json b/i18n/esn/src/vs/workbench/parts/files/browser/editors/textFileEditor.i18n.json index 2ac605f5e1..36b35a0518 100644 --- a/i18n/esn/src/vs/workbench/parts/files/browser/editors/textFileEditor.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/files/browser/editors/textFileEditor.i18n.json @@ -9,7 +9,7 @@ "textFileEditor": "Editor de archivos de texto", "createFile": "Crear archivo", "relaunchWithIncreasedMemoryLimit": "Reiniciar con {0} MB", - "configureMemoryLimit": "Configurar el límite de memoria", + "configureMemoryLimit": "Configurar límite de memoria", "fileEditorWithInputAriaLabel": "{0}. Editor de archivos de texto.", "fileEditorAriaLabel": "Editor de archivos de texto." } \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json b/i18n/esn/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json index 37a11ca875..1e23db714d 100644 --- a/i18n/esn/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json @@ -2,7 +2,7 @@ "": [ "--------------------------------------------------------------------------------------------", "Copyright (c) Microsoft Corporation. All rights reserved.", - "Licensed under the Source EULA. See License.txt in the project root for license information.", + "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], @@ -33,13 +33,13 @@ "trashFailed": "No se pudo eliminar usando la papelera. ¿Desea eliminar de forma permanente?", "deletePermanentlyButtonLabel": "&&Eliminar de forma permanente", "retryButtonLabel": "&&Reintentar", - "confirmMoveTrashMessageFilesAndDirectories": "¿Está seguro que desea eliminar los siguientes archivos/directorios de {0} y su contenido?", - "confirmMoveTrashMessageMultipleDirectories": "¿Está seguro que desea eliminar los siguientes directorios de {0} y su contenido?", + "confirmMoveTrashMessageFilesAndDirectories": "¿Está seguro de que desea eliminar los {0} archivos o directorios siguientes y su contenido?", + "confirmMoveTrashMessageMultipleDirectories": "¿Está seguro de que desea eliminar los {0} directorios siguientes y su contenido? ", "confirmMoveTrashMessageMultiple": "¿Está seguro de que desea eliminar los siguientes archivos {0}?", "confirmMoveTrashMessageFolder": "¿Está seguro de que desea eliminar '{0}' y su contenido?", "confirmMoveTrashMessageFile": "¿Está seguro de que desea eliminar '{0}'?", - "confirmDeleteMessageFilesAndDirectories": "¿Está seguro que desea eliminar permanentemente los archivos/directorios siguientes {0} y su contenido?", - "confirmDeleteMessageMultipleDirectories": "¿Está seguro que desea eliminar permanentemente los siguientes directorios de {0} y su contenido?", + "confirmDeleteMessageFilesAndDirectories": "¿Está seguro de que desea eliminar los {0} archivos o directorios siguientes y su contenido de forma permanente?", + "confirmDeleteMessageMultipleDirectories": "¿Está seguro de que desea eliminar los {0} directorios siguientes y su contenido de forma permanente? ", "confirmDeleteMessageMultiple": "¿Está seguro de que desea eliminar de forma permanente los siguientes archivos {0}?", "confirmDeleteMessageFolder": "¿Está seguro de que desea eliminar '{0}' y su contenido de forma permanente?", "confirmDeleteMessageFile": "¿Está seguro de que desea eliminar '{0}' de forma permanente?", @@ -65,7 +65,6 @@ "emptyFileNameError": "Debe especificarse un nombre de archivo o carpeta.", "fileNameStartsWithSlashError": "El nombre de archivo o carpeta no puede comenzar con el carácter barra. ", "fileNameExistsError": "Ya existe el archivo o carpeta **{0}** en esta ubicación. Elija un nombre diferente.", - "fileUsedAsFolderError": "** {0} ** es un archivo y no puede tener elementos descendientes. ", "invalidFileNameError": "El nombre **{0}** no es válido para el archivo o la carpeta. Elija un nombre diferente.", "filePathTooLongError": "El nombre **{0}** da como resultado una ruta de acceso demasiado larga. Elija un nombre más corto.", "compareWithClipboard": "Comparar archivo activo con portapapeles", diff --git a/i18n/esn/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.i18n.json b/i18n/esn/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.i18n.json index d9af20c955..c8dca1d775 100644 --- a/i18n/esn/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.i18n.json @@ -7,9 +7,9 @@ "Do not edit this file. It is machine generated." ], "fileInputAriaLabel": "Escriba el nombre de archivo. Presione ENTRAR para confirmar o Esc para cancelar", - "createFileFromExplorerInfoMessage": "Crear archivo ** {0} ** en ** {1} **", - "renameFileFromExplorerInfoMessage": "Mover y renombrar a ** {0} **", - "createFolderFromExplorerInfoMessage": "Crear carpeta ** {0} ** en ** {1} **", + "createFileFromExplorerInfoMessage": "Crear el archivo **{0}** en **{1}**", + "renameFileFromExplorerInfoMessage": "Mover y cambiar nombre a **{0}**", + "createFolderFromExplorerInfoMessage": "Crear la carpeta **{0}** en **{1}**", "filesExplorerViewerAriaLabel": "{0}, Explorador de archivos", "dropFolders": "¿Quiere agregar las carpetas al área de trabajo?", "dropFolder": "¿Quiere agregar la carpeta al área de trabajo?", diff --git a/i18n/esn/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.i18n.json b/i18n/esn/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.i18n.json index 2acd632d22..ec042cfefb 100644 --- a/i18n/esn/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.i18n.json @@ -7,6 +7,7 @@ "Do not edit this file. It is machine generated." ], "updateLocale": "¿Desea cambiar el idioma de la interfaz de usuario de VS Code a {0} y reiniciar la aplicación?", + "activateLanguagePack": "¿Desea reiniciar VS Code para activar el paquete de idioma que acaba de instalar?", "yes": "Sí", "no": "No", "neverAgain": "No volver a mostrar", diff --git a/i18n/esn/src/vs/workbench/parts/localizations/electron-browser/localizationsActions.i18n.json b/i18n/esn/src/vs/workbench/parts/localizations/electron-browser/localizationsActions.i18n.json index e5e5ab4cfb..179fc6bda4 100644 --- a/i18n/esn/src/vs/workbench/parts/localizations/electron-browser/localizationsActions.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/localizations/electron-browser/localizationsActions.i18n.json @@ -6,7 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "configureLocale": "Configurar idioma", + "configureLocale": "Configurar idioma de pantalla", "displayLanguage": "Define el lenguaje para mostrar de VSCode.", "doc": "Consulte {0} para obtener una lista de idiomas compatibles.", "restart": "Al cambiar el valor se requiere reiniciar VSCode.", diff --git a/i18n/esn/src/vs/workbench/parts/markers/electron-browser/markersPanel.i18n.json b/i18n/esn/src/vs/workbench/parts/markers/electron-browser/markersPanel.i18n.json index 04f7dd0d77..62fe295a77 100644 --- a/i18n/esn/src/vs/workbench/parts/markers/electron-browser/markersPanel.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/markers/electron-browser/markersPanel.i18n.json @@ -6,6 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "disableFilesExclude": "Desactivar filtro de exclusión de archivos.", + "disableFilesExclude": "Deshabilitar el filtro de exclusión de archivos.", "clearFilter": "Borrar el filtro." } \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/markers/electron-browser/markersPanelActions.i18n.json b/i18n/esn/src/vs/workbench/parts/markers/electron-browser/markersPanelActions.i18n.json index cd0f382c88..6c7f0c66ec 100644 --- a/i18n/esn/src/vs/workbench/parts/markers/electron-browser/markersPanelActions.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/markers/electron-browser/markersPanelActions.i18n.json @@ -6,5 +6,5 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "showing filtered problems": "Mostrando {0} de {1}" + "showing filtered problems": "Se muestran {0} de {1}" } \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/outline/electron-browser/outline.contribution.i18n.json b/i18n/esn/src/vs/workbench/parts/outline/electron-browser/outline.contribution.i18n.json new file mode 100644 index 0000000000..839ec8ac0d --- /dev/null +++ b/i18n/esn/src/vs/workbench/parts/outline/electron-browser/outline.contribution.i18n.json @@ -0,0 +1,12 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "name": "Esquema", + "category.focus": "Archivo", + "label.focus": "Foco en el esquema" +} \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/outline/electron-browser/outlinePanel.i18n.json b/i18n/esn/src/vs/workbench/parts/outline/electron-browser/outlinePanel.i18n.json new file mode 100644 index 0000000000..41671fe33a --- /dev/null +++ b/i18n/esn/src/vs/workbench/parts/outline/electron-browser/outlinePanel.i18n.json @@ -0,0 +1,17 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "filter": "Filtro", + "collapse": "Contraer todo", + "sortByPosition": "Ordenar por: posición", + "sortByName": "Ordenar por: Nombre", + "sortByKind": "Ordenar por: tipo", + "live": "Seguir el Cursor", + "no-editor": "No hay editores abiertos que pueden proporcionar información del esquema.", + "too-many-symbols": "Lamentablemente, este archivo es demasiado grande para mostrar un esquema." +} \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/outline/electron-browser/outlineTree.i18n.json b/i18n/esn/src/vs/workbench/parts/outline/electron-browser/outlineTree.i18n.json new file mode 100644 index 0000000000..460ddbc031 --- /dev/null +++ b/i18n/esn/src/vs/workbench/parts/outline/electron-browser/outlineTree.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "outline.title": "línea {0} en {1} " +} \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/output/browser/outputPanel.i18n.json b/i18n/esn/src/vs/workbench/parts/output/browser/outputPanel.i18n.json index 0aad6ec66d..853b13fee5 100644 --- a/i18n/esn/src/vs/workbench/parts/output/browser/outputPanel.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/output/browser/outputPanel.i18n.json @@ -6,6 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "output": "Salida", "outputPanelWithInputAriaLabel": "{0}, panel de salida", "outputPanelAriaLabel": "Panel de salida" } \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/preferences/browser/keybindingWidgets.i18n.json b/i18n/esn/src/vs/workbench/parts/preferences/browser/keybindingWidgets.i18n.json index 7072dcae3b..6fc3f1f0d0 100644 --- a/i18n/esn/src/vs/workbench/parts/preferences/browser/keybindingWidgets.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/preferences/browser/keybindingWidgets.i18n.json @@ -6,6 +6,8 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "defineKeybinding.oneExists": "1 comando existente tiene esta combinación de teclas", + "defineKeybinding.existing": "{0} comandos tienen este enlace de teclado", "defineKeybinding.initial": "Presione la combinación de teclas deseada y ENTRAR", "defineKeybinding.chordsTo": "chord to" } \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json b/i18n/esn/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json index dd2ecf1e96..07baa220f3 100644 --- a/i18n/esn/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json @@ -7,6 +7,7 @@ "Do not edit this file. It is machine generated." ], "openRawDefaultSettings": "Abrir Configuración Predeterminada Raw", + "openSettings2": "Abrir configuración (versión preliminar)", "openSettings": "Abrir configuración", "openGlobalSettings": "Abrir configuración de usuario", "openGlobalKeybindings": "Abrir métodos abreviados de teclado", diff --git a/i18n/esn/src/vs/workbench/parts/preferences/browser/settingsEditor2.i18n.json b/i18n/esn/src/vs/workbench/parts/preferences/browser/settingsEditor2.i18n.json new file mode 100644 index 0000000000..d92e80e75a --- /dev/null +++ b/i18n/esn/src/vs/workbench/parts/preferences/browser/settingsEditor2.i18n.json @@ -0,0 +1,18 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "previewWarning": "Vista Previa", + "previewLabel": "Esta es una versión preliminar del nuevo editor de configuración", + "SearchSettings.AriaLabel": "Buscar configuración", + "SearchSettings.Placeholder": "Buscar configuración", + "advancedCustomizationLabel": "Para personalizaciones avanzadas, abra y edite el archivo ", + "openSettingsLabel": "settings.json", + "showOverriddenOnly": "Mostrar solo lo que se ha modificado", + "treeAriaLabel": "Configuración", + "feedbackButtonLabel": "Proporcionar comentarios" +} \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/preferences/browser/settingsTree.i18n.json b/i18n/esn/src/vs/workbench/parts/preferences/browser/settingsTree.i18n.json new file mode 100644 index 0000000000..a5ec14b6bc --- /dev/null +++ b/i18n/esn/src/vs/workbench/parts/preferences/browser/settingsTree.i18n.json @@ -0,0 +1,19 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "modifiedItemForeground": "Color de primer plano para un ajuste modificado.", + "workspace": "Área de trabajo", + "user": "Usuario", + "resetButtonTitle": "restablecer", + "configured": "Modificado", + "alsoConfiguredIn": "Modificado también en", + "configuredIn": "Modificado en", + "editInSettingsJson": "Editar en settings.json", + "settingRowAriaLabel": "{0} {1}, Configuración", + "groupRowAriaLabel": "{0}, grupo" +} \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/preferences/electron-browser/preferences.contribution.i18n.json b/i18n/esn/src/vs/workbench/parts/preferences/electron-browser/preferences.contribution.i18n.json index 8f9c83d2bb..d11db87860 100644 --- a/i18n/esn/src/vs/workbench/parts/preferences/electron-browser/preferences.contribution.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/preferences/electron-browser/preferences.contribution.i18n.json @@ -7,6 +7,7 @@ "Do not edit this file. It is machine generated." ], "defaultPreferencesEditor": "Editor de preferencias predeterminado", + "settingsEditor2": "Editor de configuración 2", "keybindingsEditor": "Editor de enlaces de teclado", "preferences": "Preferencias" } \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/search/browser/searchActions.i18n.json b/i18n/esn/src/vs/workbench/parts/search/browser/searchActions.i18n.json index c64f4ac2b7..414deb9b54 100644 --- a/i18n/esn/src/vs/workbench/parts/search/browser/searchActions.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/search/browser/searchActions.i18n.json @@ -12,6 +12,8 @@ "previousSearchExcludePattern": "Mostrar búsqueda anterior de patrón exclude ", "nextSearchTerm": "Mostrar siguiente término de búsqueda", "previousSearchTerm": "Mostrar anterior término de búsqueda", + "nextReplaceTerm": "Mostrar siguiente término de Reemplazo de búsqueda", + "previousReplaceTerm": "Mostrar la búsqueda anterior de Reemplazar término", "findInFiles": "Buscar en archivos", "replaceInFiles": "Reemplazar en archivos", "RefreshAction.label": "Actualizar", diff --git a/i18n/esn/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json b/i18n/esn/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json index 99fee11481..d7550e4cd7 100644 --- a/i18n/esn/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json @@ -31,5 +31,5 @@ "search.followSymlinks": "Controla si debe seguir enlaces simbólicos durante la búsqueda.", "search.smartCase": "Proporciona busquedas de mayúsculas y minúsculas si el patrón es todo en minúsculas, de lo contrario, busca en mayúsculas y minúsculas", "search.globalFindClipboard": "Controla si la vista de búsqueda debe leer o modificar el portapapeles de búsqueda compartido en macOS", - "search.location": "Controla si la búsqueda se mostrará como una vista en la barra lateral o como un panel en el área del panel para un espacio más horizontal. La siguiente versión de la búsqueda en el panel tendrá un mejor diseño horizontal y esto ya no será una vista previa." + "search.location": "Controla si la búsqueda se muestra como una vista en la barra lateral o como un panel en el área de paneles para disponer de más espacio horizontal." } \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/tasks/electron-browser/jsonSchema_v2.i18n.json b/i18n/esn/src/vs/workbench/parts/tasks/electron-browser/jsonSchema_v2.i18n.json index bc81662c65..2bf39d068f 100644 --- a/i18n/esn/src/vs/workbench/parts/tasks/electron-browser/jsonSchema_v2.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/tasks/electron-browser/jsonSchema_v2.i18n.json @@ -28,6 +28,7 @@ "JsonSchema.tasks.group.none": "No asigna la tarea a ningún grupo", "JsonSchema.tasks.group": "Define a qué grupo de ejecución pertenece esta tarea. Admite \"compilación\" para agregarla al grupo de compilación y \"prueba\" para agregarla al grupo de prueba.", "JsonSchema.tasks.type": "Define si la tarea se ejecuta como un proceso o como un comando dentro de in shell. ", + "JsonSchema.commandArray": "El comando Shell que se ejecutará. Los elementos de la matriz se ensamblarán mediante un carácter de espacio", "JsonSchema.command.quotedString.value": "El valor actual del comando", "JsonSchema.tasks.quoting.escape": "Carácteres de escape usan el carácter de escape de la linea de comandos (ej.: ' en PowerShell y \\ en Bash)", "JsonSchema.tasks.quoting.strong": "Cita el argumento usando el carácter de citación doble de la linea de comandos (ej.: \" en PowerShell y Bash) ", diff --git a/i18n/esn/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json b/i18n/esn/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json index 7024547e7b..cf1ca0ef5c 100644 --- a/i18n/esn/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json @@ -31,8 +31,8 @@ "selectProblemMatcher": "Seleccione qué tipo de errores y advertencias deben buscarse durante el examen de la salida de la tarea", "customizeParseErrors": "La configuración actual de tareas contiene errores. Antes de personalizar una tarea, corrija los errores.", "moreThanOneBuildTask": "Hay muchas tareas de compilación definidas en el archivo tasks.json. Se ejecutará la primera.\n", - "TaskSystem.activeSame.background": "La tarea '{0}' ya está activa y en segundo plano.", - "TaskSystem.activeSame.noBackground": "La tarea '{0}' ya está activa.", + "TaskSystem.activeSame.background": "La tarea \"{0}\" ya está activa en segundo plano.", + "TaskSystem.activeSame.noBackground": "La tarea \"{0}\" ya está activa.", "terminateTask": "Finalizar tarea", "restartTask": "Reiniciar tarea", "TaskSystem.active": "Ya hay una tarea en ejecución. Finalícela antes de ejecutar otra tarea.", diff --git a/i18n/esn/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.i18n.json b/i18n/esn/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.i18n.json index 827525ef5f..b41679d9cd 100644 --- a/i18n/esn/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.i18n.json @@ -19,6 +19,7 @@ "terminal.integrated.copyOnSelection": "Cuando se establece, el texto seleccionado en el terminal se copiará en el portapapeles.", "terminal.integrated.fontFamily": "Controla la familia de fuentes del terminal, que está establecida de manera predeterminada en el valor de editor.fontFamily.", "terminal.integrated.fontSize": "Controla el tamaño de la fuente en píxeles del terminal.", + "terminal.integrated.letterSpacing": "Controla el espaciado de las letras del terminal, este es un valor entero que representa la cantidad de píxeles adicionales a añadir entre los caracteres.", "terminal.integrated.lineHeight": "Controla el alto de línea del terminal. Este número se multiplica por el tamaño de fuente del terminal para obtener el alto de línea real en píxeles.", "terminal.integrated.fontWeight": "Espesor de fuente que debe usarse en el terminal para el texto que no está en negrita.", "terminal.integrated.fontWeightBold": "Espesor de fuente que debe usarse en el terminal para el texto en negrita.", @@ -26,7 +27,8 @@ "terminal.integrated.cursorStyle": "Controla el estilo de cursor del terminal.", "terminal.integrated.scrollback": "Controla la cantidad máxima de líneas que mantiene el terminal en su búfer.", "terminal.integrated.setLocaleVariables": "Controla si las variables de configuración regional se definen al inicio del terminal. El valor predeterminado es true en OS X y false en las demás plataformas.", - "terminal.integrated.rightClickBehavior": "Controla el modo en el que el terminal reacciona al clic con el botón derecho. Las posibilidades son \"default\", \"copyPaste\" y \"selectWord\". \"default\" muestra el menú contextual. \"copyPaste\" copia si hay algo seleccionado; de lo contrario, pega. \"selectWord\" selecciona la palabra que hay debajo del cursor y muestra el menú contextual.", + "terminal.integrated.rendererType": "Controla el modo en el que se representa el terminal. Las opciones son \"canvas\" para el representador de lienzo estándar (rápido), \"dom\" para el representador de reserva basado en DOM o \"auto\", que deja que VS Code determine cuál es mejor. Para que esta opción surta efecto, es necesario reiniciar VS Code.", + "terminal.integrated.rightClickBehavior": "Controla cómo reacciona el terminal al clic derecho, las posibilidades son \"default\", \"copyPaste\" y \"selectWord\". \"default\" mostrará el menú contextual, \"copyPaste\" copiará cuando haya una selección; de lo contrario, se pegará, \"selectWord\" seleccionará la palabra debajo del cursor y mostrará el menú contextual.", "terminal.integrated.cwd": "Una ruta de acceso de inicio explícita en la que se iniciará el terminal; se utiliza como el directorio de trabajo actual (cwd) para el proceso de shell. Puede resultar especialmente útil en una configuración de área de trabajo si la raíz de directorio no es un cwd práctico.", "terminal.integrated.confirmOnExit": "Indica si debe confirmarse a la salida si hay sesiones de terminal activas.", "terminal.integrated.enableBell": "Si la campana terminal está activada o no.", diff --git a/i18n/esn/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json b/i18n/esn/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json index 9861595bf7..21fcf5a4e9 100644 --- a/i18n/esn/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json @@ -57,5 +57,7 @@ "workbench.action.terminal.scrollToPreviousCommand": "Desplácese al comando anterior", "workbench.action.terminal.scrollToNextCommand": "Desplácese al siguiente comando", "workbench.action.terminal.selectToPreviousCommand": "Seleccionar hasta el comando anterior", - "workbench.action.terminal.selectToNextCommand": "Seleccionar hasta el comando siguiente" + "workbench.action.terminal.selectToNextCommand": "Seleccionar hasta el comando siguiente", + "workbench.action.terminal.selectToPreviousLine": "Seleccione la línea anterior", + "workbench.action.terminal.selectToNextLine": "Seleccione la línea siguiente" } \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.i18n.json b/i18n/esn/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.i18n.json index e6b32d074f..acac8a721f 100644 --- a/i18n/esn/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.i18n.json @@ -9,6 +9,11 @@ "terminal.integrated.a11yBlankLine": "Línea en blanco", "terminal.integrated.a11yPromptLabel": "Entrada de terminal", "terminal.integrated.a11yTooMuchOutput": "Demasiada salida para anunciarla. Vaya a las filas manualmente para leerlas.", + "yes": "Sí", + "terminal.rendererInAllNewTerminals": "Todos los terminales recién creados usarán el renderizador que no es GPU.", + "no": "No", + "dontShowAgain": "No volver a mostrar", + "terminal.slowRendering": "El representador estándar para el terminal integrado parece ser lento en su ordenador. ¿Le gustaría cambiar al representador alternativo basado en DOM el cual podría mejorar el rendimiento? [Obtenga más información sobre la configuración del terminal] (https://code.visualstudio.com/docs/editor/integrated-terminal#_changing-how-the-terminal-is-rendered).", "terminal.integrated.copySelection.noSelection": "El terminal no tiene ninguna selección para copiar", "terminal.integrated.exitedWithCode": "El proceso del terminal finalizó con el código de salida: {0}", "terminal.integrated.waitOnExit": "Presione cualquier tecla para cerrar el terminar", diff --git a/i18n/esn/src/vs/workbench/parts/terminal/electron-browser/terminalPanel.i18n.json b/i18n/esn/src/vs/workbench/parts/terminal/electron-browser/terminalPanel.i18n.json index 8e64147ee8..edeceac0ab 100644 --- a/i18n/esn/src/vs/workbench/parts/terminal/electron-browser/terminalPanel.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/terminal/electron-browser/terminalPanel.i18n.json @@ -6,6 +6,8 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "terminal.useMonospace": "Use \"monospace\"", + "terminal.monospaceOnly": "El terminal solo admite fuentes monoespaciadas.", "copy": "Copiar", "split": "Dividir", "paste": "Pegar", diff --git a/i18n/esn/src/vs/workbench/parts/trust/electron-browser/unsupportedWorkspaceSettings.contribution.i18n.json b/i18n/esn/src/vs/workbench/parts/trust/electron-browser/unsupportedWorkspaceSettings.contribution.i18n.json index 901823a3a1..d2f93e17ec 100644 --- a/i18n/esn/src/vs/workbench/parts/trust/electron-browser/unsupportedWorkspaceSettings.contribution.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/trust/electron-browser/unsupportedWorkspaceSettings.contribution.i18n.json @@ -6,7 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "unsupportedWorkspaceSettings": "Esta área de trabajo contiene valores de configuración que solo se pueden establecer en Configuración de usuario ({0}). Haga clic [aquí]({1}) para obtener más información.", "openWorkspaceSettings": "Abrir configuración del área de trabajo", "dontShowAgain": "No volver a mostrar", "unsupportedWorkspaceSettings": "Esta área de trabajo contiene valores de configuración que solo se pueden establecer en Configuración de usuario ({0}). Haga clic [aquí]({1}) para obtener más información." diff --git a/i18n/esn/src/vs/workbench/parts/update/electron-browser/update.i18n.json b/i18n/esn/src/vs/workbench/parts/update/electron-browser/update.i18n.json index 2c980e5c8f..2d994e3632 100644 --- a/i18n/esn/src/vs/workbench/parts/update/electron-browser/update.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/update/electron-browser/update.i18n.json @@ -20,7 +20,7 @@ "later": "Más tarde", "updateAvailable": "Hay una actualización disponible: {0} {1}", "installUpdate": "Instalar la actualización ", - "updateInstalling": "{0} {1} se está instalando en segundo plano, le avisaremos cuando sea completada", + "updateInstalling": "{0} {1} se está instalando en segundo plano; le avisaremos cuando esté hecho.", "updateAvailableAfterRestart": "Reiniciar {0} para aplicar la última actualización.", "updateNow": "Actualizar ahora", "commandPalette": "Paleta de comandos...", diff --git a/i18n/esn/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json b/i18n/esn/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json index ab3c611d30..6b8a32ca0b 100644 --- a/i18n/esn/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json @@ -2,7 +2,7 @@ "": [ "--------------------------------------------------------------------------------------------", "Copyright (c) Microsoft Corporation. All rights reserved.", - "Licensed under the Source EULA. See License.txt in the project root for license information.", + "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], @@ -27,7 +27,7 @@ "welcomePage.installExtensionPacks": "Herramientas y lenguajes", "welcomePage.installExtensionPacksDescription": "Instalar soporte para {0} y {1}", "welcomePage.moreExtensions": "más", - "welcomePage.installKeymapDescription": "Configuraciones y combinaciones de teclas", + "welcomePage.installKeymapDescription": "Configuración y enlaces de teclado", "welcomePage.installKeymapExtension": "Instalar la configuración y los métodos abreviados de teclado de {0} y {1}", "welcomePage.others": "otros", "welcomePage.colorTheme": "Tema de color", diff --git a/i18n/esn/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThrough.contribution.i18n.json b/i18n/esn/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThrough.contribution.i18n.json index e5c26eaa79..7c156165e3 100644 --- a/i18n/esn/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThrough.contribution.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThrough.contribution.i18n.json @@ -7,6 +7,5 @@ "Do not edit this file. It is machine generated." ], "walkThrough.editor.label": "Área de juegos interactiva", - "help": "Ayuda", - "interactivePlayground": "Área de juegos interactiva" + "help": "Ayuda" } \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/services/bulkEdit/electron-browser/bulkEditService.i18n.json b/i18n/esn/src/vs/workbench/services/bulkEdit/electron-browser/bulkEditService.i18n.json new file mode 100644 index 0000000000..2aba6b0075 --- /dev/null +++ b/i18n/esn/src/vs/workbench/services/bulkEdit/electron-browser/bulkEditService.i18n.json @@ -0,0 +1,13 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "summary.0": "No se realizaron ediciones", + "summary.nm": "{0} ediciones de texto en {1} archivos", + "summary.n0": "{0} ediciones de texto en un archivo", + "conflict": "Estos archivos han cambiado durante el proceso: {0}" +} \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/services/configuration/common/configurationExtensionPoint.i18n.json b/i18n/esn/src/vs/workbench/services/configuration/common/configurationExtensionPoint.i18n.json index 7d6fc3a256..a7a0c7035c 100644 --- a/i18n/esn/src/vs/workbench/services/configuration/common/configurationExtensionPoint.i18n.json +++ b/i18n/esn/src/vs/workbench/services/configuration/common/configurationExtensionPoint.i18n.json @@ -2,13 +2,13 @@ "": [ "--------------------------------------------------------------------------------------------", "Copyright (c) Microsoft Corporation. All rights reserved.", - "Licensed under the Source EULA. See License.txt in the project root for license information.", + "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], "vscode.extension.contributes.configuration.title": "Resumen de la configuración. Esta etiqueta se usará en el archivo de configuración como comentario divisor.", "vscode.extension.contributes.configuration.properties": "Descripción de las propiedades de configuración.", - "scope.application.description": "Configuración específica de aplicación, que puede ser configurado en configuración de usuario.", + "scope.application.description": "Configuración específica de la aplicación, que se establece en la Configuración de usuario.", "scope.window.description": "Configuración específica para ventanas, que se puede definir en la configuración de usuario o de área de trabajo.", "scope.resource.description": "Configuración específica para recursos, que se puede definir en la configuración de usuario, de área de trabajo o de carpeta.", "scope.description": "Ámbito donde es aplicable la configuración. Los ámbitos disponibles son \"window\" y \"resource\".", @@ -16,6 +16,7 @@ "vscode.extension.contributes.configuration": "Aporta opciones de configuración.", "invalid.title": "configuration.title debe ser una cadena", "invalid.properties": "configuration.properties debe ser un objeto", + "invalid.property": "\"configuration.property\" debe ser un objeto", "invalid.allOf": "'configuration.allOf' está en desuso y ya no debe ser utilizado. En cambio, pase varias secciones de configuración como un arreglo al punto de contribución 'configuration'.", "workspaceConfig.folders.description": "Lista de carpetas para cargar en el área de trabajo. ", "workspaceConfig.path.description": "Ruta de acceso de archivo; por ejemplo, \"/raíz/carpetaA\" o \"./carpetaA\" para una ruta de acceso de archivo que se resolverá respecto a la ubicación del archivo del área de trabajo.", diff --git a/i18n/esn/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json b/i18n/esn/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json index 5cfc0aa87d..c8f5772b3d 100644 --- a/i18n/esn/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json +++ b/i18n/esn/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json @@ -11,7 +11,7 @@ "open": "Abrir configuración", "saveAndRetry": "Guardar y reintentar", "errorUnknownKey": "No se puede escribir en {0} porque {1} no es una configuración registrada.", - "errorInvalidWorkspaceConfigurationApplication": "No se puede escribir {0} en configuración de área de trabajo. Esta opción puede escribirse solamente en configuración de usuario.", + "errorInvalidWorkspaceConfigurationApplication": "No se puede escribir {0} en Configuración de área de trabajo; solo se puede escribir en Configuración de usuario.", "errorInvalidFolderConfiguration": "No se puede escribir en Configuración de carpeta porque {0} no admite el ámbito del recurso de carpeta.", "errorInvalidUserTarget": "No se puede escribir en Configuración de usuario porque {0} no admite el ámbito global.", "errorInvalidWorkspaceTarget": "No se puede escribir a la configuración del espacio de trabajo porque {0} no soporta a un espacio de trabajo con multi carpetas.", diff --git a/i18n/esn/src/vs/workbench/services/configuration/node/configurationService.i18n.json b/i18n/esn/src/vs/workbench/services/configuration/node/configurationService.i18n.json index 53a465b71f..ffff1d2f78 100644 --- a/i18n/esn/src/vs/workbench/services/configuration/node/configurationService.i18n.json +++ b/i18n/esn/src/vs/workbench/services/configuration/node/configurationService.i18n.json @@ -6,6 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "unsupportedApplicationSetting": "Esta configuración puede aplicarse sólo en configuración de usuario", - "unsupportedWindowSetting": "Esta configuración no se puede aplicar ahora. Se aplicará al abrir esta carpeta directamente." + "unsupportedApplicationSetting": "Este valor solo puede aplicarse en Configuración de usuario", + "unsupportedWindowSetting": "Este valor no se puede aplicar ahora. Se aplicará cuando abra esta carpeta directamente." } \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/services/configurationResolver/electron-browser/configurationResolverService.i18n.json b/i18n/esn/src/vs/workbench/services/configurationResolver/electron-browser/configurationResolverService.i18n.json index 0a5131780c..8e6bbb15cc 100644 --- a/i18n/esn/src/vs/workbench/services/configurationResolver/electron-browser/configurationResolverService.i18n.json +++ b/i18n/esn/src/vs/workbench/services/configurationResolver/electron-browser/configurationResolverService.i18n.json @@ -6,6 +6,5 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "canNotResolveWorkspaceFolder": "'${workspaceFolder}' no puede ser resuelto. Por favor, abra una carpeta.", - "canNotResolveFolderBasename": "'${workspaceFolderBasename}' no puede ser resuelto. Por favor, abra una carpeta." + "stringsOnlySupported": "El comando {0} no devolvió un resultado de cadena. Sólo se admiten cadenas como resultados para los comandos utilizados para la sustitución de variables." } \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/services/configurationResolver/node/variableResolver.i18n.json b/i18n/esn/src/vs/workbench/services/configurationResolver/node/variableResolver.i18n.json index 36f359788c..e96af7d884 100644 --- a/i18n/esn/src/vs/workbench/services/configurationResolver/node/variableResolver.i18n.json +++ b/i18n/esn/src/vs/workbench/services/configurationResolver/node/variableResolver.i18n.json @@ -8,12 +8,12 @@ ], "missingEnvVarName": "'{0}' no puede resolverse porque no se asignó nombre de variable de entorno. ", "configNotFound": "'{0}' puede no resolverse porque la configuración '{1}' no fué encontrada. ", - "configNoString": "'{0}' puede no resolverse porque '{1}' es un valor estructurado.", + "configNoString": "\"{0}\" no se puede resolver porque \"{1}\" es un valor estructurado.", "missingConfigName": "'{0}' no puede resolverse porque no tiene asignado un nombre de configuración . ", "noValueForCommand": "{0} ' no se puede resolver porque el comando no tiene ningún valor.", "canNotFindFolder": "' {0} ' no se puede resolver. No existe la carpeta ' {1} '.", "canNotResolveWorkspaceFolderMultiRoot": "'{0}' no puede ser resuelto en un espacio de trabajo multicarpeta. Defina el alcance de esta variable utilizando ':' y un nombre de carpeta del espacio de trabajo. ", - "canNotResolveWorkspaceFolder": "'{0}' no puede ser resuelto. Por favor, abra una carpeta.", + "canNotResolveWorkspaceFolder": "\"{0}\" no se puede resolver. Abra una carpeta.", "canNotResolveFile": "'{0}' no puede resolver. Por favor, abra un editor.", "canNotResolveLineNumber": "' {0} ' no se puede resolver. Asegúrese de tener una línea seleccionada en el editor activo.", "canNotResolveSelectedText": "' {0} ' no se puede resolver. Asegúrese de tener un texto seleccionado en el editor activo." diff --git a/i18n/esn/src/vs/workbench/services/extensions/electron-browser/extensionService.i18n.json b/i18n/esn/src/vs/workbench/services/extensions/electron-browser/extensionService.i18n.json index eadbe2502f..9d0e3fd01a 100644 --- a/i18n/esn/src/vs/workbench/services/extensions/electron-browser/extensionService.i18n.json +++ b/i18n/esn/src/vs/workbench/services/extensions/electron-browser/extensionService.i18n.json @@ -9,7 +9,7 @@ "extensionsDisabled": "Todas las extensiones están deshabilitadas.", "extensionHostProcess.crash": "El host de extensiones finalizó inesperadamente.", "extensionHostProcess.unresponsiveCrash": "Se terminó el host de extensiones porque no respondía.", - "devTools": "Herramientas de desarrollo abiertas", + "devTools": "Abrir herramientas de desarrollo", "restart": "Reiniciar el host de extensiones", "overwritingExtension": "Sobrescribiendo la extensión {0} con {1}.", "extensionUnderDevelopment": "Cargando la extensión de desarrollo en {0}", diff --git a/i18n/esn/src/vs/workbench/services/files/electron-browser/remoteFileService.i18n.json b/i18n/esn/src/vs/workbench/services/files/electron-browser/remoteFileService.i18n.json index e20141624d..b316f218a0 100644 --- a/i18n/esn/src/vs/workbench/services/files/electron-browser/remoteFileService.i18n.json +++ b/i18n/esn/src/vs/workbench/services/files/electron-browser/remoteFileService.i18n.json @@ -6,6 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "invalidPath": "La ruta de acceso del recurso \"{0}\" debe ser absoluta.", "fileNotFoundError": "Archivo no encontrado ({0})", "fileIsDirectoryError": "El archivo es un directorio", "fileNotModifiedError": "Archivo no modificado desde", diff --git a/i18n/fra/extensions/configuration-editing/out/extension.i18n.json b/i18n/fra/extensions/configuration-editing/out/extension.i18n.json index af59aeb0f1..a33483f2fd 100644 --- a/i18n/fra/extensions/configuration-editing/out/extension.i18n.json +++ b/i18n/fra/extensions/configuration-editing/out/extension.i18n.json @@ -6,5 +6,16 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "workspaceFolder": "Chemin du dossier ouvert dans VS Code", + "workspaceFolderBasename": "Nom du dossier ouvert dans VS Code, sans barres obliques (/)", + "relativeFile": "Fichier ouvert actif relatif à ${workspaceFolder}", + "file": "Fichier ouvert actif", + "cwd": "Répertoire de travail actif de l'exécuteur de tâches au démarrage", + "lineNumber": "Numéro de la ligne sélectionnée dans le fichier actif", + "selectedText": "Texte sélectionné dans le fichier actif", + "fileDirname": "Nom de répertoire du fichier ouvert actif", + "fileExtname": "Extension du fichier ouvert actif", + "fileBasename": "Nom de base du fichier ouvert actif", + "fileBasenameNoExtension": "Nom de base du fichier ouvert actif, sans extension de fichier", "exampleExtension": "Exemple" } \ No newline at end of file diff --git a/i18n/fra/extensions/git/out/commands.i18n.json b/i18n/fra/extensions/git/out/commands.i18n.json index 6a7204c50a..95b33e9cb3 100644 --- a/i18n/fra/extensions/git/out/commands.i18n.json +++ b/i18n/fra/extensions/git/out/commands.i18n.json @@ -2,7 +2,7 @@ "": [ "--------------------------------------------------------------------------------------------", "Copyright (c) Microsoft Corporation. All rights reserved.", - "Licensed under the Source EULA. See License.txt in the project root for license information.", + "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], @@ -10,10 +10,12 @@ "remote branch at": "Branche distante à {0}", "create branch": "$(plus) Créer nouvelle branche", "repourl": "URL du dépôt", - "parent": "Répertoire parent", + "selectFolder": "Sélectionner l'emplacement du dépôt", "cloning": "Clonage du dépôt Git '{0}'...", - "openrepo": "Ouvrir le dépôt", "proposeopen": "Voulez-vous ouvrir le dépôt cloné ?", + "openrepo": "Ouvrir le dépôt", + "add": "Ajouter à l’espace de travail", + "proposeopen2": "Voulez-vous ouvrir le dépôt cloné ou l'ajouter à l'espace de travail actuel ?", "init": "Choisir le dossier d’espace de travail dans lequel initialiser le dépôt git", "init repo": "Initialiser le dépôt", "create repo": "Initialiser le dépôt", diff --git a/i18n/fra/extensions/npm/out/npmView.i18n.json b/i18n/fra/extensions/npm/out/npmView.i18n.json index 164e1b51e3..e6a36b84cb 100644 --- a/i18n/fra/extensions/npm/out/npmView.i18n.json +++ b/i18n/fra/extensions/npm/out/npmView.i18n.json @@ -6,6 +6,9 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "npm.noDebugOptions": "Impossible de lancer \"{0}\" pour le débogage, car les scripts n'ont pas d'option de débogage de nœud, par exemple, \"--inspect-brk\".", - "npm.scriptInvalid": "Script \"{0}\" introuvable. Essayez d'actualiser la vue." + "noScripts": "Aucun script", + "noDebugOptions": "Impossible de lancer \"{0}\" pour le débogage, car les scripts n'ont pas d'option de débogage de nœud, par exemple, \"--inspect-brk\".", + "learnMore": "En savoir plus", + "ok": "OK", + "scriptInvalid": "Script \"{0}\" introuvable. Essayez d'actualiser la vue." } \ No newline at end of file diff --git a/i18n/fra/extensions/npm/package.i18n.json b/i18n/fra/extensions/npm/package.i18n.json index b85f2981ff..dab74867a9 100644 --- a/i18n/fra/extensions/npm/package.i18n.json +++ b/i18n/fra/extensions/npm/package.i18n.json @@ -12,15 +12,15 @@ "config.npm.runSilent": "Exécutez les commandes npm avec l'option `--silent`.", "config.npm.packageManager": "Le gestionnaire de paquets utilisé pour exécuter des scripts.", "config.npm.exclude": "Configurer les profils glob pour les dossiers qui doivent être exclus de la détection de script automatique.", - "config.npm.enableScriptExplorer": "Activez une vue Explorateur pour les scripts npm quand l'espace de travail contient un fichier 'package.json'.", + "config.npm.enableScriptExplorer": "Activez une vue Explorateur pour les scripts npm.", + "config.npm.scriptExplorerAction": "Action de clic par défaut utilisée dans l’explorateur de scripts : 'open' ou 'run', la valeur par défaut est 'open'.", "npm.parseError": "Détection de tâche Npm : impossible d’analyser le fichier {0}", "taskdef.script": "Le script npm à personnaliser.", - "taskdef.path": "Le chemin d’accès au dossier du fichier package.json qui fournit le script. Peut être oublié.", + "taskdef.path": "Chemin de dossier du fichier package.json qui fournit le script. Peut être ignoré.", "view.name": "Scripts npm", "command.refresh": "Actualiser", "command.run": "Exécuter", "command.debug": "Déboguer", "command.openScript": "Ouvrir", - "npm.scriptInvalid": "Script '{0}' introuvable. Essayez d'actualiser la vue.", - "npm.noDebugOptions": "Impossible de lancer '{0}' pour le débogage, car les scripts n'ont pas d'option de débogage de nœud, par exemple, '--inspect-brk'." + "command.runInstall": "Exécuter Install" } \ No newline at end of file diff --git a/i18n/fra/extensions/php/package.i18n.json b/i18n/fra/extensions/php/package.i18n.json index 2b1f86c123..7432910059 100644 --- a/i18n/fra/extensions/php/package.i18n.json +++ b/i18n/fra/extensions/php/package.i18n.json @@ -6,6 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "displayName": "Bases du langage PHP", + "displayName": "Concepts de base du langage PHP", "description": "Fournit la coloration syntaxique et la correspondance des parenthèses dans les fichiers PHP." } \ No newline at end of file diff --git a/i18n/fra/extensions/search-rg/package.i18n.json b/i18n/fra/extensions/search-rg/package.i18n.json new file mode 100644 index 0000000000..6548209ebc --- /dev/null +++ b/i18n/fra/extensions/search-rg/package.i18n.json @@ -0,0 +1,11 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "displayName": "Recherche (ripgrep)", + "description": "Effectue une recherche à l'aide de Ripgrep." +} \ No newline at end of file diff --git a/i18n/fra/extensions/typescript-language-features/out/features/updatePathsOnRename.i18n.json b/i18n/fra/extensions/typescript-language-features/out/features/updatePathsOnRename.i18n.json new file mode 100644 index 0000000000..0ddac6f526 --- /dev/null +++ b/i18n/fra/extensions/typescript-language-features/out/features/updatePathsOnRename.i18n.json @@ -0,0 +1,14 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "prompt": "Mettre à jour automatiquement les importations pour le fichier déplacé : '{0}' ?", + "reject.title": "Non", + "accept.title": "Oui", + "always.title": "Oui, toujours mettre à jour les importations", + "never.title": "Non, ne jamais mettre à jour les importations" +} \ No newline at end of file diff --git a/i18n/fra/extensions/typescript-language-features/package.i18n.json b/i18n/fra/extensions/typescript-language-features/package.i18n.json index a84454b66c..12cad4e4a2 100644 --- a/i18n/fra/extensions/typescript-language-features/package.i18n.json +++ b/i18n/fra/extensions/typescript-language-features/package.i18n.json @@ -8,8 +8,7 @@ ], "displayName": "Fonctionnalités de langage TypeScript et JavaScript", "description": "Fournit une prise en charge riche de langage pour JavaScript et TypeScript.", - "typescript.reloadProjects.title": "Recharger le projet", - "javascript.reloadProjects.title": "Recharger le projet", + "reloadProjects.title": "Recharger le projet", "configuration.typescript": "TypeScript", "typescript.useCodeSnippetsOnMethodSuggest.dec": "Fonctions complètes avec leur signature de paramètre.", "typescript.tsdk.desc": "Spécifie le chemin de dossier contenant les fichiers tsserver et lib*.d.ts à utiliser.", @@ -37,8 +36,7 @@ "format.placeOpenBraceOnNewLineForFunctions": "Définit si une accolade ouvrante dans une fonction est placée ou non sur une nouvelle ligne.", "format.placeOpenBraceOnNewLineForControlBlocks": "Définit si une accolade ouvrante dans un bloc de contrôle est placée ou non sur une nouvelle ligne.", "javascript.validate.enable": "Activez/désactivez la validation JavaScript.", - "typescript.goToProjectConfig.title": "Accéder à la configuration du projet", - "javascript.goToProjectConfig.title": "Accéder à la configuration du projet", + "goToProjectConfig.title": "Accéder à la configuration du projet", "javascript.referencesCodeLens.enabled": "Activez/désactivez les références CodeLens dans les fichiers JavaScript.", "typescript.referencesCodeLens.enabled": "Activez/désactivez les références CodeLens dans les fichiers TypeScript. Nécessite TypeScript >= 2.0.6.", "typescript.implementationsCodeLens.enabled": "Activer/désactiver CodeLens dans les implémentations. Nécessite TypeScript >= 2.2.0.", @@ -47,7 +45,7 @@ "typescript.selectTypeScriptVersion.title": "Sélectionner la version de TypeScript", "typescript.reportStyleChecksAsWarnings": "Rapporter les vérifications de style comme des avertissements", "jsDocCompletion.enabled": "Activer/désactiver les commentaires JSDoc automatiques", - "javascript.implicitProjectConfig.checkJs": "Activer/désactiver la vérification sémantique des fichiers JavaScript. Les fichiers jsconfig.json ou tsconfig.json existants remplacent ce paramètre. Nécessite TypeScript >=2.3.1.", + "javascript.implicitProjectConfig.checkJs": "Activez/désactivez la vérification sémantique des fichiers JavaScript. Les fichiers jsconfig.json ou tsconfig.json existants remplacent ce paramètre. Nécessite TypeScript >= 2.3.1.", "typescript.npm": "Spécifie le chemin de l'exécutable NPM utilisé pour l'acquisition de type automatique. Nécessite TypeScript >= 2.3.4.", "typescript.check.npmIsInstalled": "Vérifie si NPM est installé pour l'acquisition de type automatique.", "javascript.nameSuggestions": "Activez/désactivez l'inclusion de noms uniques à partir du fichier dans les listes de suggestions JavaScript.", @@ -55,11 +53,15 @@ "typescript.problemMatchers.tsc.label": "Problèmes liés à TypeScript", "typescript.problemMatchers.tscWatch.label": "Problèmes liés à TypeScript (mode espion)", "typescript.quickSuggestionsForPaths": "Activer/désactiver les suggestions rapides lorsque vous saisissez un chemin d’import.", - "typescript.locale": "Définit les paramètres locaux utilisés pour signaler les erreurs TypeScript . Nécessite TypeScript >= 2.6.0. Par défaut 'null' utilise les paramètres locaux de VS Code pour les erreurs TypeScript.", - "javascript.implicitProjectConfig.experimentalDecorators": "Activer/désactiver 'experimentalDecorators' pour les fichiers JavaScript qui ne font pas partie d'un projet. Les fichiers jsconfig.json ou tsconfig.json existants remplacent ce paramètre. Nécessite TypeScript >=2.3.1.", - "typescript.autoImportSuggestions.enabled": "Activer/désactiver les suggestions d'import automatiques. Nécessite TypeScript >= 2.6.1.", + "typescript.locale": "Définit les paramètres régionaux utilisés pour signaler les erreurs JavaScript et TypeScript. Nécessite TypeScript >= 2.6.0. La valeur par défaut 'null' utilise les paramètres régionaux de VS Code.", + "javascript.implicitProjectConfig.experimentalDecorators": "Activez/désactivez 'experimentalDecorators' pour les fichiers JavaScript qui n'appartiennent pas à un projet. Les fichiers jsconfig.json ou tsconfig.json existants remplacent ce paramètre. Nécessite TypeScript >= 2.3.1.", + "typescript.autoImportSuggestions.enabled": "Activez/désactivez les suggestions d'importation automatique. Nécessite TypeScript >= 2.6.1", "typescript.experimental.syntaxFolding": "Active/désactive les marqueurs de réduction en fonction de la syntaxe.", "taskDefinition.tsconfig.description": "Fichier tsconfig qui définit la build TS.", "javascript.suggestionActions.enabled": "Activer/désactiver le diagnostic de suggestion des fichiers JavaScript dans l’éditeur. Nécessite TypeScript > = 2.8", - "typescript.suggestionActions.enabled": "Activer/désactiver les diagnostics de suggestion pour les fichiers TypeScript dans l’éditeur de texte. Nécessite TypeScript > = 2.8." + "typescript.suggestionActions.enabled": "Activez/désactivez le diagnostic des suggestions pour les fichiers TypeScript dans l'éditeur. Nécessite TypeScript >= 2.8", + "typescript.preferences.quoteStyle": "Style de guillemet par défaut à utiliser pour les corrections rapides : 'single' pour les guillemets simples, 'double' pour les guillemets doubles ou 'auto' pour déduire le type de guillemet à partir des importations existantes. Nécessite TypeScript >= 2.9", + "typescript.preferences.importModuleSpecifier": "Style de chemin par défaut pour les importations automatiques :\n- \"relative\" pour un chemin relatif à l'emplacement du fichier.\n- \"non-relative\" pour un chemin non relatif basé sur la valeur de 'baseUrl' configurée dans votre fichier 'jsconfig.json' / 'tsconfig.json'.\n- \"auto\" pour déduire automatiquement le type de chemin le plus court.\nNécessite TypeScript >= 2.9", + "typescript.showUnused": "Activez/désactivez la mise en surbrillance des variables inutilisées dans le code. Nécessite TypeScript >= 2.9", + "typescript.updateImportsOnFileMove.enabled": "Activez/désactivez la mise à jour automatique des chemins d'importation quand vous renommez ou déplacez un fichier dans VS Code. Les valeurs possibles sont : 'prompt' pour demander confirmation à chaque renommage, 'always' pour toujours mettre à jour les chemins automatiquement et 'never' pour ne jamais renommer les chemins et ne pas demander confirmation. Nécessite TypeScript >= 2.9" } \ No newline at end of file diff --git a/i18n/fra/src/vs/base/node/zip.i18n.json b/i18n/fra/src/vs/base/node/zip.i18n.json index 4aa157cd51..937300dada 100644 --- a/i18n/fra/src/vs/base/node/zip.i18n.json +++ b/i18n/fra/src/vs/base/node/zip.i18n.json @@ -6,6 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "incompleteExtract": "Incomplète. {0} sur {1} entrées extraites", + "incompleteExtract": "Incomplet. Entrées trouvées : {0} sur {1} ", "notFound": "{0} introuvable dans le zip." } \ No newline at end of file diff --git a/i18n/fra/src/vs/code/electron-browser/issue/issueReporterMain.i18n.json b/i18n/fra/src/vs/code/electron-browser/issue/issueReporterMain.i18n.json index 4c54af6f18..8f64e16a73 100644 --- a/i18n/fra/src/vs/code/electron-browser/issue/issueReporterMain.i18n.json +++ b/i18n/fra/src/vs/code/electron-browser/issue/issueReporterMain.i18n.json @@ -6,6 +6,8 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "hide": "masquer", + "show": "afficher", "previewOnGitHub": "Prévisualiser sur GitHub", "loadingData": "Chargement des données en cours...", "rateLimited": "Limite de requête GitHub dépassée. Veuillez patienter.", diff --git a/i18n/fra/src/vs/code/electron-browser/issue/issueReporterPage.i18n.json b/i18n/fra/src/vs/code/electron-browser/issue/issueReporterPage.i18n.json index f18659a614..ffcda9c228 100644 --- a/i18n/fra/src/vs/code/electron-browser/issue/issueReporterPage.i18n.json +++ b/i18n/fra/src/vs/code/electron-browser/issue/issueReporterPage.i18n.json @@ -17,13 +17,12 @@ "issueTitleLabel": "Titre", "issueTitleRequired": "Veuillez s’il vous plaît entrer un titre.", "titleLengthValidation": "Le titre est trop long.", - "systemInfo": "Mes infos système", - "sendData": "Envoyer mes données", - "processes": "Processus en cours d’exécution", - "workspaceStats": "Mes Stats de l’espace de travail", - "extensions": "Mes Extensions", - "searchedExtensions": "Extensions recherchées", - "settingsSearchDetails": "Détails de paramètres de recherche", "details": "Veuillez saisir les détails ", - "loadingData": "Chargement des données..." + "sendSystemInfo": "Inclure des informations sur mon système ({0})", + "show": "afficher", + "sendProcessInfo": "Inclure mes processus en cours d’exécution ({0})", + "sendWorkspaceInfo": "Inclure des metadonnées sur mon espace de travail ({0})", + "sendExtensions": "Inclure mes extensions activées ({0})", + "sendSearchedExtensions": "Envoyer les extensions recherchées ({0})", + "sendSettingsSearchDetails": " Envoyer les paramètres des critères de recherche ({0}) " } \ No newline at end of file diff --git a/i18n/fra/src/vs/code/electron-browser/processExplorer/processExplorerMain.i18n.json b/i18n/fra/src/vs/code/electron-browser/processExplorer/processExplorerMain.i18n.json index 9eedc8116f..627050125b 100644 --- a/i18n/fra/src/vs/code/electron-browser/processExplorer/processExplorerMain.i18n.json +++ b/i18n/fra/src/vs/code/electron-browser/processExplorer/processExplorerMain.i18n.json @@ -11,5 +11,7 @@ "pid": "pid", "name": "Nom", "killProcess": "Tuer le processus", - "forceKillProcess": "Forcer la suppression du processus" + "forceKillProcess": "Forcer la suppression du processus", + "copy": "Copier", + "copyAll": "Copier tout" } \ No newline at end of file diff --git a/i18n/fra/src/vs/code/electron-main/menus.i18n.json b/i18n/fra/src/vs/code/electron-main/menus.i18n.json index bb8cc03e54..a932a33681 100644 --- a/i18n/fra/src/vs/code/electron-main/menus.i18n.json +++ b/i18n/fra/src/vs/code/electron-main/menus.i18n.json @@ -88,7 +88,6 @@ "miToggleDebugConsole": "Console de dé&&bogage", "miToggleIntegratedTerminal": "&&Terminal intégré", "miMarker": "&&Problèmes", - "miAdditionalViews": "Affic&&hages supplémentaires", "miCommandPalette": "Palette de &&commandes...", "miOpenView": "&&Ouvrir la vue...", "miToggleFullScreen": "Plei&&n écran", @@ -144,7 +143,7 @@ "miContinue": "&&Continuer", "miToggleBreakpoint": "Activer/désactiver le poi&&nt d'arrêt", "miConditionalBreakpoint": "Point d'arrêt &&conditionnel...", - "miColumnBreakpoint": "P&&oint d'arrêt de la colonne", + "miInlineBreakpoint": "P&&oint d'arrêt Inline", "miFunctionBreakpoint": "Point d'arrêt sur &&fonction...", "miLogPoint": "&&Point de journalisation...", "miNewBreakpoint": "&&Nouveau point d'arrêt", diff --git a/i18n/fra/src/vs/editor/browser/widget/codeEditorWidget.i18n.json b/i18n/fra/src/vs/editor/browser/widget/codeEditorWidget.i18n.json new file mode 100644 index 0000000000..973f68f522 --- /dev/null +++ b/i18n/fra/src/vs/editor/browser/widget/codeEditorWidget.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "cursors.maximum": "Le nombre de curseurs a été limité à {0}." +} \ No newline at end of file diff --git a/i18n/fra/src/vs/editor/common/config/commonEditorConfig.i18n.json b/i18n/fra/src/vs/editor/common/config/commonEditorConfig.i18n.json index 0d6073bf2c..42b7e6edfd 100644 --- a/i18n/fra/src/vs/editor/common/config/commonEditorConfig.i18n.json +++ b/i18n/fra/src/vs/editor/common/config/commonEditorConfig.i18n.json @@ -26,6 +26,7 @@ "detectIndentation": "Quand vous ouvrez un fichier, 'editor.tabSize' et 'editor.insertSpaces' sont détectés en fonction du contenu du fichier.", "roundedSelection": "Contrôle si les sélections ont des angles arrondis", "scrollBeyondLastLine": "Contrôle si l'éditeur défile au-delà de la dernière ligne", + "scrollBeyondLastColumn": "Contrôle le nombre de caractères supplémentaires, au-delà duquel l’éditeur défilera horizontalement", "smoothScrolling": "Contrôle si l'éditeur défilera en utilisant une animation", "minimap.enabled": "Contrôle si la minicarte est affichée", "minimap.side": "Contrôle le côté où afficher la minicarte.", @@ -41,7 +42,7 @@ "wordWrap.bounded": "Retour automatique à la ligne au minimum en fonction de la fenêtre d'affichage et de 'editor.wordWrapColumn'.", "wordWrap": "Contrôle le retour automatique à la ligne. Valeurs possibles :\n - 'off' (désactive le retour automatique à la ligne) ;\n - 'on' (retour automatique à la ligne dans la fenêtre d'affichage) ;\n - 'wordWrapColumn' (retour automatique à la ligne en fonction de 'editor.wordWrapColumn') ou ;\n - 'bounded' (retour automatique à la ligne au minimum en fonction de la fenêtre d'affichage et de 'editor.wordWrapColumn').", "wordWrapColumn": "Contrôle la colonne de retour automatique à la ligne de l'éditeur quand 'editor.wordWrap' a la valeur 'wordWrapColumn' ou 'bounded'.", - "wrappingIndent": "Contrôle le retrait des lignes renvoyées. La valeur peut être 'none', 'same' ou 'indent'.", + "wrappingIndent": "Contrôle la mise en retrait des lignes enveloppées. Il peut s’agir de 'none', 'same', 'indent' ou 'deepIndent'.", "mouseWheelScrollSensitivity": "Multiplicateur à utiliser pour le 'deltaX' et le 'deltaY' des événements de défilement de la roulette de la souris", "multiCursorModifier.ctrlCmd": "Mappe vers 'Contrôle' dans Windows et Linux, et vers 'Commande' dans macOS.", "multiCursorModifier.alt": "Mappe vers 'Alt' dans Windows et Linux, et vers 'Option' dans macOS.", diff --git a/i18n/fra/src/vs/editor/common/view/editorColorRegistry.i18n.json b/i18n/fra/src/vs/editor/common/view/editorColorRegistry.i18n.json index 0803b85863..2cc54b3969 100644 --- a/i18n/fra/src/vs/editor/common/view/editorColorRegistry.i18n.json +++ b/i18n/fra/src/vs/editor/common/view/editorColorRegistry.i18n.json @@ -32,6 +32,7 @@ "infoBorder": "Couleur de bordure de la ligne ondulée marquant les informations dans l'éditeur.", "hintForeground": "Couleur de premier plan de la ligne ondulée d'indication dans l'éditeur.", "hintBorder": "Couleur de bordure de la ligne ondulée d'indication dans l'éditeur.", + "unnecessaryForeground": "Couleur de premier plan du code inutile dans l'éditeur.", "overviewRulerRangeHighlight": "Couleur du marqueur de la règle d'aperçu pour des plages mises en surbrillance. La couleur doit ne pas être opaque pour ne pas masquer les décorations du dessous.", "overviewRuleError": "Couleur du marqueur de la règle d'aperçu pour les erreurs.", "overviewRuleWarning": "Couleur du marqueur de la règle d'aperçu pour les avertissements.", diff --git a/i18n/fra/src/vs/editor/contrib/find/findController.i18n.json b/i18n/fra/src/vs/editor/contrib/find/findController.i18n.json index 8a56c99849..5936c1ea35 100644 --- a/i18n/fra/src/vs/editor/contrib/find/findController.i18n.json +++ b/i18n/fra/src/vs/editor/contrib/find/findController.i18n.json @@ -7,7 +7,7 @@ "Do not edit this file. It is machine generated." ], "startFindAction": "Rechercher", - "startFindWithSelectionAction": "Trouver avec la sélection", + "startFindWithSelectionAction": "Rechercher dans la sélection", "findNextMatchAction": "Rechercher suivant", "findPreviousMatchAction": "Rechercher précédent", "nextSelectionMatchFindAction": "Sélection suivante", diff --git a/i18n/fra/src/vs/editor/contrib/fontZoom/fontZoom.i18n.json b/i18n/fra/src/vs/editor/contrib/fontZoom/fontZoom.i18n.json new file mode 100644 index 0000000000..cec7a842f7 --- /dev/null +++ b/i18n/fra/src/vs/editor/contrib/fontZoom/fontZoom.i18n.json @@ -0,0 +1,12 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "EditorFontZoomIn.label": "Agrandissement de l'éditeur de polices de caractères", + "EditorFontZoomOut.label": "Rétrécissement de l'éditeur de polices de caractères", + "EditorFontZoomReset.label": "Remise à niveau du zoom de l'éditeur de polices de caractères" +} \ No newline at end of file diff --git a/i18n/fra/src/vs/editor/contrib/goToDefinition/goToDefinitionCommands.i18n.json b/i18n/fra/src/vs/editor/contrib/goToDefinition/goToDefinitionCommands.i18n.json new file mode 100644 index 0000000000..0e4da1396f --- /dev/null +++ b/i18n/fra/src/vs/editor/contrib/goToDefinition/goToDefinitionCommands.i18n.json @@ -0,0 +1,25 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "noResultWord": "Définition introuvable pour '{0}'", + "generic.noResults": "Définition introuvable", + "meta.title": " – {0} définitions", + "actions.goToDecl.label": "Atteindre la définition", + "actions.goToDeclToSide.label": "Ouvrir la définition sur le côté", + "actions.previewDecl.label": "Aperçu de définition", + "goToImplementation.noResultWord": "Implémentation introuvable pour '{0}'", + "goToImplementation.generic.noResults": "Implémentation introuvable", + "meta.implementations.title": "– Implémentations {0}", + "actions.goToImplementation.label": "Accéder à l'implémentation", + "actions.peekImplementation.label": "Aperçu de l'implémentation", + "goToTypeDefinition.noResultWord": "Définition de type introuvable pour '{0}'", + "goToTypeDefinition.generic.noResults": "Définition de type introuvable", + "meta.typeDefinitions.title": " – Définitions de type {0}", + "actions.goToTypeDefinition.label": "Atteindre la définition de type", + "actions.peekTypeDefinition.label": "Aperçu de la définition du type" +} \ No newline at end of file diff --git a/i18n/fra/src/vs/editor/contrib/goToDefinition/goToDefinitionMouse.i18n.json b/i18n/fra/src/vs/editor/contrib/goToDefinition/goToDefinitionMouse.i18n.json new file mode 100644 index 0000000000..d92af39bda --- /dev/null +++ b/i18n/fra/src/vs/editor/contrib/goToDefinition/goToDefinitionMouse.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "multipleResults": "Cliquez pour afficher {0} définitions." +} \ No newline at end of file diff --git a/i18n/fra/src/vs/editor/contrib/gotoError/gotoError.i18n.json b/i18n/fra/src/vs/editor/contrib/gotoError/gotoError.i18n.json index 57419ec313..a33833c823 100644 --- a/i18n/fra/src/vs/editor/contrib/gotoError/gotoError.i18n.json +++ b/i18n/fra/src/vs/editor/contrib/gotoError/gotoError.i18n.json @@ -7,5 +7,7 @@ "Do not edit this file. It is machine generated." ], "markerAction.next.label": "Aller au problème suivant (Erreur, Avertissement, Info)", - "markerAction.previous.label": "Aller au problème précédent (Erreur, Avertissement, Info)" + "markerAction.previous.label": "Aller au problème précédent (Erreur, Avertissement, Info)", + "markerAction.nextInFiles.label": "Aller au problème suivant dans Fichiers (Erreur, Avertissement, Info)", + "markerAction.previousInFiles.label": "Aller au problème précédent dans Fichiers (Erreur, Avertissement, Info)" } \ No newline at end of file diff --git a/i18n/fra/src/vs/editor/contrib/indentation/indentation.i18n.json b/i18n/fra/src/vs/editor/contrib/indentation/indentation.i18n.json index 90a2834ead..b0527ad4e7 100644 --- a/i18n/fra/src/vs/editor/contrib/indentation/indentation.i18n.json +++ b/i18n/fra/src/vs/editor/contrib/indentation/indentation.i18n.json @@ -13,5 +13,6 @@ "indentUsingTabs": "Mettre en retrait avec des tabulations", "indentUsingSpaces": "Mettre en retrait avec des espaces", "detectIndentation": "Détecter la mise en retrait à partir du contenu", - "editor.reindentlines": "Remettre en retrait les lignes" + "editor.reindentlines": "Remettre en retrait les lignes", + "editor.reindentselectedlines": "Réindenter les lignes sélectionnées" } \ No newline at end of file diff --git a/i18n/fra/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json b/i18n/fra/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json index a975f63332..6d87da3180 100644 --- a/i18n/fra/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json +++ b/i18n/fra/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json @@ -25,8 +25,6 @@ "uninstallDependeciesConfirmation": "Voulez-vous désinstaller uniquement '{0}' ou également ses dépendances ?", "uninstallOnly": "Extension uniquement", "uninstallAll": "Tout désinstaller", - "uninstallConfirmation": "Voulez-vous vraiment désinstaller '{0}' ?", - "ok": "OK", "singleDependentError": "Impossible de désinstaller l'extension '{0}'. L'extension '{1}' en dépend.", "twoDependentsError": "Impossible de désinstaller l'extension '{0}'. Les extensions '{1}' et '{2}' en dépendent.", "multipleDependentsError": "Impossible de désinstaller l'extension '{0}'. Les extensions '{1}', '{2}' et d'autres extensions en dépendent.", diff --git a/i18n/fra/src/vs/platform/node/minimalTranslations.i18n.json b/i18n/fra/src/vs/platform/node/minimalTranslations.i18n.json new file mode 100644 index 0000000000..5080167104 --- /dev/null +++ b/i18n/fra/src/vs/platform/node/minimalTranslations.i18n.json @@ -0,0 +1,13 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "showLanguagePackExtensions": "VS Code est disponible en {0}. Recherchez des modules linguistiques dans le Marketplace pour commencer.", + "searchMarketplace": "Rechercher dans le Marketplace", + "installAndRestartMessage": "VS Code est disponible en {0}. Installez le module linguistique pour commencer. Un redémarrage est nécessaire.", + "installAndRestart": "Installer et Redémarrer" +} \ No newline at end of file diff --git a/i18n/fra/src/vs/platform/theme/common/colorRegistry.i18n.json b/i18n/fra/src/vs/platform/theme/common/colorRegistry.i18n.json index 7f4a2385ad..30e1e919ce 100644 --- a/i18n/fra/src/vs/platform/theme/common/colorRegistry.i18n.json +++ b/i18n/fra/src/vs/platform/theme/common/colorRegistry.i18n.json @@ -2,7 +2,7 @@ "": [ "--------------------------------------------------------------------------------------------", "Copyright (c) Microsoft Corporation. All rights reserved.", - "Licensed under the Source EULA. See License.txt in the project root for license information.", + "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], @@ -16,7 +16,7 @@ "selectionBackground": "La couleur d'arrière-plan des sélections de texte dans le banc d'essai (par ex., pour les champs d'entrée ou les zones de texte). Notez que cette couleur ne s'applique pas aux sélections dans l'éditeur et le terminal.", "textSeparatorForeground": "Couleur pour les séparateurs de texte.", "textLinkForeground": "Couleur des liens dans le texte.", - "textLinkActiveForeground": "Couleur des liens actifs dans le texte.", + "textLinkActiveForeground": "Couleur de premier plan pour les liens dans le texte lorsqu'ils sont cliqués ou survolés.", "textPreformatForeground": "Couleur des segments de texte préformatés.", "textBlockQuoteBackground": "Couleur d'arrière-plan des citations dans le texte.", "textBlockQuoteBorder": "Couleur de bordure des citations dans le texte.", @@ -48,6 +48,8 @@ "listDropBackground": "Arrière-plan de l'opération de glisser-déplacer dans une liste/arborescence pendant le déplacement d'éléments avec la souris.", "highlight": "Couleur de premier plan dans la liste/l'arborescence pour la surbrillance des correspondances pendant la recherche dans une liste/arborescence.", "invalidItemForeground": "Couleur de premier plan de liste/arbre pour les éléments non valides, par exemple une racine non résolue dans l’Explorateur.", + "listErrorForeground": "Couleur de premier plan des éléments de la liste contenant des erreurs.", + "listWarningForeground": "Couleur de premier plan des éléments de liste contenant des avertissements.", "pickerGroupForeground": "Couleur du sélecteur rapide pour les étiquettes de regroupement.", "pickerGroupBorder": "Couleur du sélecteur rapide pour les bordures de regroupement.", "buttonForeground": "Couleur de premier plan du bouton.", @@ -58,7 +60,7 @@ "scrollbarShadow": "Ombre de la barre de défilement pour indiquer que la vue défile.", "scrollbarSliderBackground": "Couleur de fond du curseur de la barre de défilement.", "scrollbarSliderHoverBackground": "Couleur de fond du curseur de la barre de défilement lors du survol.", - "scrollbarSliderActiveBackground": "Couleur de fond du curseur de la barre de défilement en utilisation.", + "scrollbarSliderActiveBackground": "Couleur d’arrière-plan de la barre de défilement lorsqu'on clique dessus.", "progressBarBackground": "Couleur de fond pour la barre de progression qui peut s'afficher lors d'opérations longues.", "editorBackground": "Couleur d'arrière-plan de l'éditeur.", "editorForeground": "Couleur de premier plan par défaut de l'éditeur.", @@ -75,6 +77,7 @@ "editorFindMatchBorder": "Couleur de bordure du résultat de recherche actif.", "findMatchHighlightBorder": "Couleur de bordure des autres résultats de recherche.", "findRangeHighlightBorder": "Couleur de la bordure limitant la recherche. La couleur ne doit pas être opaque pour ne pas masquer les décorations sous-jacentes. ", + "findWidgetResizeBorder": "Couleur de la bordure de la barre de redimensionnement du widget de recherche.", "hoverHighlight": "Mettre en surbrillance ci-dessous le mot pour lequel un survol est affiché. La couleur doit ne pas être opaque afin de ne pas masquer les décorations sous-jacentes.", "hoverBackground": "Couleur d'arrière-plan du pointage de l'éditeur.", "hoverBorder": "Couleur de bordure du pointage de l'éditeur.", diff --git a/i18n/fra/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.i18n.json b/i18n/fra/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.i18n.json index b610699043..fa69bb7bd8 100644 --- a/i18n/fra/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.i18n.json +++ b/i18n/fra/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.i18n.json @@ -6,5 +6,5 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "confirmUrl": "Vous voulez laisser l'extension {0} ouvrir l'URL suivante ?" + "confirmUrl": "Autoriser une extension à ouvrir cette URL ?" } \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json b/i18n/fra/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json index 698e3a6abb..60914e5d62 100644 --- a/i18n/fra/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json +++ b/i18n/fra/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json @@ -8,13 +8,12 @@ ], "vscode.extension.contributes.views.containers.id": "Identificateur unique utilisé pour identifier le conteneur dans lequel les vues peuvent être contribuées en utilisant le point de contribution 'views'.", "vscode.extension.contributes.views.containers.title": "Chaîne lisible par un humain permettant d'afficher le conteneur", - "vscode.extension.contributes.views.containers.icon": "Chemin de l'icône du conteneur. Les icônes ont une taille de 24x24 centrée dans un rectangle de 50x40, et leur couleur de remplissage est 'rgb(215, 218, 224)' ou '#d7dae0'. Les icônes doivent être de préférence au format SVG, mais tous les types de fichier image sont acceptés.", + "vscode.extension.contributes.views.containers.icon": "Chemin d’accès à l’icône de conteneur. Les icônes font 24x24, centrées sur un bloc de 50x40 et ont une couleur de remplissage de 'rgb (215, 218, 224)' ou '#d7dae0'. Il est recommandé que les icônes soient en SVG, même si n’importe quel type de fichier image est accepté.", "vscode.extension.contributes.viewsContainers": "Contribue aux conteneurs de vues vers l’éditeur", "views.container.activitybar": "Les conteneurs visuels contribuent à la barre d'activité", "test": "Test", - "proposed": "La contribution 'viewsContainers' est disponible uniquement pour l'exécution en dehors de dev ou avec le commutateur de ligne de commande suivant : --enable-proposed-api {0}", "requirearray": "les conteneurs de vues doivent être un tableau", - "requireidstring": "La propriété '{0}' est obligatoire et doit être de type 'string'. Sont autorisés uniquement les caractères alphanumériques, '_', '-'.", + "requireidstring": "la propriété '{0}' est obligatoire et doit être de type 'string'. Seuls les caractères alphanumériques , '_', et '-' sont autorisés.", "requirestring": "la propriété '{0}' est obligatoire et doit être de type 'string'", "showViewlet": "Afficher {0}", "view": "Affichage" diff --git a/i18n/fra/src/vs/workbench/browser/actions/workspaceActions.i18n.json b/i18n/fra/src/vs/workbench/browser/actions/workspaceActions.i18n.json index 7bb90fb939..8bc2495bee 100644 --- a/i18n/fra/src/vs/workbench/browser/actions/workspaceActions.i18n.json +++ b/i18n/fra/src/vs/workbench/browser/actions/workspaceActions.i18n.json @@ -15,5 +15,5 @@ "saveWorkspace": "Enregistrer l’espace de travail", "openWorkspaceAction": "Ouvrir un espace de travail...", "openWorkspaceConfigFile": "Ouvrir le Fichier de Configuration d’espace de travail", - "openFolderAsWorkspaceInNewWindow": "Ouvrir le dossier en tant qu'espace de travail dans une nouvelle fenêtre" + "duplicateWorkspaceInNewWindow": "Dupliquer l'espace de travail dans une Nouvelle fenêtre" } \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/browser/parts/panel/panelPart.i18n.json b/i18n/fra/src/vs/workbench/browser/parts/panel/panelPart.i18n.json index 524b92f41e..fa87e0ad60 100644 --- a/i18n/fra/src/vs/workbench/browser/parts/panel/panelPart.i18n.json +++ b/i18n/fra/src/vs/workbench/browser/parts/panel/panelPart.i18n.json @@ -1,8 +1,10 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the Source EULA. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ -// Do not edit this file. It is machine generated. { - "panelSwitcherBarAriaLabel": "Sélecteur de panneau actif" + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "hidePanel": "Masquer le panneau" } \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/browser/parts/quickopen/quickOpenController.i18n.json b/i18n/fra/src/vs/workbench/browser/parts/quickopen/quickOpenController.i18n.json index 26948bb598..aba51024af 100644 --- a/i18n/fra/src/vs/workbench/browser/parts/quickopen/quickOpenController.i18n.json +++ b/i18n/fra/src/vs/workbench/browser/parts/quickopen/quickOpenController.i18n.json @@ -6,8 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "inputModeEntryDescription": "{0} (Appuyez sur 'Entrée' pour confirmer ou sur 'Échap' pour annuler)", - "inputModeEntry": "Appuyez sur 'Entrée' pour confirmer votre saisie, ou sur 'Échap' pour l'annuler", "emptyPicks": "Aucune entrée à sélectionner", "quickOpenInput": "Tapez '?' pour obtenir de l'aide sur les actions que vous pouvez effectuer ici", "historyMatches": "récemment ouvert", diff --git a/i18n/fra/src/vs/workbench/browser/parts/views/viewsViewlet.i18n.json b/i18n/fra/src/vs/workbench/browser/parts/views/viewsViewlet.i18n.json index a5fdb6b547..29cb8602b4 100644 --- a/i18n/fra/src/vs/workbench/browser/parts/views/viewsViewlet.i18n.json +++ b/i18n/fra/src/vs/workbench/browser/parts/views/viewsViewlet.i18n.json @@ -6,5 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "cannot toggle": "La visibilité ne peut être activée/désactivée pour cette vue {0}", + "cannot show": "Cette vue {0} ne peut pas être affichée car elle est masquée par sa condition 'when'", "hideView": "Masquer" } \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/common/theme.i18n.json b/i18n/fra/src/vs/workbench/common/theme.i18n.json index 5fb133f0ed..7f7adebea4 100644 --- a/i18n/fra/src/vs/workbench/common/theme.i18n.json +++ b/i18n/fra/src/vs/workbench/common/theme.i18n.json @@ -11,8 +11,10 @@ "tabHoverBackground": "Couleur de l'onglet d’arrière-plan lors du survol. Les onglets sont les conteneurs pour les éditeurs dans la zone de l’éditeur. Plusieurs onglets peuvent être ouverts dans un groupe d'éditeur. Il peut y avoir plusieurs groupes d’éditeur.", "tabUnfocusedHoverBackground": "Couleur de l'onglet d’arrière-plan dans un groupe n'ayant pas le focus lors du survol. Les onglets sont les conteneurs pour les éditeurs dans la zone de l’éditeur. Plusieurs onglets peuvent être ouverts dans un groupe d'éditeur. Il peut y avoir plusieurs groupes d’éditeur.", "tabBorder": "Bordure séparant les onglets les uns des autres. Les onglets sont les conteneurs des éditeurs dans la zone d'éditeurs. Vous pouvez ouvrir plusieurs onglets dans un groupe d'éditeurs. Il peut exister plusieurs groupes d'éditeurs.", - "tabActiveBorder": "Bordure pour mettre en évidence les onglets actifs. Les onglets sont les conteneurs des éditeurs dans la zone d'édition. Vous pouvez ouvrir plusieurs onglets dans un groupe d'éditeurs. Il peut exister plusieurs groupes d'éditeurs.", - "tabActiveUnfocusedBorder": "Bordure pour mettre en évidence les onglets actifs dans un groupe inactif. Les onglets sont les conteneurs des éditeurs dans la zone d'édition. Vous pouvez ouvrir plusieurs onglets dans un groupe d'éditeurs. Il peut exister plusieurs groupes d'éditeurs.", + "tabActiveBorder": "Bordure en bas d'un onglet actif. Les onglets sont les conteneurs des éditeurs dans la zone d'édition. Vous pouvez ouvrir plusieurs onglets dans un groupe d'éditeurs. Il peut exister plusieurs groupes d'éditeurs.", + "tabActiveBorderTop": "Bordure en haut d'un onglet actif. Les onglets sont les conteneurs des éditeurs dans la zone d'édition. Vous pouvez ouvrir plusieurs onglets dans un groupe d'éditeurs. Il peut exister plusieurs groupes d'éditeurs.", + "tabActiveUnfocusedBorder": "Bordure en bas d'un onglet actif dans un groupe n'ayant pas le focus. Les onglets sont les conteneurs des éditeurs dans la zone d'édition. Vous pouvez ouvrir plusieurs onglets dans un groupe d'éditeurs. Il peut exister plusieurs groupes d'éditeurs.", + "tabActiveUnfocusedBorderTop": "Bordure en haut d'un onglet actif dans un groupe n'ayant pas le focus. Les onglets sont les conteneurs des éditeurs dans la zone d'édition. Vous pouvez ouvrir plusieurs onglets dans un groupe d'éditeurs. Il peut exister plusieurs groupes d'éditeurs.", "tabHoverBorder": "Bordure avec laquelle surligner les onglets lors du survol. Couleur de l'onglet d’arrière-plan dans un groupe n'ayant pas le focus lors du survol. Les onglets sont les conteneurs pour les éditeurs dans la zone de l’éditeur. Plusieurs onglets peuvent être ouverts dans un groupe d'éditeur. Il peut y avoir plusieurs groupes d’éditeur.", "tabUnfocusedHoverBorder": "Bordure avec laquelle surligner les onglets lors du survol dans un groupe n'ayant pas le focus. Couleur de l'onglet d’arrière-plan dans un groupe n'ayant pas le focus lors du survol. Les onglets sont les conteneurs pour les éditeurs dans la zone de l’éditeur. Plusieurs onglets peuvent être ouverts dans un groupe d'éditeur. Il peut y avoir plusieurs groupes d’éditeur.", "tabActiveForeground": "Couleur de premier plan de l'onglet actif dans un groupe actif. Les onglets sont les conteneurs des éditeurs dans la zone d'éditeurs. Vous pouvez ouvrir plusieurs onglets dans un groupe d'éditeurs. Il peut exister plusieurs groupes d'éditeurs.", diff --git a/i18n/fra/src/vs/workbench/parts/codeEditor/electron-browser/largeFileOptimizations.i18n.json b/i18n/fra/src/vs/workbench/parts/codeEditor/electron-browser/largeFileOptimizations.i18n.json new file mode 100644 index 0000000000..942d9f363e --- /dev/null +++ b/i18n/fra/src/vs/workbench/parts/codeEditor/electron-browser/largeFileOptimizations.i18n.json @@ -0,0 +1,13 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "largeFile": "{0} : la tokenisation, l'entourage et le repliage ont été désactivés pour ce gros fichier afin de réduire l’utilisation de la mémoire et éviter de se figer ou de crasher.", + "neverShowAgain": "OK. Ne plus afficher", + "removeOptimizations": "Activer les fonctionnalités en forçant", + "reopenFilePrompt": "Veuillez rouvrir le dossier pour que ce paramètre soit effectif." +} \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/debug/browser/debugActions.i18n.json b/i18n/fra/src/vs/workbench/parts/debug/browser/debugActions.i18n.json index dcc964fe80..f0341e3d59 100644 --- a/i18n/fra/src/vs/workbench/parts/debug/browser/debugActions.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/debug/browser/debugActions.i18n.json @@ -41,7 +41,7 @@ "debugConsoleAction": "Console de débogage", "unreadOutput": "Nouvelle sortie dans la console de débogage", "debugFocusConsole": "Focus sur la console de débogage", - "focusProcess": "Focus du processus", + "focusSession": "Focus Session", "stepBackDebug": "Revenir en arrière", "reverseContinue": "Inverser" } \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/debug/browser/debugCommands.i18n.json b/i18n/fra/src/vs/workbench/parts/debug/browser/debugCommands.i18n.json index 0eb1acc277..3cc1fd9039 100644 --- a/i18n/fra/src/vs/workbench/parts/debug/browser/debugCommands.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/debug/browser/debugCommands.i18n.json @@ -7,7 +7,7 @@ "Do not edit this file. It is machine generated." ], "noFolderDebugConfig": "Ouvrez d'abord un dossier pour effectuer une configuration de débogage avancée.", - "columnBreakpoint": "Point d'arrêt de colonne", + "inlineBreakpoint": "Point d’arrêt Inline", "debug": "Déboguer", - "addColumnBreakpoint": "Ajouter un point d'arrêt de colonne" + "addInlineBreakpoint": "Ajouter un point d’arrêt Inline" } \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/debug/browser/debugEditorActions.i18n.json b/i18n/fra/src/vs/workbench/parts/debug/browser/debugEditorActions.i18n.json index a12b1b805b..cd4d7c858c 100644 --- a/i18n/fra/src/vs/workbench/parts/debug/browser/debugEditorActions.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/debug/browser/debugEditorActions.i18n.json @@ -12,5 +12,7 @@ "runToCursor": "Exécuter jusqu'au curseur", "debugEvaluate": "Déboguer : évaluer", "debugAddToWatch": "Déboguer : ajouter à la fenêtre Espion", - "showDebugHover": "Déboguer : afficher par pointage" + "showDebugHover": "Déboguer : afficher par pointage", + "goToNextBreakpoint": "Débogage : Aller au prochain point d’arrêt", + "goToPreviousBreakpoint": "Débogage : Aller au point d’arrêt précédent" } \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/debug/browser/debugViewlet.i18n.json b/i18n/fra/src/vs/workbench/parts/debug/browser/debugViewlet.i18n.json index 645d933899..58755c3d9b 100644 --- a/i18n/fra/src/vs/workbench/parts/debug/browser/debugViewlet.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/debug/browser/debugViewlet.i18n.json @@ -6,6 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "startAdditionalSession": "Démarrer une Session supplémentaire", "debugFocusVariablesView": "Focus sur les Variables", "debugFocusWatchView": "Focus sur Watch", "debugFocusCallStackView": "Focus sur CallStack", diff --git a/i18n/fra/src/vs/workbench/parts/debug/common/debugSchemas.i18n.json b/i18n/fra/src/vs/workbench/parts/debug/common/debugSchemas.i18n.json new file mode 100644 index 0000000000..9c4e7d29a6 --- /dev/null +++ b/i18n/fra/src/vs/workbench/parts/debug/common/debugSchemas.i18n.json @@ -0,0 +1,38 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "vscode.extension.contributes.debuggers": "Ajoute des adaptateurs de débogage.", + "vscode.extension.contributes.debuggers.type": "Identificateur unique de cet adaptateur de débogage.", + "vscode.extension.contributes.debuggers.label": "Nom complet de cet adaptateur de débogage.", + "vscode.extension.contributes.debuggers.program": "Chemin du programme de l'adaptateur de débogage. Le chemin est absolu ou relatif par rapport au dossier d'extensions.", + "vscode.extension.contributes.debuggers.args": "Arguments facultatifs à passer à l'adaptateur.", + "vscode.extension.contributes.debuggers.runtime": "Runtime facultatif, si l'attribut de programme n'est pas un exécutable, mais qu'il nécessite un exécutable.", + "vscode.extension.contributes.debuggers.runtimeArgs": "Arguments du runtime facultatif.", + "vscode.extension.contributes.debuggers.variables": "Mappage à partir de variables interactives (par exemple, ${action.pickProcess}) dans 'launch.json' vers une commande.", + "vscode.extension.contributes.debuggers.initialConfigurations": "Configurations pour la génération du fichier 'launch.json' initial.", + "vscode.extension.contributes.debuggers.languages": "Liste de langages pour lesquels l'extension de débogage peut être considérée comme \"débogueur par défaut\".", + "vscode.extension.contributes.debuggers.adapterExecutableCommand": "Si l'extension VS Code spécifiée appelle cette commande pour déterminer le chemin de l'exécutable de l'adaptateur de débogage et les arguments à passer.", + "vscode.extension.contributes.debuggers.configurationSnippets": "Extraits pour l'ajout de nouvelles configurations à 'launch.json'.", + "vscode.extension.contributes.debuggers.configurationAttributes": "Configurations de schéma JSON pour la validation de 'launch.json'.", + "vscode.extension.contributes.debuggers.windows": "Paramètres spécifiques à Windows.", + "vscode.extension.contributes.debuggers.windows.runtime": "Runtime utilisé pour Windows.", + "vscode.extension.contributes.debuggers.osx": "Paramètres spécifiques à macOS.", + "vscode.extension.contributes.debuggers.osx.runtime": "Runtime utilisé pour macOS.", + "vscode.extension.contributes.debuggers.linux": "Paramètres spécifiques à Linux.", + "vscode.extension.contributes.debuggers.linux.runtime": "Runtime utilisé pour Linux.", + "vscode.extension.contributes.breakpoints": "Ajoute des points d'arrêt.", + "vscode.extension.contributes.breakpoints.language": "Autorisez les points d'arrêt pour ce langage.", + "app.launch.json.title": "Lancer", + "app.launch.json.version": "Version de ce format de fichier.", + "app.launch.json.configurations": "Liste des configurations. Ajoutez de nouvelles configurations, ou modifiez celles qui existent déjà à l'aide d'IntelliSense.", + "app.launch.json.compounds": "Liste des composés. Chaque composé référence plusieurs configurations qui sont lancées ensemble.", + "app.launch.json.compound.name": "Nom du composé. Apparaît dans le menu déroulant de la configuration de lancement.", + "useUniqueNames": "Veuillez utiliser des noms de configuration uniques.", + "app.launch.json.compound.folder": "Nom du dossier dans lequel le composé se trouve.", + "app.launch.json.compounds.configurations": "Noms des configurations qui sont lancées dans le cadre de ce composé." +} \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/debug/electron-browser/callStackView.i18n.json b/i18n/fra/src/vs/workbench/parts/debug/electron-browser/callStackView.i18n.json index b0a8919f57..d277a4b823 100644 --- a/i18n/fra/src/vs/workbench/parts/debug/electron-browser/callStackView.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/debug/electron-browser/callStackView.i18n.json @@ -9,7 +9,7 @@ "callstackSection": "Section de pile des appels", "debugStopped": "En pause sur {0}", "callStackAriaLabel": "Déboguer la pile des appels", - "process": "Processus", + "session": "Session", "paused": "Suspendu", "running": "En cours d'exécution", "thread": "Thread", diff --git a/i18n/fra/src/vs/workbench/parts/debug/electron-browser/debug.contribution.i18n.json b/i18n/fra/src/vs/workbench/parts/debug/electron-browser/debug.contribution.i18n.json index 65457f3552..9b3c1ce07f 100644 --- a/i18n/fra/src/vs/workbench/parts/debug/electron-browser/debug.contribution.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/debug/electron-browser/debug.contribution.i18n.json @@ -21,11 +21,12 @@ "allowBreakpointsEverywhere": "Permet de définir un point d'arrêt dans un fichier", "openExplorerOnEnd": "Ouvrir automatiquement le mode explorateur à la fin d'une session de débogage", "inlineValues": "Afficher les valeurs des variables inline dans l'éditeur pendant le débogage", - "hideActionBar": "Contrôle si la barre d'action de débogage flottante doit être masquée", + "toolBarLocation": "Contrôle l’emplacement de la barre d’outils de débogage. Soit \"floating\" dans toutes les vues, \"docked\" dans l’affichage de débogage, ou \"hidden\"", "never": "Ne jamais afficher debug dans la barre d'état", "always": "Toujours afficher debug dans la barre d’état", "onFirstSessionStart": "Afficher debug dans seule la barre d’état après que le débogage a été lancé pour la première fois", "showInStatusBar": "Contrôle quand la barre d’état de débogage doit être visible", "openDebug": "Contrôle si la vue de débogage doit être ouverte au démarrage de la session de débogage.", + "enableAllHovers": "Contrôle si les non debug hovers doivent être activés pendant le débogage. Si true les fournisseurs hover seront appellés pour assurer un hover. Les hovers ordinaires ne seront pas affichés même si ce paramètre est true.", "launch": "Configuration du lancement du débogage global. Doit être utilisée comme alternative à 'launch.json' qui est partagé entre les espaces de travail" } \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.i18n.json b/i18n/fra/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.i18n.json index 9edc18d1ab..2dd2300cf9 100644 --- a/i18n/fra/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.i18n.json @@ -6,35 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "vscode.extension.contributes.debuggers": "Ajoute des adaptateurs de débogage.", - "vscode.extension.contributes.debuggers.type": "Identificateur unique de cet adaptateur de débogage.", - "vscode.extension.contributes.debuggers.label": "Nom complet de cet adaptateur de débogage.", - "vscode.extension.contributes.debuggers.program": "Chemin du programme de l'adaptateur de débogage. Le chemin est absolu ou relatif par rapport au dossier d'extensions.", - "vscode.extension.contributes.debuggers.args": "Arguments facultatifs à passer à l'adaptateur.", - "vscode.extension.contributes.debuggers.runtime": "Runtime facultatif, si l'attribut de programme n'est pas un exécutable, mais qu'il nécessite un exécutable.", - "vscode.extension.contributes.debuggers.runtimeArgs": "Arguments du runtime facultatif.", - "vscode.extension.contributes.debuggers.variables": "Mappage à partir de variables interactives (par exemple, ${action.pickProcess}) dans 'launch.json' vers une commande.", - "vscode.extension.contributes.debuggers.initialConfigurations": "Configurations pour la génération du fichier 'launch.json' initial.", - "vscode.extension.contributes.debuggers.languages": "Liste de langages pour lesquels l'extension de débogage peut être considérée comme \"débogueur par défaut\".", - "vscode.extension.contributes.debuggers.adapterExecutableCommand": "Si l'extension VS Code spécifiée appelle cette commande pour déterminer le chemin de l'exécutable de l'adaptateur de débogage et les arguments à passer.", - "vscode.extension.contributes.debuggers.configurationSnippets": "Extraits pour l'ajout de nouvelles configurations à 'launch.json'.", - "vscode.extension.contributes.debuggers.configurationAttributes": "Configurations de schéma JSON pour la validation de 'launch.json'.", - "vscode.extension.contributes.debuggers.windows": "Paramètres spécifiques à Windows.", - "vscode.extension.contributes.debuggers.windows.runtime": "Runtime utilisé pour Windows.", - "vscode.extension.contributes.debuggers.osx": "Paramètres spécifiques à macOS.", - "vscode.extension.contributes.debuggers.osx.runtime": "Runtime utilisé pour macOS.", - "vscode.extension.contributes.debuggers.linux": "Paramètres spécifiques à Linux.", - "vscode.extension.contributes.debuggers.linux.runtime": "Runtime utilisé pour Linux.", - "vscode.extension.contributes.breakpoints": "Ajoute des points d'arrêt.", - "vscode.extension.contributes.breakpoints.language": "Autorisez les points d'arrêt pour ce langage.", - "app.launch.json.title": "Lancer", - "app.launch.json.version": "Version de ce format de fichier.", - "app.launch.json.configurations": "Liste des configurations. Ajoutez de nouvelles configurations, ou modifiez celles qui existent déjà à l'aide d'IntelliSense.", - "app.launch.json.compounds": "Liste des composés. Chaque composé référence plusieurs configurations qui sont lancées ensemble.", - "app.launch.json.compound.name": "Nom du composé. Apparaît dans le menu déroulant de la configuration de lancement.", - "useUniqueNames": "Veuillez utiliser des noms de configuration uniques.", - "app.launch.json.compound.folder": "Nom du dossier dans lequel le composé se trouve.", - "app.launch.json.compounds.configurations": "Noms des configurations qui sont lancées dans le cadre de ce composé.", "debugNoType": "Le 'type' de débogueur ne peut pas être omis et doit être de type 'string'.", "selectDebug": "Sélectionner l'environnement", "DebugConfig.failed": "Impossible de créer le fichier 'launch.json' dans le dossier '.vscode' ({0}).", diff --git a/i18n/fra/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json b/i18n/fra/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json index c0d36ce732..2b2ecf211f 100644 --- a/i18n/fra/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json @@ -13,15 +13,15 @@ "disableBreakpoint": "Désactiver {0}", "enableBreakpoint": "Activer {0}", "removeBreakpoints": "Supprimer les points d'arrêt", - "removeBreakpointOnColumn": "Supprimer le point d'arrêt de la colonne {0}", + "removeInlineBreakpointOnColumn": "Supprimer le point d’arrêt Inline sur la colonne {0}", "removeLineBreakpoint": "Supprimer le point d'arrêt de la ligne", "editBreakpoints": "Modifier les points d'arrêt", - "editBreakpointOnColumn": "Modifier le point d'arrêt de la colonne {0}", + "editInlineBreakpointOnColumn": "Modifier le point d’arrêt Inline sur la colonne {0}", "editLineBrekapoint": "Modifier le point d'arrêt de la ligne", "enableDisableBreakpoints": "Activer/désactiver les points d'arrêt", - "disableColumnBreakpoint": "Désactiver le point d'arrêt de la colonne {0}", + "disableInlineColumnBreakpoint": "Désactiver le point d’arrêt Inline sur la colonne {0}", "disableBreakpointOnLine": "Désactiver le point d'arrêt de la ligne", - "enableBreakpoints": "Activer le point d'arrêt de la colonne {0}", + "enableBreakpoints": "Activer le point d’arrêt Inline sur la colonne {0}", "enableBreakpointOnLine": "Activer le point d'arrêt de la ligne", "addBreakpoint": "Ajouter un point d'arrêt", "addConditionalBreakpoint": "Ajouter un point d'arrêt conditionnel...", diff --git a/i18n/fra/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.i18n.json b/i18n/fra/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.i18n.json index ecc9b7ee90..0c89b62126 100644 --- a/i18n/fra/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.i18n.json @@ -16,9 +16,13 @@ "repository": "Dépôt", "license": "Licence", "details": "Détails", + "detailstooltip": "Détails de l’extension, affichés depuis le fichier 'README.md' de l’extension", "contributions": "Contributions", + "contributionstooltip": "Listes des contributions à VS Code par cette extension", "changelog": "Journal des modifications", + "changelogtooltip": "Historique de mise à jour de de l'extension, affiché depuis le fichier 'CHANGELOG.md' de l’extension", "dependencies": "Dépendances", + "dependenciestooltip": "Répertorie les extensions dont dépend cette extension", "noReadme": "Aucun fichier README disponible.", "noChangelog": "Aucun Changelog disponible.", "noContributions": "Aucune contribution", @@ -30,6 +34,10 @@ "debuggers": "Débogueurs ({0})", "debugger name": "Nom", "debugger type": "Type", + "viewContainers": "Voir les conteneurs ({0})", + "view container id": "ID", + "view container title": "Titre", + "view container location": "Emplacement", "views": "Vues ({0})", "view id": "ID", "view name": "Nom", diff --git a/i18n/fra/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json b/i18n/fra/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json index 4149f9c33d..c52dcba370 100644 --- a/i18n/fra/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json @@ -8,7 +8,6 @@ ], "neverShowAgain": "Ne plus afficher", "searchMarketplace": "Rechercher dans le Marketplace", - "showLanguagePackExtensions": "Le Marketplace a des extensions qui peuvent aider à localiser VS Code en '{0}'", "dynamicWorkspaceRecommendation": "Cette extension peut vous intéresser car elle est populaire parmi les utilisateurs du dépôt {0}.", "exeBasedRecommendation": "Cette extension est recommandée parce que {0} est installé.", "fileBasedRecommendation": "Cette extension est recommandée basé sur les fichiers que vous avez ouverts récemment.", diff --git a/i18n/fra/src/vs/workbench/parts/extensions/node/extensionsWorkbenchService.i18n.json b/i18n/fra/src/vs/workbench/parts/extensions/node/extensionsWorkbenchService.i18n.json index 199ad9e26a..46e9490976 100644 --- a/i18n/fra/src/vs/workbench/parts/extensions/node/extensionsWorkbenchService.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/extensions/node/extensionsWorkbenchService.i18n.json @@ -10,12 +10,12 @@ "malicious": "Cette extension est signalée comme problématique.", "installingMarketPlaceExtension": "Installation d’extension depuis le Marketplace...", "uninstallingExtension": "Désinstallation d'extension...", - "enableDependeciesConfirmation": "L'activation de '{0}' entraîne également l'activation de ses dépendances. Voulez-vous continuer ?", + "enableDependeciesConfirmation": "Activer une extension active également ses dépendances. Souhaitez-vous continuer ?", "enable": "Oui", "doNotEnable": "Non", - "disableDependeciesConfirmation": "Voulez-vous désactiver uniquement '{0}' ou également ses dépendances ?", - "disableOnly": "Uniquement", - "disableAll": "Tout", + "disableDependeciesConfirmation": "Souhaitez-vous désactiver les dépendances des extensions également ?", + "yes": "Oui", + "no": "Non", "cancel": "Annuler", "singleDependentError": "Impossible de désactiver l'extension '{0}'. L'extension '{1}' en dépend.", "twoDependentsError": "Impossible de désactiver l'extension '{0}'. Les extensions '{1}' et '{2}' en dépendent.", diff --git a/i18n/fra/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json b/i18n/fra/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json index 6c595644a6..629b97706f 100644 --- a/i18n/fra/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json @@ -65,7 +65,6 @@ "emptyFileNameError": "Un nom de fichier ou de dossier doit être fourni.", "fileNameStartsWithSlashError": "Un nom de fichier ou de dossier ne peut commencer par une barre oblique.", "fileNameExistsError": "Un fichier ou dossier **{0}** existe déjà à cet emplacement. Choisissez un autre nom.", - "fileUsedAsFolderError": "**{0}** est un fichier et ne peut pas avoir de descendant.", "invalidFileNameError": "Le nom **{0}** est non valide en tant que nom de fichier ou de dossier. Choisissez un autre nom.", "filePathTooLongError": "Le nom **{0}** correspond à un chemin d'accès trop long. Choisissez un nom plus court.", "compareWithClipboard": "Compare le fichier actif avec le presse-papiers", diff --git a/i18n/fra/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.i18n.json b/i18n/fra/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.i18n.json index 7a8e6c2de0..ce1503b6df 100644 --- a/i18n/fra/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.i18n.json @@ -7,6 +7,7 @@ "Do not edit this file. It is machine generated." ], "updateLocale": "Souhaitez-vous changer la langue de l’interface de VS Code en {0} et redémarrer ?", + "activateLanguagePack": "Souhaitez-vous redémarrer VS Code pour activer le module linguistique qui vient d'être installé ?", "yes": "Oui", "no": "Non", "neverAgain": "Ne plus afficher", diff --git a/i18n/fra/src/vs/workbench/parts/localizations/electron-browser/localizationsActions.i18n.json b/i18n/fra/src/vs/workbench/parts/localizations/electron-browser/localizationsActions.i18n.json index 5144212e71..465c23436b 100644 --- a/i18n/fra/src/vs/workbench/parts/localizations/electron-browser/localizationsActions.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/localizations/electron-browser/localizationsActions.i18n.json @@ -6,7 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "configureLocale": "Configurer la langue", + "configureLocale": "Configurer la langue d’affichage", "displayLanguage": "Définit le langage affiché par VSCode.", "doc": "Consultez {0} pour connaître la liste des langues prises en charge.", "restart": "Le changement de la valeur nécessite le redémarrage de VS Code.", diff --git a/i18n/fra/src/vs/workbench/parts/markers/electron-browser/markersPanelActions.i18n.json b/i18n/fra/src/vs/workbench/parts/markers/electron-browser/markersPanelActions.i18n.json index 60ed699807..33b575eefc 100644 --- a/i18n/fra/src/vs/workbench/parts/markers/electron-browser/markersPanelActions.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/markers/electron-browser/markersPanelActions.i18n.json @@ -6,5 +6,5 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "showing filtered problems": "Affichage de {0} de {1}" + "showing filtered problems": "Afficher {0} sur {1}" } \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/markers/electron-browser/messages.i18n.json b/i18n/fra/src/vs/workbench/parts/markers/electron-browser/messages.i18n.json index 0c1cb04ba6..f31962ae04 100644 --- a/i18n/fra/src/vs/workbench/parts/markers/electron-browser/messages.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/markers/electron-browser/messages.i18n.json @@ -15,7 +15,7 @@ "markers.panel.aria.label.problems.tree": "Problèmes regroupés par fichiers", "markers.panel.no.problems.build": "Aucun problème n'a été détecté dans l'espace de travail jusqu'à présent.", "markers.panel.no.problems.filters": "Aucun résultat trouvé avec les critères de filtre fourni.", - "markers.panel.no.problems.file.exclusions": "Tous les problèmes sont cachés parce que le filtre d’exclusion de fichiers est activé.", + "markers.panel.no.problems.file.exclusions": "Tous les problèmes sont masqués parce que le filtre d’exclusion de fichiers est activé.", "markers.panel.action.useFilesExclude": "Filtrer en utilisant le paramètre d’exclusion de fichiers", "markers.panel.action.donotUseFilesExclude": "Ne pas utiliser le paramètre d’exclusion de fichiers", "markers.panel.action.filter": "Filtrer les problèmes", diff --git a/i18n/fra/src/vs/workbench/parts/outline/electron-browser/outline.contribution.i18n.json b/i18n/fra/src/vs/workbench/parts/outline/electron-browser/outline.contribution.i18n.json new file mode 100644 index 0000000000..8f3cb53d9e --- /dev/null +++ b/i18n/fra/src/vs/workbench/parts/outline/electron-browser/outline.contribution.i18n.json @@ -0,0 +1,12 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "name": "Contour", + "category.focus": "Fichier", + "label.focus": "Focus sur Outline" +} \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/outline/electron-browser/outlinePanel.i18n.json b/i18n/fra/src/vs/workbench/parts/outline/electron-browser/outlinePanel.i18n.json new file mode 100644 index 0000000000..2bcba2947c --- /dev/null +++ b/i18n/fra/src/vs/workbench/parts/outline/electron-browser/outlinePanel.i18n.json @@ -0,0 +1,17 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "filter": "Filtre", + "collapse": "Réduire tout", + "sortByPosition": "Trier par : Position", + "sortByName": "Trier par : Nom", + "sortByKind": "Trier par : Type", + "live": "Suivre le curseur", + "no-editor": "Aucun éditeur d'ouvert ne peut fournir des informations générales.", + "too-many-symbols": "Nous sommes désolés, mais ce fichier est trop volumineux pour afficher un résumé." +} \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/outline/electron-browser/outlineTree.i18n.json b/i18n/fra/src/vs/workbench/parts/outline/electron-browser/outlineTree.i18n.json new file mode 100644 index 0000000000..cf7406fddb --- /dev/null +++ b/i18n/fra/src/vs/workbench/parts/outline/electron-browser/outlineTree.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "outline.title": "la ligne {0} dans {1}" +} \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/output/browser/outputPanel.i18n.json b/i18n/fra/src/vs/workbench/parts/output/browser/outputPanel.i18n.json index 0368a37456..20f78c8bd9 100644 --- a/i18n/fra/src/vs/workbench/parts/output/browser/outputPanel.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/output/browser/outputPanel.i18n.json @@ -6,6 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "output": "Sortie", "outputPanelWithInputAriaLabel": "{0}, Panneau de sortie", "outputPanelAriaLabel": "Panneau de sortie" } \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/preferences/browser/keybindingWidgets.i18n.json b/i18n/fra/src/vs/workbench/parts/preferences/browser/keybindingWidgets.i18n.json index dbc7df36f4..f86ab55771 100644 --- a/i18n/fra/src/vs/workbench/parts/preferences/browser/keybindingWidgets.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/preferences/browser/keybindingWidgets.i18n.json @@ -6,6 +6,8 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "defineKeybinding.oneExists": "1 commande existante a cette combinaison de touche", + "defineKeybinding.existing": "{0} commandes existantes ont ce combinaison de touche", "defineKeybinding.initial": "Appuyez sur la combinaison de touches souhaitée puis appuyez sur Entrée", "defineKeybinding.chordsTo": "pression simultanée avec" } \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json b/i18n/fra/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json index 286bb69c00..5b644dccfe 100644 --- a/i18n/fra/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json @@ -7,6 +7,7 @@ "Do not edit this file. It is machine generated." ], "openRawDefaultSettings": "Ouvrir les paramètres bruts par défaut", + "openSettings2": "Afficher les paramètres (Aperçu)", "openSettings": "Ouvrir les paramètres", "openGlobalSettings": "Ouvrir les paramètres utilisateur", "openGlobalKeybindings": "Ouvrir les raccourcis clavier", diff --git a/i18n/fra/src/vs/workbench/parts/preferences/browser/settingsEditor2.i18n.json b/i18n/fra/src/vs/workbench/parts/preferences/browser/settingsEditor2.i18n.json new file mode 100644 index 0000000000..8b61efa5b2 --- /dev/null +++ b/i18n/fra/src/vs/workbench/parts/preferences/browser/settingsEditor2.i18n.json @@ -0,0 +1,18 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "previewWarning": "Aperçu", + "previewLabel": "Il s’agit d’un aperçu de notre nouvel éditeur de paramètres", + "SearchSettings.AriaLabel": "Paramètres de recherche", + "SearchSettings.Placeholder": "Paramètres de recherche", + "advancedCustomizationLabel": "Pour des personnalisations avancées, ouvrez et modifiez", + "openSettingsLabel": "settings.json", + "showOverriddenOnly": "Afficher les modifiés uniquement", + "treeAriaLabel": "Paramètres", + "feedbackButtonLabel": "Fournir un Feedback" +} \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/preferences/browser/settingsTree.i18n.json b/i18n/fra/src/vs/workbench/parts/preferences/browser/settingsTree.i18n.json new file mode 100644 index 0000000000..c9a7c449c4 --- /dev/null +++ b/i18n/fra/src/vs/workbench/parts/preferences/browser/settingsTree.i18n.json @@ -0,0 +1,19 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "modifiedItemForeground": "Couleur de premier plan d'un paramètre modifié.", + "workspace": "Espace de travail", + "user": "Utilisateur", + "resetButtonTitle": "réinitialiser", + "configured": "Modifié", + "alsoConfiguredIn": "Également modifiés dans", + "configuredIn": "Modifié dans", + "editInSettingsJson": "Modifier dans settings.json", + "settingRowAriaLabel": "{0} {1}, Paramètre", + "groupRowAriaLabel": "{0}, groupe" +} \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/preferences/electron-browser/preferences.contribution.i18n.json b/i18n/fra/src/vs/workbench/parts/preferences/electron-browser/preferences.contribution.i18n.json index 10a80aeafa..15ee1808f5 100644 --- a/i18n/fra/src/vs/workbench/parts/preferences/electron-browser/preferences.contribution.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/preferences/electron-browser/preferences.contribution.i18n.json @@ -7,6 +7,7 @@ "Do not edit this file. It is machine generated." ], "defaultPreferencesEditor": "Éditeur de préférences par défaut", + "settingsEditor2": "Éditeur de paramètres 2", "keybindingsEditor": "Éditeur de combinaisons de touches", "preferences": "Préférences" } \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/search/browser/searchActions.i18n.json b/i18n/fra/src/vs/workbench/parts/search/browser/searchActions.i18n.json index af07c4f443..aad0023b68 100644 --- a/i18n/fra/src/vs/workbench/parts/search/browser/searchActions.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/search/browser/searchActions.i18n.json @@ -12,6 +12,8 @@ "previousSearchExcludePattern": "Afficher le précédent Exclude Pattern de recherche", "nextSearchTerm": "Afficher le terme de recherche suivant", "previousSearchTerm": "Afficher le terme de recherche précédent", + "nextReplaceTerm": "Voir le terme de recherche suivant à remplacer", + "previousReplaceTerm": "Voir le terme de recherche précédent à remplacer", "findInFiles": "Chercher dans les fichiers", "replaceInFiles": "Remplacer dans les fichiers", "RefreshAction.label": "Actualiser", diff --git a/i18n/fra/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json b/i18n/fra/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json index 7cb5620c5e..043fb92d98 100644 --- a/i18n/fra/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json @@ -31,5 +31,5 @@ "search.followSymlinks": "Contrôle s'il faut suivre les symlinks pendant la recherche.", "search.smartCase": "Recherches de manière non case-sensitive si le modèle est entièrement en minuscules, dans le cas contraire, recherche de manière case-sensitive", "search.globalFindClipboard": "Contrôle si la vue de recherche doit lire ou modifier le presse-papiers partagé sur macOS", - "search.location": "Contrôle si la recherche s’affichera comme une vue dans la barre latérale ou comme un panneau dans la zone de panneau pour plus d'espace horizontal. La prochaine version de la Recherche dans le panneau aura une meilleure présentation horizontale et cela ne sera plus une preview." + "search.location": "Contrôle si la recherche s’affichera comme une vue dans la barre latérale ou comme un panneau dans la zone de panneau pour plus d'espace horizontal." } \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/tasks/electron-browser/jsonSchema_v2.i18n.json b/i18n/fra/src/vs/workbench/parts/tasks/electron-browser/jsonSchema_v2.i18n.json index fee1afc17e..3ce064e713 100644 --- a/i18n/fra/src/vs/workbench/parts/tasks/electron-browser/jsonSchema_v2.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/tasks/electron-browser/jsonSchema_v2.i18n.json @@ -28,6 +28,7 @@ "JsonSchema.tasks.group.none": "N'assigne la tâche à aucun groupe", "JsonSchema.tasks.group": "Définit le groupe d'exécution auquel la tâche appartient. Prend en charge \"build\" pour l'ajouter au groupe de génération et \"test\" pour l'ajouter au groupe de test.", "JsonSchema.tasks.type": "Définit si la tâche est exécutée comme un processus ou comme une commande à l’intérieur d’un shell.", + "JsonSchema.commandArray": "La commande shell à exécuter. Les éléments du tableau seront joints en utilisant un caractère d’espacement", "JsonSchema.command.quotedString.value": "La valeur réelle de la commande", "JsonSchema.tasks.quoting.escape": "Echappe les caractères à l’aide du caractère d’échappement du shell (par exemple: ` sous PowerShell et \\ sous bash).", "JsonSchema.tasks.quoting.strong": "Entoure l’argument en utilisant le caractère guillemet du shell (par exemple: \" sous PowerShell et bash).", diff --git a/i18n/fra/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.i18n.json b/i18n/fra/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.i18n.json index 720c3ca1cf..cd05998fae 100644 --- a/i18n/fra/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.i18n.json @@ -19,6 +19,7 @@ "terminal.integrated.copyOnSelection": "Une fois le paramètre défini, le texte sélectionné dans le terminal sera copié dans le presse-papiers.", "terminal.integrated.fontFamily": "Contrôle la famille de polices du terminal. La valeur par défaut est la valeur associée à editor.fontFamily.", "terminal.integrated.fontSize": "Contrôle la taille de police en pixels du terminal.", + "terminal.integrated.letterSpacing": "Contrôle l'espacement de lettre du terminal, il s’agit d’une valeur entière qui représente la quantité de pixels supplémentaires à ajouter entre les caractères.", "terminal.integrated.lineHeight": "Contrôle la hauteur de ligne du terminal. La multiplication de ce nombre par la taille de police du terminal permet d'obtenir la hauteur de ligne réelle en pixels.", "terminal.integrated.fontWeight": "La police de caractères à utiliser dans le terminal pour le texte non gras.", "terminal.integrated.fontWeightBold": "La police de caractères à utiliser dans le terminal pour le texte en gras.", @@ -26,7 +27,8 @@ "terminal.integrated.cursorStyle": "Contrôle le style du curseur du terminal.", "terminal.integrated.scrollback": "Contrôle la quantité maximale de lignes que le terminal conserve dans sa mémoire tampon.", "terminal.integrated.setLocaleVariables": "Contrôle si les variables locales sont définies au démarrage du terminal. La valeur par défaut est true sur OS X, false sur les autres plateformes.", - "terminal.integrated.rightClickBehavior": "Contrôle la façon de réagir à un clic droit, les possibilités sont 'default', 'copyPaste', et 'selectWord'. 'default' affichera le menu contextuel. 'copyPaste' copiera quand il y a une sélection ou sinon collera. 'selectWord'  sélectionnera le mot sous le curseur et affichera le menu contextuel.", + "terminal.integrated.rendererType": "Contrôle la façon dont le terminal est affiché, les options sont \"canvas\" pour le moteur de rendu standard de canvas (rapide), \"dom\" pour le moteur de rendu de compatibilité basé sur DOM ou \"auto\" qui laisse VS Code deviner qui sera le meilleur. Ce paramètre nécessite que VS Code soit rechargé pour pouvoir être effectif.", + "terminal.integrated.rightClickBehavior": "Contrôle comment le terminal réagit au clic droit, les possibilités sont \"default\", \"copyPaste\" et \"selectWord\". \"default\" affichera le menu contextuel, \"copyPaste\" copiera lorsqu’il y a une sélection dans le cas contraire, \"selectWord\" sélectionne le mot sous le curseur et afficher le menu contextuel.", "terminal.integrated.cwd": "Chemin explicite de lancement du terminal. Il est utilisé comme répertoire de travail actif du processus d'interpréteur de commandes. Cela peut être particulièrement utile dans les paramètres d'espace de travail, si le répertoire racine n'est pas un répertoire de travail actif adéquat.", "terminal.integrated.confirmOnExit": "Indique s'il est nécessaire de confirmer l'existence de sessions de terminal actives au moment de quitter.", "terminal.integrated.enableBell": "Si la cloche du terminal est activée ou non.", diff --git a/i18n/fra/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json b/i18n/fra/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json index 6b0c31c403..13fe0e879c 100644 --- a/i18n/fra/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json @@ -57,5 +57,7 @@ "workbench.action.terminal.scrollToPreviousCommand": "Faire défiler jusqu'à la commande précédente", "workbench.action.terminal.scrollToNextCommand": "Faire défiler jusqu'à la prochaine commande", "workbench.action.terminal.selectToPreviousCommand": "Sélectionnez pour la commande précédente", - "workbench.action.terminal.selectToNextCommand": "Sélectionnez pour la commande suivante" + "workbench.action.terminal.selectToNextCommand": "Sélectionnez pour la commande suivante", + "workbench.action.terminal.selectToPreviousLine": "Sélectionner pour la ligne précédente", + "workbench.action.terminal.selectToNextLine": "Sélectionner pour la ligne suivante" } \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.i18n.json b/i18n/fra/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.i18n.json index 25c572920e..991d98720a 100644 --- a/i18n/fra/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.i18n.json @@ -9,6 +9,11 @@ "terminal.integrated.a11yBlankLine": "Ligne vide", "terminal.integrated.a11yPromptLabel": "Entrée du terminal", "terminal.integrated.a11yTooMuchOutput": "Trop de sorties à annoncer, naviguer dans les lignes manuellement pour lire", + "yes": "Oui", + "terminal.rendererInAllNewTerminals": "Tous les terminaux nouvellement créés utiliseront le moteur de rendu non-GPU.", + "no": "Non", + "dontShowAgain": "Ne plus afficher", + "terminal.slowRendering": "Le moteur de rendu standard pour le terminal intégré semble lent sur votre ordinateur. Souhaitez-vous basculer vers le moteur de rendu basé sur DOM ce qui peut améliorer les performances ? [En savoir plus sur les paramètres de terminal] (https://code.visualstudio.com/docs/editor/integrated-terminal#_changing-how-the-terminal-is-rendered).", "terminal.integrated.copySelection.noSelection": "Le terminal n'a aucune sélection à copier", "terminal.integrated.exitedWithCode": "Le processus du terminal s'est achevé avec le code de sortie {0}", "terminal.integrated.waitOnExit": "Appuyez sur une touche pour fermer le terminal", diff --git a/i18n/fra/src/vs/workbench/parts/terminal/electron-browser/terminalPanel.i18n.json b/i18n/fra/src/vs/workbench/parts/terminal/electron-browser/terminalPanel.i18n.json index 9f916b323f..fbc96a1945 100644 --- a/i18n/fra/src/vs/workbench/parts/terminal/electron-browser/terminalPanel.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/terminal/electron-browser/terminalPanel.i18n.json @@ -6,6 +6,8 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "terminal.useMonospace": "Utilisez 'monospace'", + "terminal.monospaceOnly": "Le terminal prend uniquement en charge les polices à espacement fixe.", "copy": "Copier", "split": "Diviser", "paste": "Coller", diff --git a/i18n/fra/src/vs/workbench/parts/trust/electron-browser/unsupportedWorkspaceSettings.contribution.i18n.json b/i18n/fra/src/vs/workbench/parts/trust/electron-browser/unsupportedWorkspaceSettings.contribution.i18n.json index 8d57e3f50f..1e8e95ff0d 100644 --- a/i18n/fra/src/vs/workbench/parts/trust/electron-browser/unsupportedWorkspaceSettings.contribution.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/trust/electron-browser/unsupportedWorkspaceSettings.contribution.i18n.json @@ -6,7 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "unsupportedWorkspaceSettings": "Cet espace de travail contient des paramètres qui ne peuvent être définis que dans les paramètres utilisateur ({0}). Cliquez [ici]({1}) pour en savoir plus.", "openWorkspaceSettings": "Ouvrir les paramètres d'espace de travail", - "dontShowAgain": "Ne plus afficher" + "dontShowAgain": "Ne plus afficher", + "unsupportedWorkspaceSettings": "Cet espace de travail contient des paramètres qui ne peuvent être définis que dans les paramètres utilisateur ({0}). Cliquez [ici]({1}) pour en savoir plus." } \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/update/electron-browser/update.i18n.json b/i18n/fra/src/vs/workbench/parts/update/electron-browser/update.i18n.json index 1c0f5e94e4..7338692978 100644 --- a/i18n/fra/src/vs/workbench/parts/update/electron-browser/update.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/update/electron-browser/update.i18n.json @@ -20,7 +20,7 @@ "later": "Plus tard", "updateAvailable": "Il y a une mise à jour disponible : {0} {1}", "installUpdate": "Installer la mise à jour", - "updateInstalling": "{0} {1} est en train d'être installé en arrière-plan, nous vous ferons savoir quand c’est fini.", + "updateInstalling": "{0} {1} est installé en tâche de fond ; Nous vous ferons savoir quand c’est fini.", "updateAvailableAfterRestart": "Redémarrer {0} pour appliquer la dernière mise à jour.", "updateNow": "Mettre à jour maintenant", "commandPalette": "Palette de commandes...", diff --git a/i18n/fra/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThrough.contribution.i18n.json b/i18n/fra/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThrough.contribution.i18n.json index 7969943cfe..271b7dcc1d 100644 --- a/i18n/fra/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThrough.contribution.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThrough.contribution.i18n.json @@ -7,6 +7,5 @@ "Do not edit this file. It is machine generated." ], "walkThrough.editor.label": "Terrain de jeu interactif", - "help": "Aide", - "interactivePlayground": "Terrain de jeu interactif" + "help": "Aide" } \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/services/bulkEdit/electron-browser/bulkEditService.i18n.json b/i18n/fra/src/vs/workbench/services/bulkEdit/electron-browser/bulkEditService.i18n.json new file mode 100644 index 0000000000..64f732e09e --- /dev/null +++ b/i18n/fra/src/vs/workbench/services/bulkEdit/electron-browser/bulkEditService.i18n.json @@ -0,0 +1,13 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "summary.0": "Aucune modification effectuée", + "summary.nm": "{0} modifications de texte effectuées dans {1} fichiers", + "summary.n0": "{0} modifications de texte effectuées dans un fichier", + "conflict": "Ces fichiers ont changé pendant ce temps : {0}" +} \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/services/configuration/common/configurationExtensionPoint.i18n.json b/i18n/fra/src/vs/workbench/services/configuration/common/configurationExtensionPoint.i18n.json index 3b05950f1a..62270102e3 100644 --- a/i18n/fra/src/vs/workbench/services/configuration/common/configurationExtensionPoint.i18n.json +++ b/i18n/fra/src/vs/workbench/services/configuration/common/configurationExtensionPoint.i18n.json @@ -16,6 +16,7 @@ "vscode.extension.contributes.configuration": "Ajoute des paramètres de configuration.", "invalid.title": "'configuration.title' doit être une chaîne", "invalid.properties": "'configuration.properties' doit être un objet", + "invalid.property": "'configuration.property' doit être un objet", "invalid.allOf": "'configuration.allOf' est obsolète et ne doit plus être utilisé. Au lieu de cela, passez plusieurs sections de configuration sous forme de tableau au point de contribution 'configuration'.", "workspaceConfig.folders.description": "Liste des dossiers à être chargés dans l’espace de travail.", "workspaceConfig.path.description": "Un chemin de fichier, par exemple, '/root/folderA' ou './folderA' pour un chemin relatif résolu selon l’emplacement du fichier d’espace de travail.", diff --git a/i18n/fra/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json b/i18n/fra/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json index be89cee605..2e673ecfdf 100644 --- a/i18n/fra/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json +++ b/i18n/fra/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json @@ -11,7 +11,7 @@ "open": "Ouvrir les paramètres", "saveAndRetry": "Enregistrer et Réessayer", "errorUnknownKey": "Impossible d’écrire dans {0} car {1} n’est pas une configuration recommandée.", - "errorInvalidWorkspaceConfigurationApplication": "Impossible d’écrire {0} dans paramètres de l’espace de travail. Ce paramètre peut être écrit uniquement dans les paramètres de l’utilisateur.", + "errorInvalidWorkspaceConfigurationApplication": "Impossible d’écrire {0} dans les paramètres de l’espace de travail. Ce paramètre peut être écrit uniquement dans les paramètres de l’utilisateur.", "errorInvalidFolderConfiguration": "Impossible d’écrire dans les paramètres de dossier parce que {0} ne supporte pas la portée de ressource de dossier.", "errorInvalidUserTarget": "Impossible d’écrire dans les paramètres utilisateur parce que {0} ne supporte pas de portée globale.", "errorInvalidWorkspaceTarget": "Impossible d’écrire dans les paramètres de l’espace de travail car {0} ne supporte pas de portée d’espace de travail dans un espace de travail multi dossiers.", diff --git a/i18n/fra/src/vs/workbench/services/configurationResolver/electron-browser/configurationResolverService.i18n.json b/i18n/fra/src/vs/workbench/services/configurationResolver/electron-browser/configurationResolverService.i18n.json index e5809c2c66..b142f6fc1d 100644 --- a/i18n/fra/src/vs/workbench/services/configurationResolver/electron-browser/configurationResolverService.i18n.json +++ b/i18n/fra/src/vs/workbench/services/configurationResolver/electron-browser/configurationResolverService.i18n.json @@ -6,16 +6,5 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "canNotResolveWorkspaceFolderMultiRoot": "'${workspaceFolder}' ne peut pas être résolu dans un espace de travail de dossiers multiples. Gérer la portée de cette variable en utilisant ':' et un nom de dossier d’espace de travail.", - "canNotResolveWorkspaceFolder": "'${workspaceFolder}' ne peut pas être résolu. Veuillez ouvrir un dossier.", - "canNotResolveFolderBasenameMultiRoot": "'${workspaceFolderBasename}' ne peut pas être résolu dans un espace de travail de dossiers multiples. Gérer la portée de cette variable en utilisant ':' et un nom de dossier d’espace de travail.", - "canNotResolveFolderBasename": "'${workspaceFolderBasename}' ne peut pas être résolu. Veuillez ouvrir un dossier.", - "canNotResolveLineNumber": "'${lineNumber}' ne peut pas être résolu. Veuillez s’il vous plaît ouvrir un éditeur.", - "canNotResolveSelectedText": "'${selectedText}' ne peut pas être résolu. Veuillez s’il vous plaît ouvrir un éditeur.", - "canNotResolveFile": "${file} ne peut pas être résolu. Veuillez s’il vous plaît ouvrir un éditeur.", - "canNotResolveRelativeFile": "${relativeFile} ne peut pas être résolu. Veuillez s’il vous plaît ouvrir un éditeur.", - "canNotResolveFileDirname": "${fileDirname} ne peut pas être résolu. Veuillez s’il vous plaît ouvrir un éditeur.", - "canNotResolveFileExtname": "${fileExtname} ne peut pas être résolu. Veuillez s’il vous plaît ouvrir un éditeur.", - "canNotResolveFileBasename": "${fileBasename} ne peut pas être résolu. Veuillez s’il vous plaît ouvrir un éditeur.", - "canNotResolveFileBasenameNoExtension": "${fileBasenameNoExtension} ne peut pas être résolu. Veuillez s’il vous plaît ouvrir un éditeur." + "stringsOnlySupported": "La commande {0} n’a pas retourné un résultat de chaîne. Seules les chaînes sont prises en charge comme des résultats pour les commandes utilisées pour la substitution des variables." } \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/services/extensions/common/extensionsRegistry.i18n.json b/i18n/fra/src/vs/workbench/services/extensions/common/extensionsRegistry.i18n.json index d368558993..1af7c22c93 100644 --- a/i18n/fra/src/vs/workbench/services/extensions/common/extensionsRegistry.i18n.json +++ b/i18n/fra/src/vs/workbench/services/extensions/common/extensionsRegistry.i18n.json @@ -6,7 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "vscode.extension.engines": "Compatibilité de moteur.", + "vscode.extension.engines": "Moteur de compatibilité.", "vscode.extension.engines.vscode": "Pour les extensions VS Code, spécifie la version de VS Code avec laquelle l'extension est compatible. Ne peut pas être *. Exemple : ^0.10.5 indique une compatibilité avec la version minimale 0.10.5 de VS Code.", "vscode.extension.publisher": "Éditeur de l'extension VS Code.", "vscode.extension.displayName": "Nom d'affichage de l'extension utilisée dans la galerie VS Code.", diff --git a/i18n/fra/src/vs/workbench/services/files/electron-browser/remoteFileService.i18n.json b/i18n/fra/src/vs/workbench/services/files/electron-browser/remoteFileService.i18n.json index ca83618f2f..c684b10ecd 100644 --- a/i18n/fra/src/vs/workbench/services/files/electron-browser/remoteFileService.i18n.json +++ b/i18n/fra/src/vs/workbench/services/files/electron-browser/remoteFileService.i18n.json @@ -6,6 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "invalidPath": "Le chemin d’accès de la ressource '{0}' doit être absolu", "fileNotFoundError": "Fichier introuvable ({0})", "fileIsDirectoryError": "Le fichier est un répertoire", "fileNotModifiedError": "Fichier non modifié depuis", diff --git a/i18n/fra/src/vs/workbench/services/themes/common/fileIconThemeSchema.i18n.json b/i18n/fra/src/vs/workbench/services/themes/common/fileIconThemeSchema.i18n.json index 54f5a1d090..46cefa9b2b 100644 --- a/i18n/fra/src/vs/workbench/services/themes/common/fileIconThemeSchema.i18n.json +++ b/i18n/fra/src/vs/workbench/services/themes/common/fileIconThemeSchema.i18n.json @@ -21,7 +21,7 @@ "schema.languageId": "ID de la définition d'icône de l'association.", "schema.fonts": "Polices utilisées dans les définitions d'icônes.", "schema.id": "ID de la police.", - "schema.src": "Emplacements de la police.", + "schema.src": "L’emplacement de la police.", "schema.font-path": "Chemin de la police, par rapport au fichier de thème d'icône actuel.", "schema.font-format": "Format de la police.", "schema.font-weight": "Poids de la police.", diff --git a/i18n/hun/extensions/configuration-editing/out/extension.i18n.json b/i18n/hun/extensions/configuration-editing/out/extension.i18n.json index 58d5239498..34e2fec39e 100644 --- a/i18n/hun/extensions/configuration-editing/out/extension.i18n.json +++ b/i18n/hun/extensions/configuration-editing/out/extension.i18n.json @@ -6,5 +6,16 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "workspaceFolder": "A VS Code-ban megnyitott mappa elérési útja", + "workspaceFolderBasename": "A VS Code-ban megnyitott mappa neve perjelek (/) nélkül", + "relativeFile": "A jelenleg megnyitott fájl a ${workspaceFolder}-hez relatívan", + "file": "A jelenleg megnyitott fájl", + "cwd": "A feladatfuttató aktuális munkakönyvtára indításkor", + "lineNumber": "A jelenleg kiválasztott sor száma az aktív fájlban", + "selectedText": "A jelenleg kijelölt szöveg az aktív fájlban", + "fileDirname": "A jelenleg megnyitott fájl könyvtárának neve", + "fileExtname": "A jelenleg megnyitott fájl kiterjesztése", + "fileBasename": "A jelenleg kiválasztott fájl neve", + "fileBasenameNoExtension": "A jelenleg kiválasztott fájl neve kiterjesztés nélkül", "exampleExtension": "Példa" } \ No newline at end of file diff --git a/i18n/hun/extensions/git/out/commands.i18n.json b/i18n/hun/extensions/git/out/commands.i18n.json index 3e7a779ae0..affdd78fc1 100644 --- a/i18n/hun/extensions/git/out/commands.i18n.json +++ b/i18n/hun/extensions/git/out/commands.i18n.json @@ -2,7 +2,7 @@ "": [ "--------------------------------------------------------------------------------------------", "Copyright (c) Microsoft Corporation. All rights reserved.", - "Licensed under the Source EULA. See License.txt in the project root for license information.", + "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], @@ -10,10 +10,12 @@ "remote branch at": "Távoli ág, a következőre mutat: {0}", "create branch": "$(plus) Új ág létrehozása", "repourl": "Forráskódtár URL-címe", - "parent": "Szülőkönyvtár", + "selectFolder": "Válassza ki a forráskódtár helyét!", "cloning": "'{0}' git forráskódtár klónozása...", - "openrepo": "Forráskódtár megnyitása", "proposeopen": "Szeretné megnyitni a klónozott forráskódtárat?", + "openrepo": "Forráskódtár megnyitása", + "add": "Hozzáadás a munkaterülethez", + "proposeopen2": "Szeretné megnyitni a klónozott forráskódtára, vagy hozzáadni az aktuális munkaterülethez?", "init": "Válasszon munkaterületi mappát a Git-forráskódtár inicializálásához!", "init repo": "Forráskódtár előkészítése", "create repo": "Forráskódtár előkészítése", diff --git a/i18n/hun/extensions/npm/out/npmView.i18n.json b/i18n/hun/extensions/npm/out/npmView.i18n.json index 90269483e9..b872bf5396 100644 --- a/i18n/hun/extensions/npm/out/npmView.i18n.json +++ b/i18n/hun/extensions/npm/out/npmView.i18n.json @@ -6,6 +6,9 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "npm.noDebugOptions": "A(z) „{0}” nem indítható el hibakereséshez, mert a parancsból hiányzik a node hibakeresési kapcsoló, pl. az „--inspect-brk”.", - "npm.scriptInvalid": "A(z) „{0}” parancs nem található. Frissítse a nézetet!" + "noScripts": "Nem található parancsfájl", + "noDebugOptions": "A(z) „{0}” nem indítható el hibakereséshez, mert a parancsból hiányzik a node hibakeresési kapcsoló, pl. az „--inspect-brk”.", + "learnMore": "További információ", + "ok": "OK", + "scriptInvalid": "A(z) „{0}” parancs nem található. Frissítse a nézetet!" } \ No newline at end of file diff --git a/i18n/hun/extensions/npm/package.i18n.json b/i18n/hun/extensions/npm/package.i18n.json index 79cbd9c9f8..08255b5c47 100644 --- a/i18n/hun/extensions/npm/package.i18n.json +++ b/i18n/hun/extensions/npm/package.i18n.json @@ -12,15 +12,15 @@ "config.npm.runSilent": "Az npm-parancsok a '--silent' kapcsolóval fussanak.", "config.npm.packageManager": "A parancsfájlok futtatásához használt csomagkezelő.", "config.npm.exclude": "Azokat a mappákat leíró globális minta, amelyek ne legyenek vizsgálva az automatikus parancsfájlkeresés közben.", - "config.npm.enableScriptExplorer": "Npm-parancsnézet hozzáadása a Fájlkezelőhöz, ha van „package.json”-fál a munkaterületen.", + "config.npm.enableScriptExplorer": "Npm-parancsokat listázó nézet engedélyezése a Fájlkezelőben.", + "config.npm.scriptExplorerAction": "Az alapértelmezett művelet kattintás esetén a parancsnézeten: „open” a megnyitáshoz vagy „run” a futtatáshoz. Az alapértelmezett érték az „open”.", "npm.parseError": "Npm-feladatok felderítése: nem sikerült beolvasni a következő fájlt: {0}", "taskdef.script": "A testreszabott npm parancsfájl.", - "taskdef.path": "Azon mappa elérési útja, amely a parancsfájlt szolgáltató package.json fájlt tartalmazza. Elhagyható.", + "taskdef.path": "A parancsfájlt szolgáltató package.json-fájlt tartalmazó mappa elérési útja. Elhagyható.", "view.name": "Npm-parancsok", "command.refresh": "Frissítés", "command.run": "Futtatás", "command.debug": "Hibakeresés", "command.openScript": "Megnyitás", - "npm.scriptInvalid": "A(z) „{0}” parancs nem található. Frissítse a nézetet!", - "npm.noDebugOptions": "A(z) „{0}” nem indítható el hibakereséshez, mert a parancsból hiányzik a node hibakeresési kapcsoló, pl. az „--inspect-brk”." + "command.runInstall": "Telepítés futtatása" } \ No newline at end of file diff --git a/i18n/hun/extensions/search-rg/package.i18n.json b/i18n/hun/extensions/search-rg/package.i18n.json new file mode 100644 index 0000000000..9c012ece08 --- /dev/null +++ b/i18n/hun/extensions/search-rg/package.i18n.json @@ -0,0 +1,11 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "displayName": "Keresés (ripgrep)", + "description": "Keresési funkciót szolgáltat a Ripgrep használatával." +} \ No newline at end of file diff --git a/i18n/hun/extensions/typescript-language-features/out/features/updatePathsOnRename.i18n.json b/i18n/hun/extensions/typescript-language-features/out/features/updatePathsOnRename.i18n.json new file mode 100644 index 0000000000..a9b1fe7fb2 --- /dev/null +++ b/i18n/hun/extensions/typescript-language-features/out/features/updatePathsOnRename.i18n.json @@ -0,0 +1,14 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "prompt": "Automatikusan aktualizálva legyenek az áthelyezett fájl importálásai: „{0}”?", + "reject.title": "Nem", + "accept.title": "Igen", + "always.title": "Igen, mindig aktualizálódjanak az importálások", + "never.title": "Nem, soha ne legyenek aktualizálva az importálások" +} \ No newline at end of file diff --git a/i18n/hun/extensions/typescript-language-features/package.i18n.json b/i18n/hun/extensions/typescript-language-features/package.i18n.json index 5ffa7df24e..06a84e6a3a 100644 --- a/i18n/hun/extensions/typescript-language-features/package.i18n.json +++ b/i18n/hun/extensions/typescript-language-features/package.i18n.json @@ -8,8 +8,7 @@ ], "displayName": "TypeScript és JavaScript nyelvi funkciók", "description": "Széleskörű nyelvi támogatás JavaScripthez és TypeScripthez.", - "typescript.reloadProjects.title": "Projekt újratöltése", - "javascript.reloadProjects.title": "Projekt újratöltése", + "reloadProjects.title": "Projekt újratöltése", "configuration.typescript": "TypeScript", "typescript.useCodeSnippetsOnMethodSuggest.dec": "Függvények kiegészítése paraméterdefiníciójukkal.", "typescript.tsdk.desc": "A tsservert és a lib*.d.ts fájlokat tartalmazó mappa elérési útja.", @@ -37,8 +36,7 @@ "format.placeOpenBraceOnNewLineForFunctions": "Meghatározza, hogy a függvények nyitó kapcsos zárójelei új sorba kerüljenek-e vagy sem.", "format.placeOpenBraceOnNewLineForControlBlocks": "Meghatározza, hogy a vezérlőblokkok nyitó kapcsos zárójelei új sorba kerüljenek-e vagy sem.", "javascript.validate.enable": "JavaScript-validálás engedélyezése vagy letiltása.", - "typescript.goToProjectConfig.title": "Projektkonfiguráció megkeresése", - "javascript.goToProjectConfig.title": "Projektkonfiguráció megkeresése", + "goToProjectConfig.title": "Projektkonfiguráció megkeresése", "javascript.referencesCodeLens.enabled": "Referencia kódlencsék engedélyezése vagy letiltása a JavaScript-fájlokban.", "typescript.referencesCodeLens.enabled": "Referencia kódlencsék engedélyezése vagy letiltása a TypeScript-fájlokban. TypeScript >= 2.0.6-ot igényel.", "typescript.implementationsCodeLens.enabled": "Implementációs kódlencsék engedélyezése vagy letiltása. TypeScript >= 2.2.0-t igényel.", @@ -55,11 +53,15 @@ "typescript.problemMatchers.tsc.label": "TypeScript-problémák", "typescript.problemMatchers.tscWatch.label": "TypeScript-problémák (figyelő módban)", "typescript.quickSuggestionsForPaths": "Kiegészítési javaslatok engedélyezése importált elérési utak beírásakor.", - "typescript.locale": "Meghatározza a TypeScript-hibák jelentésénél használt lokalizációt. TypeScript >= 2.6.0-t igényel. Az alapértelmezett 'null' érték esetén a VS Code-ban beállított nyelven jelennek meg a TypeScript-hibák.", + "typescript.locale": "Meghatározza a JavaScript- és TypeScript-hibák lokalizációját. TypeScript >= 2.6.0-t igényel. Az alapértelmezett 'null' érték esetén a VS Code-ban beállított nyelven jelennek meg a JavaScript- és TypeScript-hibák.", "javascript.implicitProjectConfig.experimentalDecorators": " 'experimentalDecorators' beállítás engedélyezése azon JavaScript-fájlok esetében, amelyek nem részei a projektnek. A meglévő jsconfig.json vagy tsconfig.json fájlok felülírják ezt a beállítást. TypeScript >= 2.3.1-et igényel.", "typescript.autoImportSuggestions.enabled": "Automatikus importálási ajánlatok engedélyezése vagy letiltása. TypeScript >= 2.6.1-t igényel.", "typescript.experimental.syntaxFolding": "Szintaxisalapú becsukható kódrészletek engedélyezése vagy letiltása.", "taskDefinition.tsconfig.description": "A tsconfig-fájl, ami meghatározza a TS-buildet.", "javascript.suggestionActions.enabled": "Ajánlásokat tartalmazó diagnosztikák engedélyezése vagy letiltása a JavaScript-fájlokban. TypeScript >= 2.8-at igényel.", - "typescript.suggestionActions.enabled": "Ajánlásokat tartalmazó diagnosztikák engedélyezése vagy letiltása a TypeScript-fájlokban. TypeScript >= 2.8-at igényel." + "typescript.suggestionActions.enabled": "Ajánlásokat tartalmazó diagnosztikák engedélyezése vagy letiltása a TypeScript-fájlokban. TypeScript >= 2.8-at igényel.", + "typescript.preferences.quoteStyle": "A gyorsjavítások során előnyben részesített idézőjelstílus: „single” esetén aposztróf, „double” esetén idézőjel, „auto” esetén pedig a meglévő importálások alapján van meghatározva a stílus. TypeScript >= 2.9-et igényel.", + "typescript.preferences.importModuleSpecifier": "Az automatikus importálások során beszúrt elérési utak stílusa:\n- „relative” esetén relatív elérési út a fájlhoz képest\n- „non-relative” esetén a „jsconfig.json”-ban vagy a „tsconfig.json”-ban megadott „baseUrl” értéke alapján\n- „auto” a legrövidebb elérési utat jelenti.\nTypeScript >= 2.9-et igényel.", + "typescript.showUnused": "Nem használt változók megjelölése a kódban. TypeScript >= 2.9-et igényel.", + "typescript.updateImportsOnFileMove.enabled": "Importálási utak automatikus aktualizálása fájlok átnevezése vagy áthelyezése során. Lehetséges értékek: „prompt” esetén minden átnevezés esetén rákérdez az alkalmazás, „always” esetén az elérési utak automatikusan aktualizálódnak, „never” esetén pedig az elérési utak nem módosulnak, és nem is jelenik meg kérdés ezzel kapcsolatban. TypeScript >= 2.9-et igényel." } \ No newline at end of file diff --git a/i18n/hun/src/vs/base/node/zip.i18n.json b/i18n/hun/src/vs/base/node/zip.i18n.json index 5ef62026cd..7e3be3e1e6 100644 --- a/i18n/hun/src/vs/base/node/zip.i18n.json +++ b/i18n/hun/src/vs/base/node/zip.i18n.json @@ -6,6 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "incompleteExtract": "Hiányos. {0} bejegyzés feldolgozva a(z) {0} bejegyzésből.", + "incompleteExtract": "Hiányos. {0} találat a(z) {0} bejegyzésből", "notFound": "{0} nem található a zipen belül." } \ No newline at end of file diff --git a/i18n/hun/src/vs/code/electron-browser/issue/issueReporterMain.i18n.json b/i18n/hun/src/vs/code/electron-browser/issue/issueReporterMain.i18n.json index 7eed9a3ddf..fcbcdbc54a 100644 --- a/i18n/hun/src/vs/code/electron-browser/issue/issueReporterMain.i18n.json +++ b/i18n/hun/src/vs/code/electron-browser/issue/issueReporterMain.i18n.json @@ -6,17 +6,19 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "hide": "elrejtés", + "show": "megjelenítés", "previewOnGitHub": "Előnézet GitHubon", "loadingData": "Adatok betöltése...", "rateLimited": "GitHub lekérdezési korlát túllépve. Kérem, várjon!", "similarIssues": "Hasonló problémák", - "open": "Megnyitás", - "closed": "Bezárva", + "open": "Nyitott", + "closed": "Lezárt", "noSimilarIssues": "Nincs hasonló probléma", "settingsSearchIssue": "Hiba a beállítások keresőjében", - "bugReporter": "hibát", - "featureRequest": "funkcióigényt", - "performanceIssue": "teljesítményproblémát", + "bugReporter": "hiba", + "featureRequest": "funkcióigény", + "performanceIssue": "teljesítményprobléma", "stepsToReproduce": "A probléma előidézésének lépései", "bugDescription": "Ossza meg a probléma megbízható előidézéséhez szükséges részleteket! Írja le a valós és az elvárt működést! A mezőben GitHub-stílusú markdown használható. A hibajelentés szerkeszthető lesz és képernyőfotók is csatolhatók a githubos előnézetnél.", "performanceIssueDesciption": "Mikor fordult elő ez a teljesítménybeli probléma? Például előfordul indulásnál vagy végre kell hajtani bizonyos műveleteket? A mezőben GitHub-stílusú markdown használható. A hibajelentés szerkeszthető lesz és képernyőfotók is csatolhatók a githubos előnézetnél.", diff --git a/i18n/hun/src/vs/code/electron-browser/issue/issueReporterPage.i18n.json b/i18n/hun/src/vs/code/electron-browser/issue/issueReporterPage.i18n.json index 886cb41d49..bd8c9904cc 100644 --- a/i18n/hun/src/vs/code/electron-browser/issue/issueReporterPage.i18n.json +++ b/i18n/hun/src/vs/code/electron-browser/issue/issueReporterPage.i18n.json @@ -17,13 +17,12 @@ "issueTitleLabel": "Cím", "issueTitleRequired": "Kérjük, adja meg a címet!", "titleLengthValidation": "A cím túl hosszú.", - "systemInfo": "Rendszerinformációk", - "sendData": "Adatok elküldése", - "processes": "Jelenleg futó folyamatok", - "workspaceStats": "Munkaterület-statisztikák", - "extensions": "Kiegészítők", - "searchedExtensions": "Keresett kiegészítők", - "settingsSearchDetails": "Beállításokban való keresés részletei", "details": "Írja le a részleteket!", - "loadingData": "Adatok betöltése..." + "sendSystemInfo": "Rendszerinformációk csatolása ({0})", + "show": "megjelenítés", + "sendProcessInfo": "Jelenleg futó folyamatok listájának csatolása ({0})", + "sendWorkspaceInfo": "Munkaterülettel kapcsolatos metaadatok csatolása ({0})", + "sendExtensions": "Engedélyezett kiegészítők listájának csatolása ({0})", + "sendSearchedExtensions": "Keresett kiegészítők elküldése ({0})", + "sendSettingsSearchDetails": "Beállításokban való keresés részleteinek elküldése ({0})" } \ No newline at end of file diff --git a/i18n/hun/src/vs/code/electron-browser/processExplorer/processExplorerMain.i18n.json b/i18n/hun/src/vs/code/electron-browser/processExplorer/processExplorerMain.i18n.json index 27c0f1d3fc..a1ec017727 100644 --- a/i18n/hun/src/vs/code/electron-browser/processExplorer/processExplorerMain.i18n.json +++ b/i18n/hun/src/vs/code/electron-browser/processExplorer/processExplorerMain.i18n.json @@ -11,5 +11,7 @@ "pid": "folyamatazonosító", "name": "Név", "killProcess": "Folyamat leállítása", - "forceKillProcess": "Folyamat kényszerített leállítása" + "forceKillProcess": "Folyamat kényszerített leállítása", + "copy": "Másolás", + "copyAll": "Összes másolása" } \ No newline at end of file diff --git a/i18n/hun/src/vs/code/electron-main/menus.i18n.json b/i18n/hun/src/vs/code/electron-main/menus.i18n.json index 61e879b21f..4e4f725bc5 100644 --- a/i18n/hun/src/vs/code/electron-main/menus.i18n.json +++ b/i18n/hun/src/vs/code/electron-main/menus.i18n.json @@ -88,7 +88,6 @@ "miToggleDebugConsole": "Hi&&bakeresési konzol", "miToggleIntegratedTerminal": "Beépített term&&inál", "miMarker": "&&Problémák", - "miAdditionalViews": "További &&nézetek", "miCommandPalette": "Paran&&cskatalógus...", "miOpenView": "&&Nézet megnyitása...", "miToggleFullScreen": "&&Teljes képernyő be- és kikapcsolása", @@ -128,10 +127,10 @@ "miGotoFile": "Ugrás &&fájlhoz...", "miGotoSymbolInFile": "Ugrás szim&&bólumhoz egy fájlban...", "miGotoSymbolInWorkspace": "Ugrás szimbólumhoz a &&munkaterületen...", - "miGotoDefinition": "Ugrás a &&definícióra", - "miGotoTypeDefinition": "Ugrás a &&típusdefinícióra", - "miGotoImplementation": "Ugrás az &&implementációra", - "miGotoLine": "&&Sor megkeresáse...", + "miGotoDefinition": "Ugrás a &&definícióhoz", + "miGotoTypeDefinition": "Ugrás a &&típusdefinícióhoz", + "miGotoImplementation": "Ugrás az &&implementációhoz", + "miGotoLine": "Ugrás adott &&sorhoz...", "miStartDebugging": "Hibakeresés indítá&&sa", "miStartWithoutDebugging": "Indítás hibakeresés &&nélkül", "miStopDebugging": "Hibakeresés leállítá&&sa", @@ -144,7 +143,7 @@ "miContinue": "&&Folytatás", "miToggleBreakpoint": "&&Töréspont be- és kikapcsolása", "miConditionalBreakpoint": "Feltételes törés&&pont", - "miColumnBreakpoint": "Töréspont &&oszlopnál", + "miInlineBreakpoint": "S&&orbeli töréspont", "miFunctionBreakpoint": "Töréspont&&funkció...", "miLogPoint": "Nap&&lózási pont...", "miNewBreakpoint": "Ú&&j töréspont", diff --git a/i18n/hun/src/vs/editor/browser/widget/codeEditorWidget.i18n.json b/i18n/hun/src/vs/editor/browser/widget/codeEditorWidget.i18n.json new file mode 100644 index 0000000000..6e1b7fcb7c --- /dev/null +++ b/i18n/hun/src/vs/editor/browser/widget/codeEditorWidget.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "cursors.maximum": "A kurzorok száma legfeljebb {0} lehet." +} \ No newline at end of file diff --git a/i18n/hun/src/vs/editor/common/config/commonEditorConfig.i18n.json b/i18n/hun/src/vs/editor/common/config/commonEditorConfig.i18n.json index 030c8e5246..d8b8281be6 100644 --- a/i18n/hun/src/vs/editor/common/config/commonEditorConfig.i18n.json +++ b/i18n/hun/src/vs/editor/common/config/commonEditorConfig.i18n.json @@ -26,6 +26,7 @@ "detectIndentation": "Fájl megnyitásakor az `editor.tabSize` és az `editor.insertSpaces` értéke a fájl tartalma alapján lesz meghatározva.", "roundedSelection": "Meghatározza, hogy a kijelölések sarkai le legyenek-e kerekítve.", "scrollBeyondLastLine": "Meghatározza, hogy a szerkesztőablak görgethető-e az utolsó sor után.", + "scrollBeyondLastColumn": "Meghatározza, hogy hány extra karakterig görgethető a szerkesztőablak vízszintesen.", "smoothScrolling": "Meghatározza, hogy a szerkesztőablak animálva van-e görgetve.", "minimap.enabled": "Meghatározza, hogy megjelenjen-e a kódtérkép.", "minimap.side": "Meghatározza, hogy melyik oldalon jelenjen meg a kódtérkép.", @@ -41,7 +42,7 @@ "wordWrap.bounded": "A sorok tördelve lesznek a nézetablak szélességének és az `editor.wordWrapColumn` értékének minimumánál.", "wordWrap": "Ez a beállítás meghatározza, hogy a sorok hogyan legyenek tördelve. Lehetséges értékek:\n- 'off' (nincs sortörés)\n- 'on' (sortörés a nézetablakban)\n- 'wordWrapColumn' (sortörés az `editor.wordWrapColumn` oszlopnál) vagy\n- 'bounded' (sortörés az `editor.wordWrapColumn` és a nézetablak minimumánál)", "wordWrapColumn": "Meghatározza a sortöréshez használt oszlopszámot a szerkesztőablakban, ha az `editor.wordWrap` értéke 'wordWrapColumn' vagy 'bounded'.", - "wrappingIndent": "Meghatározza a tördelt sorok behúzását. Értéke 'none', 'same' vagy 'indent' lehet.", + "wrappingIndent": "Meghatározza a tördelt sorok behúzási szabályát. Értéke „none”, „same”, „indent” vagy „deepIndent” lehet.", "mouseWheelScrollSensitivity": "Az egér görgetési eseményeinél keletkező `deltaX` és `deltaY` paraméterek szorzója", "multiCursorModifier.ctrlCmd": "Windows és Linux alatt a `Control`, macOS alatt a `Command` billentyűt jelenti.", "multiCursorModifier.alt": "Windows és Linux alatt az `Alt`, macOS alatt az `Option` billentyűt jelenti.", diff --git a/i18n/hun/src/vs/editor/common/view/editorColorRegistry.i18n.json b/i18n/hun/src/vs/editor/common/view/editorColorRegistry.i18n.json index cfc03a81c0..80bf21807a 100644 --- a/i18n/hun/src/vs/editor/common/view/editorColorRegistry.i18n.json +++ b/i18n/hun/src/vs/editor/common/view/editorColorRegistry.i18n.json @@ -32,6 +32,7 @@ "infoBorder": "Az információkat jelző hullámvonal keretszíne a szerkesztőablakban. ", "hintForeground": "Az utalásokat jelző hullámvonal előtérszíne a szerkesztőablakban.", "hintBorder": "Az utalásokat jelző hullámvonal keretszíne a szerkesztőablakban.", + "unnecessaryForeground": "A szükségtelen kódrészletek előtérszíne a szerkesztőablakban.", "overviewRulerRangeHighlight": "A kiemelt területeket jelölő jelzések színe az áttekintősávon. A színnek áttetszőnek kell lennie, hogy ne fedje el az alatta lévő dekorátorokat.", "overviewRuleError": "A hibákat jelölő jelzések színe az áttekintősávon.", "overviewRuleWarning": "A figyelmeztetéseket jelölő jelzések színe az áttekintősávon.", diff --git a/i18n/hun/src/vs/editor/contrib/fontZoom/fontZoom.i18n.json b/i18n/hun/src/vs/editor/contrib/fontZoom/fontZoom.i18n.json new file mode 100644 index 0000000000..1d9d72367a --- /dev/null +++ b/i18n/hun/src/vs/editor/contrib/fontZoom/fontZoom.i18n.json @@ -0,0 +1,12 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "EditorFontZoomIn.label": "Szerkesztőablak betűtípusának nagyítása", + "EditorFontZoomOut.label": "Szerkesztőablak betűtípusának kicsinyítése", + "EditorFontZoomReset.label": "Szerkesztőablak betűtípusának visszaállítása" +} \ No newline at end of file diff --git a/i18n/hun/src/vs/editor/contrib/goToDefinition/goToDefinitionCommands.i18n.json b/i18n/hun/src/vs/editor/contrib/goToDefinition/goToDefinitionCommands.i18n.json new file mode 100644 index 0000000000..5211668b11 --- /dev/null +++ b/i18n/hun/src/vs/editor/contrib/goToDefinition/goToDefinitionCommands.i18n.json @@ -0,0 +1,25 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "noResultWord": "Nem található a(z) '{0}' definíciója", + "generic.noResults": "Definíció nem található", + "meta.title": " – {0} definíció", + "actions.goToDecl.label": "Ugrás a definícióra", + "actions.goToDeclToSide.label": "Definíció megnyitása oldalt", + "actions.previewDecl.label": "Betekintés a definícióba", + "goToImplementation.noResultWord": "Nem található a(z) '{0}' implementációja", + "goToImplementation.generic.noResults": "Implementáció nem található", + "meta.implementations.title": " – {0} implementáció", + "actions.goToImplementation.label": "Ugrás az implementációra", + "actions.peekImplementation.label": "Betekintés az implementációba", + "goToTypeDefinition.noResultWord": "Nem található a(z) '{0}' típusdefiníciója", + "goToTypeDefinition.generic.noResults": "Típusdefiníció nem található", + "meta.typeDefinitions.title": " – {0} típusdefiníció", + "actions.goToTypeDefinition.label": "Ugrás a típusdefinícióra", + "actions.peekTypeDefinition.label": "Betekintés a típusdefinícióba" +} \ No newline at end of file diff --git a/i18n/hun/src/vs/editor/contrib/goToDefinition/goToDefinitionMouse.i18n.json b/i18n/hun/src/vs/editor/contrib/goToDefinition/goToDefinitionMouse.i18n.json new file mode 100644 index 0000000000..814c36ccbf --- /dev/null +++ b/i18n/hun/src/vs/editor/contrib/goToDefinition/goToDefinitionMouse.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "multipleResults": "Kattintson {0} definíció megjelenítéséhez." +} \ No newline at end of file diff --git a/i18n/hun/src/vs/editor/contrib/gotoError/gotoError.i18n.json b/i18n/hun/src/vs/editor/contrib/gotoError/gotoError.i18n.json index 6a568875bd..8c41b5b3b1 100644 --- a/i18n/hun/src/vs/editor/contrib/gotoError/gotoError.i18n.json +++ b/i18n/hun/src/vs/editor/contrib/gotoError/gotoError.i18n.json @@ -7,5 +7,7 @@ "Do not edit this file. It is machine generated." ], "markerAction.next.label": "Következő probléma (hiba, figyelmeztetés, információ)", - "markerAction.previous.label": "Előző probléma (hiba, figyelmeztetés, információ)" + "markerAction.previous.label": "Előző probléma (hiba, figyelmeztetés, információ)", + "markerAction.nextInFiles.label": "Következő probléma a fájlokban (hiba, figyelmeztetés, információ)", + "markerAction.previousInFiles.label": "Előző probléma a fájlokban (hiba, figyelmeztetés, információ)" } \ No newline at end of file diff --git a/i18n/hun/src/vs/editor/contrib/indentation/indentation.i18n.json b/i18n/hun/src/vs/editor/contrib/indentation/indentation.i18n.json index cdc40b4259..ad547cd5a0 100644 --- a/i18n/hun/src/vs/editor/contrib/indentation/indentation.i18n.json +++ b/i18n/hun/src/vs/editor/contrib/indentation/indentation.i18n.json @@ -13,5 +13,6 @@ "indentUsingTabs": "Indentálás tabulátorral", "indentUsingSpaces": "Indentálás szóközzel", "detectIndentation": "Indentálás felismerése a tartalom alapján", - "editor.reindentlines": "Sorok újraindentálása" + "editor.reindentlines": "Sorok újraindentálása", + "editor.reindentselectedlines": "Kijelölt sorok újraindentálása " } \ No newline at end of file diff --git a/i18n/hun/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json b/i18n/hun/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json index 2c206b7274..4e39213a98 100644 --- a/i18n/hun/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json +++ b/i18n/hun/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json @@ -25,8 +25,6 @@ "uninstallDependeciesConfirmation": "Csak a(z) '{0}' kiegészítőt szeretné eltávolítani vagy annak függőségeit is?", "uninstallOnly": "Csak a kiegészítőt", "uninstallAll": "Az összes eltávolítása", - "uninstallConfirmation": "Biztosan szeretné eltávolítani a(z) '{0}' kiegészítőt?", - "ok": "OK", "singleDependentError": "Nem sikerült eltávolítani a(z) '{0}' kiegészítőt: a(z) '{1}' kiegészítő függ tőle.", "twoDependentsError": "Nem sikerült eltávolítani a(z) '{0}' kiegészítőt: a(z) '{1}' és '{2}' kiegészítők függnek tőle.", "multipleDependentsError": "Nem sikerült eltávolítani a(z) '{0}' kiegészítőt: a(z) '{1}', '{2}' és más kiegészítők függnek tőle.", diff --git a/i18n/hun/src/vs/platform/node/minimalTranslations.i18n.json b/i18n/hun/src/vs/platform/node/minimalTranslations.i18n.json new file mode 100644 index 0000000000..012bbf8dda --- /dev/null +++ b/i18n/hun/src/vs/platform/node/minimalTranslations.i18n.json @@ -0,0 +1,13 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "showLanguagePackExtensions": "A VS Code elérhető {0} nyelven. Keresse meg a nyelvi csomagot a piactéren a használatához!", + "searchMarketplace": "Keresés a piactéren", + "installAndRestartMessage": "A VS Code elérhető {0} nyelven, melyet a nyelvi csomag telepítése után aktiválhat. A telepítés után újraindítás szükséges.", + "installAndRestart": "Telepítés és újraindítás" +} \ No newline at end of file diff --git a/i18n/hun/src/vs/platform/theme/common/colorRegistry.i18n.json b/i18n/hun/src/vs/platform/theme/common/colorRegistry.i18n.json index 8338f95df0..5e728fe1e0 100644 --- a/i18n/hun/src/vs/platform/theme/common/colorRegistry.i18n.json +++ b/i18n/hun/src/vs/platform/theme/common/colorRegistry.i18n.json @@ -16,7 +16,7 @@ "selectionBackground": "A munkaterületen kijelölt szövegek háttérszíne (pl. beviteli mezők vagy szövegmezők esetén). Ez a beállítás nem vonatkozik a szerkesztőablakban végzett kijelölésekre. ", "textSeparatorForeground": "A szövegelválasztók színe.", "textLinkForeground": "A szövegben található hivatkozások előtérszíne.", - "textLinkActiveForeground": "A szövegben található aktív hivatkozások előtérszíne.", + "textLinkActiveForeground": "A szövegben található hivatkozások előtérszíne kattintás esetén és ha az egér fölötte van.", "textPreformatForeground": "Az előformázott szövegrészek előtérszíne.", "textBlockQuoteBackground": "A szövegben található idézetblokkok háttérszíne.", "textBlockQuoteBorder": "A szövegben található idézetblokkok keretszíne.", @@ -48,6 +48,8 @@ "listDropBackground": "A lista/fa háttérszíne, amikor az elemek az egérkurzorral vannak mozgatva egyik helyről a másikra.", "highlight": "Kiemelt találatok előtérszíne a listában/fában való keresés esetén.", "invalidItemForeground": "A lista/fa előtérszíne érvénytelen elemek esetén, például még nem feloldott gyökérelemek esetében a fájlkezelőben.", + "listErrorForeground": "A hibákat tartalmazó listaelemek előtérszíne.", + "listWarningForeground": "A figyelmeztetéseket tartalmazó listaelemek előtérszíne.", "pickerGroupForeground": "Csoportcímkék színe a gyorsválasztóban.", "pickerGroupBorder": "Csoportok keretszíne a gyorsválasztóban.", "buttonForeground": "A gombok előtérszíne.", @@ -58,7 +60,7 @@ "scrollbarShadow": "A görgetősáv árnyéka, ami jelzi, hogy a nézet el van görgetve.", "scrollbarSliderBackground": "A görgetősáv csúszkájának háttérszíne.", "scrollbarSliderHoverBackground": "A görgetősáv csúszkájának háttérszíne, ha az egérkurzor fölötte van.", - "scrollbarSliderActiveBackground": "A görgetősáv csúszkájának háttérszíne, ha aktív.", + "scrollbarSliderActiveBackground": "A görgetősáv csúszkájának háttérszíne, ha rákattintanak.", "progressBarBackground": "A hosszú ideig tartó folyamatok esetén megjelenített folyamatjelző háttérszíne.", "editorBackground": "A szerkesztőablak háttérszíne.", "editorForeground": "A szerkesztőablak alapértelmezett előtérszíne.", @@ -75,6 +77,7 @@ "editorFindMatchBorder": "A keresés jelenlegi találatának keretszíne.", "findMatchHighlightBorder": "A keresés további találatainak keretszíne.", "findRangeHighlightBorder": "A keresést korlátozó terület keretszíne. A színnek áttetszőnek kell lennie, hogy ne fedje el az alatta lévő dekorátorokat.", + "findWidgetResizeBorder": "A keresőmodul átméretezősávjának keretszíne.", "hoverHighlight": "Kiemelés azon szó alatt, amely fölött lebegő elem jelenik meg. A színnek áttetszőnek kell lennie, hogy ne fedje el az alatta lévő dekorátorokat.", "hoverBackground": "A szerkesztőablakban lebegő elemek háttérszíne.", "hoverBorder": "A szerkesztőablakban lebegő elemek keretszíne.", diff --git a/i18n/hun/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.i18n.json b/i18n/hun/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.i18n.json index f6bafd3286..4669c26ac4 100644 --- a/i18n/hun/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.i18n.json +++ b/i18n/hun/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.i18n.json @@ -6,5 +6,5 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "confirmUrl": "Szeretné engedélyezni a(z) {0} kiegészítő számára a következő URL-cím megnyitását?" + "confirmUrl": "Engedélyezi a hivatkozás megnyitásást egy kiegészítő számára?" } \ No newline at end of file diff --git a/i18n/hun/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json b/i18n/hun/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json index 215c70faf9..1635f0d479 100644 --- a/i18n/hun/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json +++ b/i18n/hun/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json @@ -12,7 +12,6 @@ "vscode.extension.contributes.viewsContainers": "Nézetgyűjteményeket szolgáltat a szerkesztőhöz", "views.container.activitybar": "Nézetgyűjteményeket szolgáltat a tevékenységsávra", "test": "Teszt", - "proposed": "A 'viewsContainers' csak a fejlesztői változatban vagy az --enable-proposed-api {1} kapcsoló használata esetén érhető el.", "requirearray": "a nézetgyűjteményeket tömbként kell megadni", "requireidstring": "a(z) `{0}` tulajdonság kötelező és `string` típusúnak kell lennie. Csak alfanumerikus karaktereket, alulvonást és kötőjelet tartalmazhat.", "requirestring": "a(z) `{0}` tulajdonság kötelező és `string` típusúnak kell lennie", diff --git a/i18n/hun/src/vs/workbench/browser/actions/workspaceActions.i18n.json b/i18n/hun/src/vs/workbench/browser/actions/workspaceActions.i18n.json index 54d534a31a..e3eb39c98b 100644 --- a/i18n/hun/src/vs/workbench/browser/actions/workspaceActions.i18n.json +++ b/i18n/hun/src/vs/workbench/browser/actions/workspaceActions.i18n.json @@ -15,5 +15,5 @@ "saveWorkspace": "Munkaterület mentése", "openWorkspaceAction": "Munkaterület megnyitása...", "openWorkspaceConfigFile": "Munkaterület konfigurációs fájljának megnyitása", - "openFolderAsWorkspaceInNewWindow": "Mappa megnyitása munkaterületként egy új ablakban" + "duplicateWorkspaceInNewWindow": "Munkaterület megnyitása egy új ablakban" } \ No newline at end of file diff --git a/i18n/hun/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json b/i18n/hun/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json index 17a1a32799..529014bd03 100644 --- a/i18n/hun/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json +++ b/i18n/hun/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json @@ -16,7 +16,7 @@ "screenReaderDetected": "Képernyőolvasóra optimalizálva", "screenReaderDetectedExtra": "Ha nem használ képernyőolvasót, állítsa az `editor.accessibilitySupport` értékét \"off\"-ra.", "disableTabMode": "Kisegítő mód letiltása", - "gotoLine": "Sor megkeresése", + "gotoLine": "Ugrás adott sorhoz", "selectIndentation": "Indentálás kiválasztása", "selectEncoding": "Kódolás kiválasztása", "selectEOL": "Sorvégjel kiválasztása", diff --git a/i18n/hun/src/vs/workbench/browser/parts/panel/panelPart.i18n.json b/i18n/hun/src/vs/workbench/browser/parts/panel/panelPart.i18n.json index 2f6ff416be..7c465c6891 100644 --- a/i18n/hun/src/vs/workbench/browser/parts/panel/panelPart.i18n.json +++ b/i18n/hun/src/vs/workbench/browser/parts/panel/panelPart.i18n.json @@ -1,8 +1,10 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the Source EULA. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ -// Do not edit this file. It is machine generated. { - "panelSwitcherBarAriaLabel": "Az aktív panel váltása" + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "hidePanel": "Panel elrejtése" } \ No newline at end of file diff --git a/i18n/hun/src/vs/workbench/browser/parts/quickopen/quickOpenController.i18n.json b/i18n/hun/src/vs/workbench/browser/parts/quickopen/quickOpenController.i18n.json index 5047d431ce..cb65091fed 100644 --- a/i18n/hun/src/vs/workbench/browser/parts/quickopen/quickOpenController.i18n.json +++ b/i18n/hun/src/vs/workbench/browser/parts/quickopen/quickOpenController.i18n.json @@ -6,8 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "inputModeEntryDescription": "{0} (Nyomjon 'Enter'-t a megerősítéshez vagy 'Escape'-et a megszakításhoz)", - "inputModeEntry": "Nyomjon 'Enter'-t a megerősítéshez vagy 'Escape'-et a megszakításhoz", "emptyPicks": "Nincs választható elem", "quickOpenInput": "A végrehajtható műveletek körét a ? karakter beírásával tekintheti meg", "historyMatches": "legutóbb megnyitott", diff --git a/i18n/hun/src/vs/workbench/browser/parts/quickopen/quickopen.i18n.json b/i18n/hun/src/vs/workbench/browser/parts/quickopen/quickopen.i18n.json index 62a7d352f0..82dda6455d 100644 --- a/i18n/hun/src/vs/workbench/browser/parts/quickopen/quickopen.i18n.json +++ b/i18n/hun/src/vs/workbench/browser/parts/quickopen/quickopen.i18n.json @@ -6,7 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "quickOpen": "File megkeresése...", + "quickOpen": "Ugrás fájlhoz...", "quickNavigateNext": "Ugrás a következőre a fájlok gyors megnyitásánál", "quickNavigatePrevious": "Ugrás az előzőre a fájlok gyors megnyitásánál", "quickSelectNext": "Következő kiválasztása a fájlok gyors megnyitásánál", diff --git a/i18n/hun/src/vs/workbench/browser/parts/views/viewsViewlet.i18n.json b/i18n/hun/src/vs/workbench/browser/parts/views/viewsViewlet.i18n.json index eaee6ecfaf..669cca494c 100644 --- a/i18n/hun/src/vs/workbench/browser/parts/views/viewsViewlet.i18n.json +++ b/i18n/hun/src/vs/workbench/browser/parts/views/viewsViewlet.i18n.json @@ -6,5 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "cannot toggle": "Nem módosítható a(z) {0} nézet láthatósága", + "cannot show": "A(z) {0} nézetet nem lehet megjeleníteni, mert el van rejtve a 'when' feltétele miatt.", "hideView": "Elrejtés" } \ No newline at end of file diff --git a/i18n/hun/src/vs/workbench/common/theme.i18n.json b/i18n/hun/src/vs/workbench/common/theme.i18n.json index c43fb6ff8e..101629ce77 100644 --- a/i18n/hun/src/vs/workbench/common/theme.i18n.json +++ b/i18n/hun/src/vs/workbench/common/theme.i18n.json @@ -11,8 +11,10 @@ "tabHoverBackground": "A fülek háttérszíne amikor az egérkurzor fölöttük van. A fülek tartalmazzák a szerkesztőterületen lévő szerkesztőablakokat. Egy szerkesztőablak-csoportban több fül is megnyitható. Több szerkesztőablak-csoportot is létre lehet hozni.", "tabUnfocusedHoverBackground": "A fülek háttérszíne egy fókusz nélküli csoportban, amikor az egérkurzor fölötte van. A fülek tartalmazzák a szerkesztőterületen lévő szerkesztőablakokat. Egy szerkesztőablak-csoportban több fül is megnyitható. Több szerkesztőablak-csoportot is létre lehet hozni.", "tabBorder": "A füleket egymástól elválasztó keret színe. A fülek tartalmazzák a szerkesztőterületen lévő szerkesztőablakokat. Egy szerkesztőablak-csoportban több fül is megnyitható. Több szerkesztőablak-csoportot is létre lehet hozni.", - "tabActiveBorder": "Az aktív fülek kiemelésére használt keret színe. A fülek tartalmazzák a szerkesztőterületen lévő szerkesztőablakokat. Egy szerkesztőablak-csoportban több fül is megnyitható. Több szerkesztőablak-csoportot is létre lehet hozni.", - "tabActiveUnfocusedBorder": "Az aktív fülek kiemelésére használt keret színe egy fókusz nélküli csoportban. A fülek tartalmazzák a szerkesztőterületen lévő szerkesztőablakokat. Egy szerkesztőablak-csoportban több fül is megnyitható. Több szerkesztőablak-csoportot is létre lehet hozni.", + "tabActiveBorder": "Az aktív fülek aljának keretszíne. A fülek tartalmazzák a szerkesztőablakokat a szerkesztőterületen. Egy szerkesztőablak-csoportban több fül is megnyitható. Több szerkesztőablak-csoportot is létre lehet hozni.", + "tabActiveBorderTop": "Az aktív fülek tetejének keretszíne. A fülek tartalmazzák a szerkesztőablakokat a szerkesztőterületen. Egy szerkesztőablak-csoportban több fül is megnyitható. Több szerkesztőablak-csoportot is létre lehet hozni.", + "tabActiveUnfocusedBorder": "Az aktív fülek aljának keretszíne egy fókusz nélküli csoportban. A fülek tartalmazzák a szerkesztőablakokat a szerkesztőterületen. Egy szerkesztőablak-csoportban több fül is megnyitható. Több szerkesztőablak-csoportot is létre lehet hozni. ", + "tabActiveUnfocusedBorderTop": "Az aktív fülek tetejének keretszíne egy fókusz nélküli csoportban. A fülek tartalmazzák a szerkesztőablakokat a szerkesztőterületen. Egy szerkesztőablak-csoportban több fül is megnyitható. Több szerkesztőablak-csoportot is létre lehet hozni.", "tabHoverBorder": "A fülek kiemelésére használt keret színe amikor az egérkurzor fölöttük van. A fülek tartalmazzák a szerkesztőterületen lévő szerkesztőablakokat. Egy szerkesztőablak-csoportban több fül is megnyitható. Több szerkesztőablak-csoportot is létre lehet hozni.", "tabUnfocusedHoverBorder": "A fülek kiemelésére használt keret színe egy fókusz nélküli csoportban, amikor az egérkurzor fölöttük van. A fülek tartalmazzák a szerkesztőterületen lévő szerkesztőablakokat. Egy szerkesztőablak-csoportban több fül is megnyitható. Több szerkesztőablak-csoportot is létre lehet hozni.", "tabActiveForeground": "Az aktív fül előtérszíne az aktív csoportban. A fülek tartalmazzák a szerkesztőterületen lévő szerkesztőablakokat. Egy szerkesztőablak-csoportban több fül is megnyitható. Több szerkesztőablak-csoportot is létre lehet hozni.", diff --git a/i18n/hun/src/vs/workbench/parts/codeEditor/electron-browser/largeFileOptimizations.i18n.json b/i18n/hun/src/vs/workbench/parts/codeEditor/electron-browser/largeFileOptimizations.i18n.json new file mode 100644 index 0000000000..ee6f1bfb86 --- /dev/null +++ b/i18n/hun/src/vs/workbench/parts/codeEditor/electron-browser/largeFileOptimizations.i18n.json @@ -0,0 +1,13 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "largeFile": "{0}: ebben a nagy fájlban a memóriahasználat csökketése érdekében és a fagyások, valamint összeomlások megelőzése érdekében ki van kapcsolva a tokenizálás, a sortörés és a kódrészletek bezárása.", + "neverShowAgain": "Rendben. Soha ne jelenjen meg újra", + "removeOptimizations": "Funkciók engedélyezése mindenképp", + "reopenFilePrompt": "Nyissa meg újra a fájlt a beállítás érvénybe lépéséhez!" +} \ No newline at end of file diff --git a/i18n/hun/src/vs/workbench/parts/debug/browser/debugActions.i18n.json b/i18n/hun/src/vs/workbench/parts/debug/browser/debugActions.i18n.json index 69d784bbd3..0479163d4a 100644 --- a/i18n/hun/src/vs/workbench/parts/debug/browser/debugActions.i18n.json +++ b/i18n/hun/src/vs/workbench/parts/debug/browser/debugActions.i18n.json @@ -41,7 +41,7 @@ "debugConsoleAction": "Hibakeresési konzol", "unreadOutput": "Új kimenet a hibakeresési konzolban", "debugFocusConsole": "Váltás a hibakeresési konzolra", - "focusProcess": "Váltás a folyamatra", + "focusSession": "Váltás munkamenetre", "stepBackDebug": "Visszalépés", "reverseContinue": "Visszafordítás" } \ No newline at end of file diff --git a/i18n/hun/src/vs/workbench/parts/debug/browser/debugCommands.i18n.json b/i18n/hun/src/vs/workbench/parts/debug/browser/debugCommands.i18n.json index 335890b7be..990fe1c931 100644 --- a/i18n/hun/src/vs/workbench/parts/debug/browser/debugCommands.i18n.json +++ b/i18n/hun/src/vs/workbench/parts/debug/browser/debugCommands.i18n.json @@ -7,7 +7,7 @@ "Do not edit this file. It is machine generated." ], "noFolderDebugConfig": "Fejlettebb hibakeresési konfigurációk használatához nyisson meg egy mappát!", - "columnBreakpoint": "Oszloptöréspont", + "inlineBreakpoint": "Sorbeli töréspont", "debug": "Hibakeresés", - "addColumnBreakpoint": "Oszloptöréspont hozzáadása" + "addInlineBreakpoint": "Sorbeli töréspont hozzáadása" } \ No newline at end of file diff --git a/i18n/hun/src/vs/workbench/parts/debug/browser/debugEditorActions.i18n.json b/i18n/hun/src/vs/workbench/parts/debug/browser/debugEditorActions.i18n.json index 51c172cb0e..56577453f9 100644 --- a/i18n/hun/src/vs/workbench/parts/debug/browser/debugEditorActions.i18n.json +++ b/i18n/hun/src/vs/workbench/parts/debug/browser/debugEditorActions.i18n.json @@ -12,5 +12,7 @@ "runToCursor": "Futtatás a kurzorig", "debugEvaluate": "Hibakeresés: Kiértékelés", "debugAddToWatch": "Hibakeresés: Hozzáadás a figyelőlistához", - "showDebugHover": "Hibakeresés: Súgószöveg megjelenítése" + "showDebugHover": "Hibakeresés: Súgószöveg megjelenítése", + "goToNextBreakpoint": "Hibakeresés: Ugrás a következő töréspontra", + "goToPreviousBreakpoint": "Hibakeresés: Ugrás az előző töréspontra" } \ No newline at end of file diff --git a/i18n/hun/src/vs/workbench/parts/debug/browser/debugViewlet.i18n.json b/i18n/hun/src/vs/workbench/parts/debug/browser/debugViewlet.i18n.json index 460773f69f..989a746eef 100644 --- a/i18n/hun/src/vs/workbench/parts/debug/browser/debugViewlet.i18n.json +++ b/i18n/hun/src/vs/workbench/parts/debug/browser/debugViewlet.i18n.json @@ -6,6 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "startAdditionalSession": "Újabb munkamenet indítása", "debugFocusVariablesView": "Váltás a változókra", "debugFocusWatchView": "Váltás a figyelőlistára", "debugFocusCallStackView": "Váltás a hívási veremre", diff --git a/i18n/hun/src/vs/workbench/parts/debug/common/debugSchemas.i18n.json b/i18n/hun/src/vs/workbench/parts/debug/common/debugSchemas.i18n.json new file mode 100644 index 0000000000..6d734793e9 --- /dev/null +++ b/i18n/hun/src/vs/workbench/parts/debug/common/debugSchemas.i18n.json @@ -0,0 +1,38 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "vscode.extension.contributes.debuggers": "Hibakeresési illesztőket szolgáltat.", + "vscode.extension.contributes.debuggers.type": "A hibakeresési illesztő egyedi azonosítója.", + "vscode.extension.contributes.debuggers.label": "A hibakeresési illesztő megjelenített neve.", + "vscode.extension.contributes.debuggers.program": "A hibakeresési illesztő program elérési útja. Az elérési út lehet abszolút vagy relatív a kiegészítő mappájához képest.", + "vscode.extension.contributes.debuggers.args": "Az illesztő számára átadott argumentumok.", + "vscode.extension.contributes.debuggers.runtime": "Kiegészítő futtatókörnyezet arra az esetre, ha a program attribútum nem egy futtatható fájl, és futtatókörnyezetre van szüksége.", + "vscode.extension.contributes.debuggers.runtimeArgs": "Kiegészítő argumentumok a futtatókörnyezet számára.", + "vscode.extension.contributes.debuggers.variables": "A `launch.json`-ban található interaktív változók (pl. ${action.pickProcess}) hozzárendelése parancsokhoz.", + "vscode.extension.contributes.debuggers.initialConfigurations": "Konfigurációk a 'launch.json' első változatának elkészítéséhez.", + "vscode.extension.contributes.debuggers.languages": "Azon nyelvek listája, amelyeknél ez a hibakeresési kiegészítő alapértelmezett hibakeresőnek tekinthető.", + "vscode.extension.contributes.debuggers.adapterExecutableCommand": "Ha meg van adva, a VS Code ezt a parancsot fogja hívni a hibakeresési illesztő futtatható állománya elérési útjának és az átadandó argumentumok meghatározásához.", + "vscode.extension.contributes.debuggers.configurationSnippets": "Kódtöredékek új 'launch.json'-konfigurációk hozzáadásához.", + "vscode.extension.contributes.debuggers.configurationAttributes": "JSON-sémakonfigurációk a 'launch.json' validálásához.", + "vscode.extension.contributes.debuggers.windows": "Windows-specifikus beállítások.", + "vscode.extension.contributes.debuggers.windows.runtime": "A Windows által használt futtatókörnyezet.", + "vscode.extension.contributes.debuggers.osx": "macOS-specifikus beállítások.", + "vscode.extension.contributes.debuggers.osx.runtime": "A macOS által használt futtatókörnyezet.", + "vscode.extension.contributes.debuggers.linux": "Linux-specifikus beállítások.", + "vscode.extension.contributes.debuggers.linux.runtime": "A Linux által használt futtatókörnyezet.", + "vscode.extension.contributes.breakpoints": "Töréspontokat szolgáltat.", + "vscode.extension.contributes.breakpoints.language": "Töréspontok engedélyezése ennél a nyelvnél.", + "app.launch.json.title": "Indítás", + "app.launch.json.version": "A fájlformátum verziója.", + "app.launch.json.configurations": "A konfigurációk listája. Új konfigurációk hozzáadhatók vagy a meglévők szerkeszthetők az IntelliSense használatával.", + "app.launch.json.compounds": "A kombinációk listája. Minden kombináció több konfigurációt hivatkozik meg, melyek együtt indulnak el.", + "app.launch.json.compound.name": "A kombináció neve. Az indítási konfiguráció lenyíló menüjében jelenik meg.", + "useUniqueNames": "Használjon egyedi konfigurációs neveket!", + "app.launch.json.compound.folder": "A mappa neve, ahol az összetett konfiguráció található.", + "app.launch.json.compounds.configurations": "Azon konfigurációk neve, melyek elindulnak ezen kombináció részeként." +} \ No newline at end of file diff --git a/i18n/hun/src/vs/workbench/parts/debug/electron-browser/callStackView.i18n.json b/i18n/hun/src/vs/workbench/parts/debug/electron-browser/callStackView.i18n.json index 163c977fa0..07962576a7 100644 --- a/i18n/hun/src/vs/workbench/parts/debug/electron-browser/callStackView.i18n.json +++ b/i18n/hun/src/vs/workbench/parts/debug/electron-browser/callStackView.i18n.json @@ -9,7 +9,7 @@ "callstackSection": "Hívási verem szakasz", "debugStopped": "Szüneteltetve a következő helyen: {0}", "callStackAriaLabel": "Hibakeresési hívási verem", - "process": "Folyamat", + "session": "Munkamenet", "paused": "Szüneteltetve", "running": "Fut", "thread": "Szál", diff --git a/i18n/hun/src/vs/workbench/parts/debug/electron-browser/debug.contribution.i18n.json b/i18n/hun/src/vs/workbench/parts/debug/electron-browser/debug.contribution.i18n.json index d1906df253..18975657d8 100644 --- a/i18n/hun/src/vs/workbench/parts/debug/electron-browser/debug.contribution.i18n.json +++ b/i18n/hun/src/vs/workbench/parts/debug/electron-browser/debug.contribution.i18n.json @@ -21,11 +21,12 @@ "allowBreakpointsEverywhere": "Bármelyik fájlban helyezhető el töréspont", "openExplorerOnEnd": "Hibakeresési munkamenet végén automatikusan nyíljon meg a fájlkezelő nézet", "inlineValues": "Változók értékének megjelenítése a sorok között hibakeresés közben", - "hideActionBar": "Meghatározza, hogy megjelenjen-e a lebegő hibakeresési műveletsáv", + "toolBarLocation": "Meghatározza a hibakeresési eszköztár típusát: „float” esetén lebeg az összes nézet fölött, „docked” esetén rögzítve van a hibakeresési nézeten, „none” esetén pedig el van rejtve.", "never": "Soha ne jelenjen meg a hibakeresés az állapotsoron", "always": "Mindig jelenjen meg a hibakeresés az állapotsoron", "onFirstSessionStart": "A hibakeresés csak akkor jelenjen meg az állapotsoron, miután először el lett indítva a hibakeresés", "showInStatusBar": "Meghatározza, hogy megjelenjen-e a hibakeresési állapotsáv", "openDebug": "Meghatározza, hogy megnyíljon-e a hibakeresési modul a hibakeresési munkamenet indulásakor.", + "enableAllHovers": "Meghatározza, hogy megjelenjenek-e a nem hibakereséshez tartozó súgószövegek hibakeresés közben. Ha az értéke igaz, a súgószöveg-szolgáltatóktól el lesznek kérve a súgószövegek. A sima súgószövegek még ebben az esetben sem jelennek meg.", "launch": "Globális hibakeresés indítási konfiguráció. Használható a 'launch.json' alternatívájaként, ami meg van osztva több munkaterület között" } \ No newline at end of file diff --git a/i18n/hun/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.i18n.json b/i18n/hun/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.i18n.json index c859982a0f..0b01afbdb0 100644 --- a/i18n/hun/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.i18n.json +++ b/i18n/hun/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.i18n.json @@ -6,35 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "vscode.extension.contributes.debuggers": "Hibakeresési illesztőket szolgáltat.", - "vscode.extension.contributes.debuggers.type": "A hibakeresési illesztő egyedi azonosítója.", - "vscode.extension.contributes.debuggers.label": "A hibakeresési illesztő megjelenített neve.", - "vscode.extension.contributes.debuggers.program": "A hibakeresési illesztő program elérési útja. Az elérési út lehet abszolút vagy relatív a kiegészítő mappájához képest.", - "vscode.extension.contributes.debuggers.args": "Az illesztő számára átadott argumentumok.", - "vscode.extension.contributes.debuggers.runtime": "Kiegészítő futtatókörnyezet arra az esetre, ha a program attribútum nem egy futtatható fájl, és futtatókörnyezetre van szüksége.", - "vscode.extension.contributes.debuggers.runtimeArgs": "Kiegészítő argumentumok a futtatókörnyezet számára.", - "vscode.extension.contributes.debuggers.variables": "A `launch.json`-ban található interaktív változók (pl. ${action.pickProcess}) hozzárendelése parancsokhoz.", - "vscode.extension.contributes.debuggers.initialConfigurations": "Konfigurációk a 'launch.json' első változatának elkészítéséhez.", - "vscode.extension.contributes.debuggers.languages": "Azon nyelvek listája, amelyeknél ez a hibakeresési kiegészítő alapértelmezett hibakeresőnek tekinthető.", - "vscode.extension.contributes.debuggers.adapterExecutableCommand": "Ha meg van adva, a VS Code ezt a parancsot fogja hívni a hibakeresési illesztő futtatható állománya elérési útjának és az átadandó argumentumok meghatározásához.", - "vscode.extension.contributes.debuggers.configurationSnippets": "Kódtöredékek új 'launch.json'-konfigurációk hozzáadásához.", - "vscode.extension.contributes.debuggers.configurationAttributes": "JSON-sémakonfigurációk a 'launch.json' validálásához.", - "vscode.extension.contributes.debuggers.windows": "Windows-specifikus beállítások.", - "vscode.extension.contributes.debuggers.windows.runtime": "A Windows által használt futtatókörnyezet.", - "vscode.extension.contributes.debuggers.osx": "macOS-specifikus beállítások.", - "vscode.extension.contributes.debuggers.osx.runtime": "A macOS által használt futtatókörnyezet.", - "vscode.extension.contributes.debuggers.linux": "Linux-specifikus beállítások.", - "vscode.extension.contributes.debuggers.linux.runtime": "A Linux által használt futtatókörnyezet.", - "vscode.extension.contributes.breakpoints": "Töréspontokat szolgáltat.", - "vscode.extension.contributes.breakpoints.language": "Töréspontok engedélyezése ennél a nyelvnél.", - "app.launch.json.title": "Indítás", - "app.launch.json.version": "A fájlformátum verziója.", - "app.launch.json.configurations": "A konfigurációk listája. Új konfigurációk hozzáadhatók vagy a meglévők szerkeszthetők az IntelliSense használatával.", - "app.launch.json.compounds": "A kombinációk listája. Minden kombináció több konfigurációt hivatkozik meg, melyek együtt indulnak el.", - "app.launch.json.compound.name": "A kombináció neve. Az indítási konfiguráció lenyíló menüjében jelenik meg.", - "useUniqueNames": "Használjon egyedi konfigurációs neveket!", - "app.launch.json.compound.folder": "A mappa neve, ahol az összetett konfiguráció található.", - "app.launch.json.compounds.configurations": "Azon konfigurációk neve, melyek elindulnak ezen kombináció részeként.", "debugNoType": "A hibakereső 'type' tulajdonsága kötelező, és 'string' típusúnak kell lennie.", "selectDebug": "Környezet kiválasztása", "DebugConfig.failed": "Nem sikerült létrehozni a 'launch.json' fájlt a '.vscode' mappánan ({0}).", diff --git a/i18n/hun/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json b/i18n/hun/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json index 4fbade7183..5f50f84692 100644 --- a/i18n/hun/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json +++ b/i18n/hun/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json @@ -13,15 +13,15 @@ "disableBreakpoint": "{0} letiltása", "enableBreakpoint": "{0} engedélyezése", "removeBreakpoints": "Töréspontok eltávolítása", - "removeBreakpointOnColumn": "{0}. oszlopban található töréspont eltávolítása", + "removeInlineBreakpointOnColumn": "{0}. oszlopban található sorbeli töréspont eltávolítása", "removeLineBreakpoint": "Sorra vonatkozó töréspont eltávolítása", "editBreakpoints": "Töréspontok szerkesztése", - "editBreakpointOnColumn": "{0}. oszlopban található töréspont szerkesztése", + "editInlineBreakpointOnColumn": "{0}. oszlopban található sorbeli töréspont szerkesztése", "editLineBrekapoint": "Sorra vonatkozó töréspont szerkesztése", "enableDisableBreakpoints": "Töréspontok engedélyezése/letiltása", - "disableColumnBreakpoint": "{0}. oszlopban található töréspont letiltása", + "disableInlineColumnBreakpoint": "{0}. oszlopban található sorbeli töréspont letiltása", "disableBreakpointOnLine": "Sorszintű töréspont letiltása", - "enableBreakpoints": "{0}. oszlopban található töréspont engedélyezése", + "enableBreakpoints": "{0}. oszlopban található sorbeli töréspont engedélyezése", "enableBreakpointOnLine": "Sorszintű töréspont engedélyezése", "addBreakpoint": "Töréspont hozzáadása", "addConditionalBreakpoint": "Feltételes töréspont hozzáadása...", diff --git a/i18n/hun/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.i18n.json b/i18n/hun/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.i18n.json index 70f8aa798f..c93d639320 100644 --- a/i18n/hun/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.i18n.json +++ b/i18n/hun/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.i18n.json @@ -16,9 +16,13 @@ "repository": "Forráskódtár", "license": "Licenc", "details": "Részletek", + "detailstooltip": "A kiegészítő leírása, a kiegészítő „README.md” fájljának tartalma alapján", "contributions": "Szolgáltatások", + "contributionstooltip": "Listázza azokat a szolgáltatásokat, amelyekkel a kiegészítő bővíti a VS Code-ot", "changelog": "Változtatási napló", + "changelogtooltip": "A kiegészítő frissítési előzményei, a kiegészítő „CHANGELOG.md” fájljának tartalma alapján", "dependencies": "Függőségek", + "dependenciestooltip": "A kiegészítő függőségeinek listája", "noReadme": "Leírás nem található.", "noChangelog": "Változtatási napló nem található.", "noContributions": "Nincsenek szolgáltatások", @@ -30,6 +34,10 @@ "debuggers": "Hibakeresők ({0})", "debugger name": "Név", "debugger type": "Típus", + "viewContainers": "Nézetgyűjtemények ({0})", + "view container id": "Azonosító", + "view container title": "Cím", + "view container location": "Hol?", "views": "Nézetek ({0})", "view id": "Azonosító", "view name": "Név", diff --git a/i18n/hun/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json b/i18n/hun/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json index b399013642..9846b60f6b 100644 --- a/i18n/hun/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json +++ b/i18n/hun/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json @@ -8,7 +8,6 @@ ], "neverShowAgain": "Ne jelenítse meg újra", "searchMarketplace": "Keresés a piactéren", - "showLanguagePackExtensions": "A piactéren található olyan kiegészítő, ami lefordítja a VS Code-ot '{0}' nyelvre", "dynamicWorkspaceRecommendation": "Ez a kiegészítő lehet, hogy érdekelni fogja, mert népszerű a(z) {0} forráskódtár felhasználói körében.", "exeBasedRecommendation": "Ez a kiegészítő azért ajánlott, mert a következő telepítve van: {0}.", "fileBasedRecommendation": "Ez a kiegészítő a közelmúltban megnyitott fájlok alapján ajánlott.", diff --git a/i18n/hun/src/vs/workbench/parts/extensions/node/extensionsWorkbenchService.i18n.json b/i18n/hun/src/vs/workbench/parts/extensions/node/extensionsWorkbenchService.i18n.json index a93dcd0c19..3ee9613f1c 100644 --- a/i18n/hun/src/vs/workbench/parts/extensions/node/extensionsWorkbenchService.i18n.json +++ b/i18n/hun/src/vs/workbench/parts/extensions/node/extensionsWorkbenchService.i18n.json @@ -10,12 +10,12 @@ "malicious": "Jelezték, hogy a kiegészítőt problémás.", "installingMarketPlaceExtension": "Kiegészítő telepítése a piactérről...", "uninstallingExtension": "Kiegészítő eltávolítása...", - "enableDependeciesConfirmation": "A(z) '{0}' engedélyezésével annak függőségei is engedélyezve lesznek. Szeretné folytatni?", + "enableDependeciesConfirmation": "A kiegészítő engedélyezésével annak függőségei is engedélyezve lesznek. Szeretné folytatni?", "enable": "Igen", "doNotEnable": "Nem", - "disableDependeciesConfirmation": "Csak a(z) '{0}' kiegészítőt szeretné letiltani vagy annak függőségeit is?", - "disableOnly": "Csak ezt", - "disableAll": "Az összeset", + "disableDependeciesConfirmation": "A kiegészítő függőségeit is szeretné letiltani?", + "yes": "Igen", + "no": "Nem", "cancel": "Mégse", "singleDependentError": "Nem sikerült letiltani a(z) '{0}' kiegészítőt: a(z) '{1}' kiegészítő függ tőle.", "twoDependentsError": "Nem sikerült letiltani a(z) '{0}' kiegészítőt: a(z) '{1}' és '{2}' kiegészítők függnek tőle.", diff --git a/i18n/hun/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json b/i18n/hun/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json index 77357bf5a2..3892a03d69 100644 --- a/i18n/hun/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json +++ b/i18n/hun/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json @@ -65,7 +65,6 @@ "emptyFileNameError": "Meg kell adni egy fájl vagy mappa nevét.", "fileNameStartsWithSlashError": "A fájlok és mappák neve nem kezdődhet perjellel.", "fileNameExistsError": "Már létezik **{0}** nevű fájl vagy mappa ezen a helyszínen. Adjon meg egy másik nevet!", - "fileUsedAsFolderError": "A(z) **{0}** egy fájl, és nem rendelkezhet alelemekkel.", "invalidFileNameError": "A(z) **{0}** név nem érvényes fájl- vagy mappanév. Adjon meg egy másik nevet!", "filePathTooLongError": "A(z) **{0}** név egy olyan elérési utat eredményez, ami túl hosszú. Adjon meg egy másik nevet!", "compareWithClipboard": "Aktív fájl összehasonlítása a vágólap tartalmával", diff --git a/i18n/hun/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.i18n.json b/i18n/hun/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.i18n.json index fbc4f5faee..8d361d6890 100644 --- a/i18n/hun/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.i18n.json +++ b/i18n/hun/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.i18n.json @@ -7,6 +7,7 @@ "Do not edit this file. It is machine generated." ], "updateLocale": "Szeretné a VS Code felületét {0} nyelvűre állítani és újraindítani az alkalmazást?", + "activateLanguagePack": "Szeretné újraindítani a VS Code-ot a telepített nyelvi csomag aktiválásához?", "yes": "Igen", "no": "Nem", "neverAgain": "Ne jelenítse meg újra", diff --git a/i18n/hun/src/vs/workbench/parts/localizations/electron-browser/localizationsActions.i18n.json b/i18n/hun/src/vs/workbench/parts/localizations/electron-browser/localizationsActions.i18n.json index 8181e5ce9e..c598672a28 100644 --- a/i18n/hun/src/vs/workbench/parts/localizations/electron-browser/localizationsActions.i18n.json +++ b/i18n/hun/src/vs/workbench/parts/localizations/electron-browser/localizationsActions.i18n.json @@ -6,7 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "configureLocale": "Nyelv beállítása", + "configureLocale": "Megjelenítési nyelv beállítása", "displayLanguage": "Meghatározza a VSCode felületének nyelvét.", "doc": "Az elérhető nyelvek listája a következő címen tekinthető meg: {0}", "restart": "Az érték módosítása után újra kell indítani a VSCode-ot.", diff --git a/i18n/hun/src/vs/workbench/parts/outline/electron-browser/outline.contribution.i18n.json b/i18n/hun/src/vs/workbench/parts/outline/electron-browser/outline.contribution.i18n.json new file mode 100644 index 0000000000..a52e10c8b1 --- /dev/null +++ b/i18n/hun/src/vs/workbench/parts/outline/electron-browser/outline.contribution.i18n.json @@ -0,0 +1,12 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "name": "Vázlat", + "category.focus": "Fájl", + "label.focus": "Váltás a vázlatra" +} \ No newline at end of file diff --git a/i18n/hun/src/vs/workbench/parts/outline/electron-browser/outlinePanel.i18n.json b/i18n/hun/src/vs/workbench/parts/outline/electron-browser/outlinePanel.i18n.json new file mode 100644 index 0000000000..24d2f7be0c --- /dev/null +++ b/i18n/hun/src/vs/workbench/parts/outline/electron-browser/outlinePanel.i18n.json @@ -0,0 +1,17 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "filter": "Szűrés", + "collapse": "Összes bezárása", + "sortByPosition": "Rendezés pozíció szerint", + "sortByName": "Rendezés név szerint", + "sortByKind": "Rendezés típus szerint", + "live": "Kurzor követése", + "no-editor": "Nincs vázlattal rendelkező szerkesztőablak nyitva.", + "too-many-symbols": "Sajnáljuk, de a fájl túl nagy a vázlat megjelenítéséhez." +} \ No newline at end of file diff --git a/i18n/hun/src/vs/workbench/parts/outline/electron-browser/outlineTree.i18n.json b/i18n/hun/src/vs/workbench/parts/outline/electron-browser/outlineTree.i18n.json new file mode 100644 index 0000000000..4651ccb188 --- /dev/null +++ b/i18n/hun/src/vs/workbench/parts/outline/electron-browser/outlineTree.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "outline.title": "{0}. sor a következő helyen: {1}" +} \ No newline at end of file diff --git a/i18n/hun/src/vs/workbench/parts/output/browser/outputPanel.i18n.json b/i18n/hun/src/vs/workbench/parts/output/browser/outputPanel.i18n.json index 28868ab738..2256609c67 100644 --- a/i18n/hun/src/vs/workbench/parts/output/browser/outputPanel.i18n.json +++ b/i18n/hun/src/vs/workbench/parts/output/browser/outputPanel.i18n.json @@ -6,6 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "output": "Kimenet", "outputPanelWithInputAriaLabel": "{0}, kimenetpanel", "outputPanelAriaLabel": "Kimenetpanel" } \ No newline at end of file diff --git a/i18n/hun/src/vs/workbench/parts/preferences/browser/keybindingWidgets.i18n.json b/i18n/hun/src/vs/workbench/parts/preferences/browser/keybindingWidgets.i18n.json index 40f01e9cbd..0407dacda3 100644 --- a/i18n/hun/src/vs/workbench/parts/preferences/browser/keybindingWidgets.i18n.json +++ b/i18n/hun/src/vs/workbench/parts/preferences/browser/keybindingWidgets.i18n.json @@ -6,6 +6,8 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "defineKeybinding.oneExists": "1 másik parancshoz ez a billentyűparancs van rendelve", + "defineKeybinding.existing": "{0} másik parancshoz ez a billentyűparancs van rendelve", "defineKeybinding.initial": "Üsse le a kívánt billentyűkombinációt, majd nyomja meg az ENTER-t.", "defineKeybinding.chordsTo": "kombináció a következőhöz:" } \ No newline at end of file diff --git a/i18n/hun/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json b/i18n/hun/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json index e1ac486072..db44bd40ca 100644 --- a/i18n/hun/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json +++ b/i18n/hun/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json @@ -7,6 +7,7 @@ "Do not edit this file. It is machine generated." ], "openRawDefaultSettings": "Nyers alapértelmezett beállítások megnyitása", + "openSettings2": "Beállítások megnyitása (előzetes verzió)", "openSettings": "Beállítások megnyitása", "openGlobalSettings": "Felhasználói beállítások megnyitása", "openGlobalKeybindings": "Billentyűparancsok megnyitása", diff --git a/i18n/hun/src/vs/workbench/parts/preferences/browser/settingsEditor2.i18n.json b/i18n/hun/src/vs/workbench/parts/preferences/browser/settingsEditor2.i18n.json new file mode 100644 index 0000000000..18d6c84cfb --- /dev/null +++ b/i18n/hun/src/vs/workbench/parts/preferences/browser/settingsEditor2.i18n.json @@ -0,0 +1,18 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "previewWarning": "Betekintő", + "previewLabel": "Ez az új beállításszerkesztő előzetes verziója.", + "SearchSettings.AriaLabel": "Beállítások keresése", + "SearchSettings.Placeholder": "Beállítások keresése", + "advancedCustomizationLabel": "További, haladó testreszabáshoz nyissa meg és szerkessze a következő fájlt:", + "openSettingsLabel": "settings.json", + "showOverriddenOnly": "Csak a módosítottak jelenjenek meg", + "treeAriaLabel": "Beállítások", + "feedbackButtonLabel": "Visszajelzés küldése" +} \ No newline at end of file diff --git a/i18n/hun/src/vs/workbench/parts/preferences/browser/settingsTree.i18n.json b/i18n/hun/src/vs/workbench/parts/preferences/browser/settingsTree.i18n.json new file mode 100644 index 0000000000..7b0f71712e --- /dev/null +++ b/i18n/hun/src/vs/workbench/parts/preferences/browser/settingsTree.i18n.json @@ -0,0 +1,19 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "modifiedItemForeground": "A módosított beállítások előtérszíne.", + "workspace": "Munkaterület", + "user": "Felhasználói", + "resetButtonTitle": "visszaállítás", + "configured": "Módosítva", + "alsoConfiguredIn": "A következő helyen is be van állítva:", + "configuredIn": "A következő helyen be van állítva:", + "editInSettingsJson": "Szerkesztés a settings.jsonban", + "settingRowAriaLabel": "{0} {1}, beállítás", + "groupRowAriaLabel": "{0}, csoport" +} \ No newline at end of file diff --git a/i18n/hun/src/vs/workbench/parts/preferences/electron-browser/preferences.contribution.i18n.json b/i18n/hun/src/vs/workbench/parts/preferences/electron-browser/preferences.contribution.i18n.json index 8f44650670..e8cac93425 100644 --- a/i18n/hun/src/vs/workbench/parts/preferences/electron-browser/preferences.contribution.i18n.json +++ b/i18n/hun/src/vs/workbench/parts/preferences/electron-browser/preferences.contribution.i18n.json @@ -7,6 +7,7 @@ "Do not edit this file. It is machine generated." ], "defaultPreferencesEditor": "Alapértelmezett beállításszerkesztő", + "settingsEditor2": "Beállításszerkesztő 2", "keybindingsEditor": "Billentyűparancs-szerkesztő", "preferences": "Beállítások" } \ No newline at end of file diff --git a/i18n/hun/src/vs/workbench/parts/quickopen/browser/gotoLineHandler.i18n.json b/i18n/hun/src/vs/workbench/parts/quickopen/browser/gotoLineHandler.i18n.json index be342667db..4cb7b0d294 100644 --- a/i18n/hun/src/vs/workbench/parts/quickopen/browser/gotoLineHandler.i18n.json +++ b/i18n/hun/src/vs/workbench/parts/quickopen/browser/gotoLineHandler.i18n.json @@ -6,11 +6,11 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "gotoLine": "Sor megkeresése...", + "gotoLine": "Ugrás adott sorhoz...", "gotoLineLabelEmptyWithLimit": "Adja meg a keresett sor számát 1 és {0} között!", "gotoLineLabelEmpty": "Adja meg a keresett sor számát!", "gotoLineColumnLabel": "Ugrás a(z) {0}. sor {1}. oszlopára", - "gotoLineLabel": "Sor megkeresése {0}", + "gotoLineLabel": "Ugrás a(z) {0}. sorra", "gotoLineHandlerAriaLabel": "Adja meg a keresett sor számát!", - "cannotRunGotoLine": "Sor megkereséséhez nyisson meg egy fájlt" + "cannotRunGotoLine": "Sorra ugráshoz nyisson meg egy szövegfájlt!" } \ No newline at end of file diff --git a/i18n/hun/src/vs/workbench/parts/quickopen/browser/gotoSymbolHandler.i18n.json b/i18n/hun/src/vs/workbench/parts/quickopen/browser/gotoSymbolHandler.i18n.json index f748d825f8..4fbaf7c185 100644 --- a/i18n/hun/src/vs/workbench/parts/quickopen/browser/gotoSymbolHandler.i18n.json +++ b/i18n/hun/src/vs/workbench/parts/quickopen/browser/gotoSymbolHandler.i18n.json @@ -32,5 +32,5 @@ "noSymbolsFound": "Szimbólum nem található", "gotoSymbolHandlerAriaLabel": "Írjon az aktív szerkesztőablakban található szimbólumok szűréséhez.", "cannotRunGotoSymbolInFile": "Ehhez a fájlhoz nincs szimbóluminformáció", - "cannotRunGotoSymbol": "Szimbólum megkereséséhez nyisson meg egy szövegfájlt" + "cannotRunGotoSymbol": "Szimbólumra ugráshoz nyisson meg egy szövegfájlt!" } \ No newline at end of file diff --git a/i18n/hun/src/vs/workbench/parts/quickopen/browser/quickopen.contribution.i18n.json b/i18n/hun/src/vs/workbench/parts/quickopen/browser/quickopen.contribution.i18n.json index ea01177702..7955f17bf1 100644 --- a/i18n/hun/src/vs/workbench/parts/quickopen/browser/quickopen.contribution.i18n.json +++ b/i18n/hun/src/vs/workbench/parts/quickopen/browser/quickopen.contribution.i18n.json @@ -8,10 +8,10 @@ ], "view": "Nézet", "commandsHandlerDescriptionDefault": "Parancsok megjelenítése és futtatása", - "gotoLineDescriptionMac": "Sor megkeresése", - "gotoLineDescriptionWin": "Sor megkeresése", + "gotoLineDescriptionMac": "Ugrás adott sorhoz", + "gotoLineDescriptionWin": "Ugrás adott sorhoz", "gotoSymbolDescription": "Ugrás szimbólumhoz egy fájlban...", - "gotoSymbolDescriptionScoped": "Szimbólum megkeresése kategória alapján", + "gotoSymbolDescriptionScoped": "Ugrás szimbólumhoz egy fájlban kategória alapján", "helpDescription": "Súgó megjelenítése", "viewPickerDescription": "Nézet megnyitása" } \ No newline at end of file diff --git a/i18n/hun/src/vs/workbench/parts/search/browser/searchActions.i18n.json b/i18n/hun/src/vs/workbench/parts/search/browser/searchActions.i18n.json index b85c223ebb..a1c8c51b07 100644 --- a/i18n/hun/src/vs/workbench/parts/search/browser/searchActions.i18n.json +++ b/i18n/hun/src/vs/workbench/parts/search/browser/searchActions.i18n.json @@ -12,6 +12,8 @@ "previousSearchExcludePattern": "Előző kizáró keresési minta megjelenítése", "nextSearchTerm": "Következő keresőkifejezés megjelenítése", "previousSearchTerm": "Előző keresőkifejezés megjelenítése", + "nextReplaceTerm": "Következő keresési cserekifejezés megjelenítése", + "previousReplaceTerm": "Előző keresési cserekifejezés megjelenítése", "findInFiles": "Keresés a fájlokban", "replaceInFiles": "Csere a fájlokban", "RefreshAction.label": "Frissítés", diff --git a/i18n/hun/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json b/i18n/hun/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json index d9c23b4c9e..1439e6263a 100644 --- a/i18n/hun/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json +++ b/i18n/hun/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json @@ -14,13 +14,13 @@ "toggleSearchViewPositionLabel": "Keresőnézet helyzetének váltása", "findInFolder": "Keresés mappában...", "findInWorkspace": "Keresés a munkaterületen...", - "showTriggerActions": "Szimbólum megkeresése a munkaterületen...", + "showTriggerActions": "Ugrás szimbólumhoz a munkaterületen...", "name": "Keresés", "showSearchViewl": "Keresés megjelenítése", "view": "Nézet", "findInFiles": "Keresés a fájlokban", - "openAnythingHandlerDescription": "Fájl megkeresése", - "openSymbolDescriptionNormal": "Szimbólum megkeresése a munkaterületen", + "openAnythingHandlerDescription": "Ugrás fájlhoz", + "openSymbolDescriptionNormal": "Ugrás szimbólumhoz a munkaterületen", "searchConfigurationTitle": "Keresés", "exclude": "Fájlok és mappák keresésből való kizárására szolgáló globális minták. Örökli az összes globális mintát a fliex.exclude beállításból.", "exclude.boolean": "A globális minta, amire illesztve lesznek a fájlok elérési útjai. A minta engedélyezéséhez vagy letiltásához állítsa igaz vagy hamis értékre.", @@ -31,5 +31,5 @@ "search.followSymlinks": "Meghatározza, hogy keresés során követve legyenek-e a szimbolikus linkek.", "search.smartCase": "Figyelmen kívül hagyja a kis- és nagybetűket, ha a minta csak kisbetűkből áll, ellenkező esetben kis- és nagybetűérzékenyen keres", "search.globalFindClipboard": "Meghatározza, hogy a keresőmodul olvassa és módosítsa-e a megosztott keresési vágólapot macOS-en.", - "search.location": "Meghatározza, hogy a keresés az oldalsávon jelenik meg vagy egy panelként a panelterületen, mely utóbbi esetén több hely van vízszintesen. A következő kiadásban a panel megjelenése optimalizálva lesz a vízszintes megjelenítéshez, és a funkció nem lesz előzetes." + "search.location": "Meghatározza, hogy a keresés az oldalsávon jelenik meg vagy egy panelként a panelterületen, mely utóbbi esetén több vízszintes hely áll rendelkezésre." } \ No newline at end of file diff --git a/i18n/hun/src/vs/workbench/parts/tasks/electron-browser/jsonSchema_v2.i18n.json b/i18n/hun/src/vs/workbench/parts/tasks/electron-browser/jsonSchema_v2.i18n.json index f098beb323..437926560c 100644 --- a/i18n/hun/src/vs/workbench/parts/tasks/electron-browser/jsonSchema_v2.i18n.json +++ b/i18n/hun/src/vs/workbench/parts/tasks/electron-browser/jsonSchema_v2.i18n.json @@ -28,6 +28,7 @@ "JsonSchema.tasks.group.none": "A feladatot egyetlen csoporthoz sem rendeli", "JsonSchema.tasks.group": "Meghatározza a feladat végrehajtási csoportját. A \"build\" esetén a buildelési csoportba, a \"test\" esetén a tesztelési csoportba kerül bele a feladat.", "JsonSchema.tasks.type": "Meghatározza, hogy a feladat folyamatként van-e végrehajtva vagy egy parancsként a shellben.", + "JsonSchema.commandArray": "A végrehajtandó shell-parancs. A tömb elemei szóközzel elválasztva lesznek egymás után fűzve.", "JsonSchema.command.quotedString.value": "A parancs tényleges értéke", "JsonSchema.tasks.quoting.escape": "A karaktereket a shell saját feloldókarakterével oldja fel (pl. PowerShell alatt a `, míg bash alatt a \\ karakterrel).", "JsonSchema.tasks.quoting.strong": "Az argumentumot a shell erős idézőjel-karakterével veszi körül (pl. PowerShell és bash alatt a \" karakterrel). ", diff --git a/i18n/hun/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.i18n.json b/i18n/hun/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.i18n.json index ac12f205e1..a4201e0c7e 100644 --- a/i18n/hun/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.i18n.json +++ b/i18n/hun/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.i18n.json @@ -2,7 +2,7 @@ "": [ "--------------------------------------------------------------------------------------------", "Copyright (c) Microsoft Corporation. All rights reserved.", - "Licensed under the Source EULA. See License.txt in the project root for license information.", + "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], @@ -10,7 +10,7 @@ "dependencyFailed": "Nem sikerült feloldani a(z) '{0}' függő feladatot a(z) '{1}' munkaterületi mappában", "TerminalTaskSystem.terminalName": "Feladat – {0}", "closeTerminal": "A folytatáshoz nyomjon meg egy billentyűt.", - "reuseTerminal": "A terminál újra lesz hasznosítva a feladatok által. Nyomjon meg egy billentyűt a bezáráshoz.", + "reuseTerminal": "A terminál fel lesz használva egy másik feladathoz. A bezáráshoz nyomjon meg egy billentyűt!", "TerminalTaskSystem": "Rendszerparancsok nem hajthatók végre UNC-meghajtókon a cmd.exe használata esetén.", "unkownProblemMatcher": "A(z) {0} problémaillesztő nem található. Az illesztő figyelmen kívül lesz hagyva." } \ No newline at end of file diff --git a/i18n/hun/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.i18n.json b/i18n/hun/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.i18n.json index e7e3af2a8e..f897d6147c 100644 --- a/i18n/hun/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.i18n.json +++ b/i18n/hun/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.i18n.json @@ -19,6 +19,7 @@ "terminal.integrated.copyOnSelection": "Ha be van kapcsolva, a terminálban kijelölt szöveg a vágólapra lesz másolva.", "terminal.integrated.fontFamily": "Meghatározza a terminál betűtípusát. Alapértelmezett értéke az editor.fontFamily értéke.", "terminal.integrated.fontSize": "Meghatározza a terminálban használt betű méretét, pixelekben.", + "terminal.integrated.letterSpacing": "Meghatározza a terminál betűközét. Értéke egy szám, ami meghatározza, hogy további hány pixel legyen a karakterek között.", "terminal.integrated.lineHeight": "Meghatározza a terminál sormagasságát. A tényleges méret a megadott szám és a terminál betűméretének szorzatából jön ki.", "terminal.integrated.fontWeight": "A nem félkövér szöveg esetén használt betűvastagság a terminálban.", "terminal.integrated.fontWeightBold": "A félkövér szöveg esetén használt betűvastagság a terminálban.", @@ -26,7 +27,8 @@ "terminal.integrated.cursorStyle": "Meghatározza a terminál kurzorának stílusát.", "terminal.integrated.scrollback": "Meghatározza, hogy a terminál legfeljebb hány sort tárol a pufferben.", "terminal.integrated.setLocaleVariables": "Meghatározza, hogy a lokálváltozók be vannak-e állítva a terminál indításánál. Alapértelmezett értéke igaz OS X-en, hamis más platformokon.", - "terminal.integrated.rightClickBehavior": "Meghatározza, hogy a terminál hogyan reagál a jobb kattintásra. Lehetséges értékek: 'default', 'copyPaste' és 'selectWord'. 'default' esetén megjelenik a helyi menü, 'copyPaste' esetén másolja a kijelölt szöveget, ha van, egyébként beilleszt, 'selectWord' esetén pedig kijelöli a kurzor alatti szót és megjeleníti a helyi menüt.", + "terminal.integrated.rendererType": "Meghatározza, hogy melyik módszerrel van kirajzolva a terminál: a „canvas” esetén az alap (gyors) canvas-alapú megjelenítővel, míg „dom” esetén a tartalék DOM-alapú megjelenítővel. Az „auto” esetén a VS Code megpróbálja kitalálni, melyik módszer lesz hatékonyabb. Az érték módosítása után újra kell tölteni a VS Code-ot, hogy az új terminálokban érvénybe lépjen a beállítás.", + "terminal.integrated.rightClickBehavior": "Meghatározza, hogy a terminál milyen műveletet hajt végre jobb kattintás esetén. Lehetséges értékek: „default”, „copyPaste” és „selectWord”. „default” esetén megjelenik a helyi menü, „copyPaste” esetén másolja a kijelölt szöveget vagy beilleszt, „selectWord” esetén pedig kijelöli a kurzor alatti szót és megjeleníti a helyi menüt.", "terminal.integrated.cwd": "Explicit elérési út, ahol a terminál indítva lesz. Ez a shellfolyamat munkakönyvtára (cwd) lesz. Ez a beállítás nagyon hasznos olyan munkaterületeken, ahol a gyökérkönyvtár nem felel meg munkakönyvtárnak.", "terminal.integrated.confirmOnExit": "Az alkalmazás kérjen-e megerősítést kilépéskor, ha van aktív terminál-munkafolyamat.", "terminal.integrated.enableBell": "Meghatározza, hogy engedélyezve van-e a csengő a terminálba.", diff --git a/i18n/hun/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json b/i18n/hun/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json index 96b8edc4ec..94f67fff4b 100644 --- a/i18n/hun/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json +++ b/i18n/hun/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json @@ -57,5 +57,7 @@ "workbench.action.terminal.scrollToPreviousCommand": "Görgetés az előző parancshoz", "workbench.action.terminal.scrollToNextCommand": "Görgetés a következő parancshoz", "workbench.action.terminal.selectToPreviousCommand": "Előző parancs kiválasztása", - "workbench.action.terminal.selectToNextCommand": "Következő parancs kiválasztása" + "workbench.action.terminal.selectToNextCommand": "Következő parancs kiválasztása", + "workbench.action.terminal.selectToPreviousLine": "Kijelölés az előző sorig", + "workbench.action.terminal.selectToNextLine": "Kijelölés a következő sorig" } \ No newline at end of file diff --git a/i18n/hun/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.i18n.json b/i18n/hun/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.i18n.json index 4ad98c231e..0ae0900230 100644 --- a/i18n/hun/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.i18n.json +++ b/i18n/hun/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.i18n.json @@ -9,6 +9,11 @@ "terminal.integrated.a11yBlankLine": "Üres sor", "terminal.integrated.a11yPromptLabel": "Terminál bemenet", "terminal.integrated.a11yTooMuchOutput": "Túl sok felolvasásra váró kimenet, navigáljon a sorokhoz manuálisan a felolvasáshoz!", + "yes": "Igen", + "terminal.rendererInAllNewTerminals": "Az összes új terminál nem GPU-alapú kirajzolást fog használni.", + "no": "Nem", + "dontShowAgain": "Ne jelenítse meg újra", + "terminal.slowRendering": "Úgy tűnik, hogy az integrált terminál alapértelmezett kirajzolására szolgáló motorja lassú ezen a számítógépen. Szeretne váltani az alternatív, DOM-alapú kirajzolóra, amely javíthat a teljesítményen? [További információ a terminál beállításairól](https://code.visualstudio.com/docs/editor/integrated-terminal#_changing-how-the-terminal-is-rendered).", "terminal.integrated.copySelection.noSelection": "A terminálban nincs semmi kijelölve a másoláshoz", "terminal.integrated.exitedWithCode": "A terminálfolyamat a következő kilépési kóddal állt le: {0}", "terminal.integrated.waitOnExit": "A folytatáshoz nyomjon meg egy billentyűt...", diff --git a/i18n/hun/src/vs/workbench/parts/terminal/electron-browser/terminalPanel.i18n.json b/i18n/hun/src/vs/workbench/parts/terminal/electron-browser/terminalPanel.i18n.json index 5d7d55ef4c..851331861c 100644 --- a/i18n/hun/src/vs/workbench/parts/terminal/electron-browser/terminalPanel.i18n.json +++ b/i18n/hun/src/vs/workbench/parts/terminal/electron-browser/terminalPanel.i18n.json @@ -6,6 +6,8 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "terminal.useMonospace": "'monospace' használata", + "terminal.monospaceOnly": "A terminál csak fix szélességű betűtípusokat támogat.", "copy": "Másolás", "split": "Kettéosztás", "paste": "Beillesztés", diff --git a/i18n/hun/src/vs/workbench/parts/trust/electron-browser/unsupportedWorkspaceSettings.contribution.i18n.json b/i18n/hun/src/vs/workbench/parts/trust/electron-browser/unsupportedWorkspaceSettings.contribution.i18n.json index 7feda6f68a..a50f89d239 100644 --- a/i18n/hun/src/vs/workbench/parts/trust/electron-browser/unsupportedWorkspaceSettings.contribution.i18n.json +++ b/i18n/hun/src/vs/workbench/parts/trust/electron-browser/unsupportedWorkspaceSettings.contribution.i18n.json @@ -6,7 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "unsupportedWorkspaceSettings": "A munkaterület olyan beállításokat tartalmaz, amelyeket csak a felhasználói beállításoknál lehet megadni (({0}). További információhoz kattintson [ide]({1})!", "openWorkspaceSettings": "Munkaterület beállításainak megnyitása", - "dontShowAgain": "Ne jelenítse meg újra" + "dontShowAgain": "Ne jelenítse meg újra", + "unsupportedWorkspaceSettings": "A munkaterület olyan beállításokat tartalmaz, amelyeket csak a felhasználói beállításoknál lehet megadni (({0}). További információhoz kattintson [ide]({1})!" } \ No newline at end of file diff --git a/i18n/hun/src/vs/workbench/parts/watermark/electron-browser/watermark.i18n.json b/i18n/hun/src/vs/workbench/parts/watermark/electron-browser/watermark.i18n.json index b3d1b5326b..ec3deccc3d 100644 --- a/i18n/hun/src/vs/workbench/parts/watermark/electron-browser/watermark.i18n.json +++ b/i18n/hun/src/vs/workbench/parts/watermark/electron-browser/watermark.i18n.json @@ -7,7 +7,7 @@ "Do not edit this file. It is machine generated." ], "watermark.showCommands": "Összes parancs megjelenítése ", - "watermark.quickOpen": "Fájl megkeresése", + "watermark.quickOpen": "Ugrás fájlhoz", "watermark.openFile": "Fájl megnyitása", "watermark.openFolder": "Mappa megnyitása", "watermark.openFileFolder": "Fájl vagy mappa megnyitása", diff --git a/i18n/hun/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThrough.contribution.i18n.json b/i18n/hun/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThrough.contribution.i18n.json index 9aa8125842..463137f95c 100644 --- a/i18n/hun/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThrough.contribution.i18n.json +++ b/i18n/hun/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThrough.contribution.i18n.json @@ -7,6 +7,5 @@ "Do not edit this file. It is machine generated." ], "walkThrough.editor.label": "Interaktív játszótér", - "help": "Segítség", - "interactivePlayground": "Interaktív játszótér" + "help": "Segítség" } \ No newline at end of file diff --git a/i18n/hun/src/vs/workbench/services/bulkEdit/electron-browser/bulkEditService.i18n.json b/i18n/hun/src/vs/workbench/services/bulkEdit/electron-browser/bulkEditService.i18n.json new file mode 100644 index 0000000000..970cf632d0 --- /dev/null +++ b/i18n/hun/src/vs/workbench/services/bulkEdit/electron-browser/bulkEditService.i18n.json @@ -0,0 +1,13 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "summary.0": "Nem történtek változtatások", + "summary.nm": "{0} változtatást végzett {0} fájlban", + "summary.n0": "{0} változtatást végzett egy fájlban", + "conflict": "A következő fájlok módosultak időközben: {0}" +} \ No newline at end of file diff --git a/i18n/hun/src/vs/workbench/services/configuration/common/configurationExtensionPoint.i18n.json b/i18n/hun/src/vs/workbench/services/configuration/common/configurationExtensionPoint.i18n.json index adfea92d29..b013f298f9 100644 --- a/i18n/hun/src/vs/workbench/services/configuration/common/configurationExtensionPoint.i18n.json +++ b/i18n/hun/src/vs/workbench/services/configuration/common/configurationExtensionPoint.i18n.json @@ -16,6 +16,7 @@ "vscode.extension.contributes.configuration": "Konfigurációs beállításokat szolgáltat.", "invalid.title": "a 'configuration.title' értékét karakterláncként kell megadni", "invalid.properties": "A 'configuration.properties' értékét egy objektumként kell megadni", + "invalid.property": "A 'configuration.property' értékét egy objektumként kell megadni", "invalid.allOf": "A 'configuration.allOf' elavult, és használata nem javasolt. Helyette több konfigurációs szakaszt kell átadni tömbként a 'configuration' értékeként.", "workspaceConfig.folders.description": "A munkaterületre betöltött mappák listája.", "workspaceConfig.path.description": "Egy fájl elérési útja, pl. `/root/folderA` vagy `./folderA` relatív elérési út esetén, ami a munkaterületfájl helye alapján lesz feloldva.", diff --git a/i18n/hun/src/vs/workbench/services/configurationResolver/electron-browser/configurationResolverService.i18n.json b/i18n/hun/src/vs/workbench/services/configurationResolver/electron-browser/configurationResolverService.i18n.json index 4eade970e4..8e0b4e75dd 100644 --- a/i18n/hun/src/vs/workbench/services/configurationResolver/electron-browser/configurationResolverService.i18n.json +++ b/i18n/hun/src/vs/workbench/services/configurationResolver/electron-browser/configurationResolverService.i18n.json @@ -6,6 +6,5 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "canNotResolveWorkspaceFolder": "A '${workspaceFolder}' értékét nem lehet feloldani. Nyisson meg egy mappát!", - "canNotResolveFolderBasename": "A '${workspaceFolderBasename}' értékét nem lehet feloldani. Nyisson meg egy mappát!" + "stringsOnlySupported": "A(z) {0} parancsnak nem egy szöveg lett az eredmény. Értékbehelyettesítésnél csak szöveget eredményező parancsok támogatottak." } \ No newline at end of file diff --git a/i18n/hun/src/vs/workbench/services/files/electron-browser/remoteFileService.i18n.json b/i18n/hun/src/vs/workbench/services/files/electron-browser/remoteFileService.i18n.json index 751f673906..12a9f90d22 100644 --- a/i18n/hun/src/vs/workbench/services/files/electron-browser/remoteFileService.i18n.json +++ b/i18n/hun/src/vs/workbench/services/files/electron-browser/remoteFileService.i18n.json @@ -6,6 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "invalidPath": "A(z) „{0}” erőforrás elérési útja csak abszolút lehet", "fileNotFoundError": "Fájl nem található ({0})", "fileIsDirectoryError": "A fájl egy könyvtár", "fileNotModifiedError": "A fájl azóta nem módosult", diff --git a/i18n/hun/src/vs/workbench/services/themes/common/fileIconThemeSchema.i18n.json b/i18n/hun/src/vs/workbench/services/themes/common/fileIconThemeSchema.i18n.json index d229e2fbea..bb66c188d2 100644 --- a/i18n/hun/src/vs/workbench/services/themes/common/fileIconThemeSchema.i18n.json +++ b/i18n/hun/src/vs/workbench/services/themes/common/fileIconThemeSchema.i18n.json @@ -21,7 +21,7 @@ "schema.languageId": "A társításhoz tartozó ikondefiníció azonosítója. ", "schema.fonts": "Az ikondefiníciókban használt betűkészletek.", "schema.id": "A betűkészlet azonosítója.", - "schema.src": "A betűkészlet elérési útjai.", + "schema.src": "A betűkészlet elérési útja.", "schema.font-path": "A betűkészlet elérési útja, relatívan az aktuális ikontémafájlhoz képest.", "schema.font-format": "A betűkészlet formátuma.", "schema.font-weight": "A betűkészlet betűvastagsága.", diff --git a/i18n/ita/extensions/configuration-editing/out/extension.i18n.json b/i18n/ita/extensions/configuration-editing/out/extension.i18n.json index 7f0eb37351..d1beb9fc28 100644 --- a/i18n/ita/extensions/configuration-editing/out/extension.i18n.json +++ b/i18n/ita/extensions/configuration-editing/out/extension.i18n.json @@ -6,5 +6,16 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "workspaceFolder": "Percorso della cartella aperta in VS Code", + "workspaceFolderBasename": "Nome della cartella aperta In VS Code senza barre di separazione (/)", + "relativeFile": "Il file attualmente aperto relativo a ${workspaceFolder}", + "file": "File attualmente aperto", + "cwd": "Cartella di lavoro attuale per il task di avvio", + "lineNumber": "La riga attuale nel file attivo", + "selectedText": "Il testo selezionato nel file attivo", + "fileDirname": "Il nome della cartella del file attuale", + "fileExtname": "L'estensione del file attualmente aperto", + "fileBasename": "Il nome del file attualmente aperto", + "fileBasenameNoExtension": "Il nome del file attualmente aperto senza estensione", "exampleExtension": "Esempio" } \ No newline at end of file diff --git a/i18n/ita/extensions/configuration-editing/out/settingsDocumentHelper.i18n.json b/i18n/ita/extensions/configuration-editing/out/settingsDocumentHelper.i18n.json index b930dcd654..04ccbf1dc6 100644 --- a/i18n/ita/extensions/configuration-editing/out/settingsDocumentHelper.i18n.json +++ b/i18n/ita/extensions/configuration-editing/out/settingsDocumentHelper.i18n.json @@ -9,8 +9,8 @@ "activeEditorShort": "il nome del file (ad esempio MyFile.txt)", "activeEditorMedium": "il percorso del file relativo alla cartella dell'area di lavoro (ad es. myFolder/myFile.txt)", "activeEditorLong": "il percorso completo del file (ad es. /Users/Development/myProject/myFolder/myFile.txt)", - "rootName": "nome dell'area di lavoro (ad es. myFolder o myWorkspace)", - "rootPath": "percorso dell'area di lavoro (ad es. /Users/Development/myWorkspace)", + "rootName": "nome dell'Area di lavoro (ad es. myFolder o myWorkspace)", + "rootPath": "percorso dell'Area di lavoro (ad es. /Users/Development/myWorkspace)", "folderName": "nome della cartella dell'area di lavoro in cui è contenuto il file (ad es. myFolder)", "folderPath": "percorso della cartella dell'area di lavoro in cui è contenuto il file (ad es. /Users/Development/myFolder)", "appName": "ad esempio VS Code", diff --git a/i18n/ita/extensions/git/out/commands.i18n.json b/i18n/ita/extensions/git/out/commands.i18n.json index 3f68d2df31..b8b9f04901 100644 --- a/i18n/ita/extensions/git/out/commands.i18n.json +++ b/i18n/ita/extensions/git/out/commands.i18n.json @@ -2,7 +2,7 @@ "": [ "--------------------------------------------------------------------------------------------", "Copyright (c) Microsoft Corporation. All rights reserved.", - "Licensed under the Source EULA. See License.txt in the project root for license information.", + "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], @@ -10,10 +10,12 @@ "remote branch at": "Ramo remoto in {0}", "create branch": "$(plus) Crea nuovo branch", "repourl": "URL del repository", - "parent": "Directory padre", + "selectFolder": "Seleziona il Percorso del Repository", "cloning": "Clonazione del repository GIT '{0}'...", - "openrepo": "Apri repository", "proposeopen": "Aprire il repository clonato?", + "openrepo": "Apri repository", + "add": "Aggiungi all'Area di Lavoro", + "proposeopen2": "Vuoi aprire il repository clonato o aggiungerlo all'area di lavoro corrente?", "init": "Selezionare la cartella dell'area di lavoro in cui inizializzare il Git repo", "init repo": "Inizializza repository", "create repo": "Inizializza repository", diff --git a/i18n/ita/extensions/npm/out/npmView.i18n.json b/i18n/ita/extensions/npm/out/npmView.i18n.json index 565aeceec1..8d06549b42 100644 --- a/i18n/ita/extensions/npm/out/npmView.i18n.json +++ b/i18n/ita/extensions/npm/out/npmView.i18n.json @@ -6,6 +6,9 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "npm.noDebugOptions": "Non è possibile avviare \"{0}\" per eseguire il debug perché negli script manca un'opzione di debug dei nodi, ad esempio \"--inspect-brk\".", - "npm.scriptInvalid": "Non è stato possibile trovare lo script \"{0}\". Provare ad aggiornare la visualizzazione." + "noScripts": "Script non trovato", + "noDebugOptions": "Non è possibile avviare \"{0}\" per eseguire il debug perché negli script manca un'opzione di debug dei nodi, ad esempio \"--inspect-brk\".", + "learnMore": "Altre informazioni", + "ok": "OK", + "scriptInvalid": "Non è stato possibile trovare lo script \"{0}\". Provare ad aggiornare la visualizzazione." } \ No newline at end of file diff --git a/i18n/ita/extensions/npm/package.i18n.json b/i18n/ita/extensions/npm/package.i18n.json index fc81506bb8..35faed0d78 100644 --- a/i18n/ita/extensions/npm/package.i18n.json +++ b/i18n/ita/extensions/npm/package.i18n.json @@ -12,15 +12,15 @@ "config.npm.runSilent": "Eseguire comandi npm con l'opzione `--silent`.", "config.npm.packageManager": "Il gestore dei pacchetti utilizzato per eseguire script.", "config.npm.exclude": "Configura i modelli glob per le cartelle che dovrebbero essere escluse dalla rilevazione automatica di script.", - "config.npm.enableScriptExplorer": "Abilita una visualizzazione di esplorazione per gli script di npm quando l'area di lavoro contiene un file 'package.json'.", + "config.npm.enableScriptExplorer": "Vedi come Esplora risorse gli script npm.", + "config.npm.scriptExplorerAction": "Azione predefinita per il clic in Esplora script: 'open' o 'run'. L'impostazione predefinita è 'open'.", "npm.parseError": "Rilevamento attività NPM: Impossibile analizzare il file {0}", "taskdef.script": "Lo script di npm da personalizzare.", - "taskdef.path": "Il percorso della cartella del file package.json che fornisce lo script. Può essere omesso.", + "taskdef.path": "Il percorso della cartella del file J.json contenente lo script può essere omesso.", "view.name": "Script di npm", "command.refresh": "Aggiorna", "command.run": "Esegui", "command.debug": "Debug", "command.openScript": "Apri", - "npm.scriptInvalid": "Non è stato possibile trovare lo script '{0}'. Provare ad aggiornare la visualizzazione.", - "npm.noDebugOptions": "Non è stato possibile avviare '{0}' per eseguire il debug perché negli script manca un'opzione di debug dei nodi, ad esempio '--inspect-brk'." + "command.runInstall": "Esegui install" } \ No newline at end of file diff --git a/i18n/ita/extensions/search-rg/package.i18n.json b/i18n/ita/extensions/search-rg/package.i18n.json new file mode 100644 index 0000000000..9ecfb7faf5 --- /dev/null +++ b/i18n/ita/extensions/search-rg/package.i18n.json @@ -0,0 +1,11 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "displayName": "Cerca (ripgrep)", + "description": "Usa ripgrep per effettuare ricerche." +} \ No newline at end of file diff --git a/i18n/ita/extensions/typescript-language-features/out/features/updatePathsOnRename.i18n.json b/i18n/ita/extensions/typescript-language-features/out/features/updatePathsOnRename.i18n.json new file mode 100644 index 0000000000..34bc37ff3b --- /dev/null +++ b/i18n/ita/extensions/typescript-language-features/out/features/updatePathsOnRename.i18n.json @@ -0,0 +1,14 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "prompt": "Aggiornare automaticamente le importazioni per il file spostato: '{0}'?", + "reject.title": "No", + "accept.title": "Sì", + "always.title": "Si, aggiorna sempre le importazioni", + "never.title": "No, non aggiornare mai le importazioni" +} \ No newline at end of file diff --git a/i18n/ita/extensions/typescript-language-features/package.i18n.json b/i18n/ita/extensions/typescript-language-features/package.i18n.json index 415fd9fe79..63da622e36 100644 --- a/i18n/ita/extensions/typescript-language-features/package.i18n.json +++ b/i18n/ita/extensions/typescript-language-features/package.i18n.json @@ -8,8 +8,7 @@ ], "displayName": "Funzionalità dei linguaggi TypeScript e JavaScript", "description": "Fornisce un supporto avanzato per JavaScript e TypeScript", - "typescript.reloadProjects.title": "Ricarica progetto", - "javascript.reloadProjects.title": "Ricarica progetto", + "reloadProjects.title": "Ricarica progetto", "configuration.typescript": "TypeScript", "typescript.useCodeSnippetsOnMethodSuggest.dec": "Completare le funzioni con la relativa firma del parametro.", "typescript.tsdk.desc": "Specifica il percorso della cartella che contiene i file tsserver e lib*.d.ts da usare.", @@ -37,8 +36,7 @@ "format.placeOpenBraceOnNewLineForFunctions": "Consente di definire se una parentesi graffa di apertura viene o meno inserita su una riga per le funzioni.", "format.placeOpenBraceOnNewLineForControlBlocks": "Consente di definire se una parentesi graffa di apertura viene o meno inserita su una riga per i blocchi di controllo.", "javascript.validate.enable": "Abilita/Disabilita la convalida JavaScript.", - "typescript.goToProjectConfig.title": "Passa a Configurazione progetto", - "javascript.goToProjectConfig.title": "Passa a Configurazione progetto", + "goToProjectConfig.title": "Passa a Configurazione progetto", "javascript.referencesCodeLens.enabled": "Abilita/disabilita riferimenti CodeLens nei file JavaScript.", "typescript.referencesCodeLens.enabled": "Abilita/disabilita riferimenti CodeLens nei file TypeScript. Richiede TypeScript >= 2.0.6.", "typescript.implementationsCodeLens.enabled": "Abilita/Disabilita le finestre CodeLens per le implementazioni. Richiede una versione di TypeScript uguale o successiva alla 2.2.0.", @@ -55,11 +53,15 @@ "typescript.problemMatchers.tsc.label": "Problemi TypeScript", "typescript.problemMatchers.tscWatch.label": "Problemi TypeScript (modalità espressione di controllo)", "typescript.quickSuggestionsForPaths": "Abilita/disabilita i suggerimenti rapidi quando si digita un percorso di importazione.", - "typescript.locale": "Assegna le impostazioni internazionali utilizzate per riportare errori TypeScript. Richiede TypeScript > = 2.6.0. Il valore predefinito 'null' utilizza le impostazioni internazionali di VS Code.", - "javascript.implicitProjectConfig.experimentalDecorators": "Abilita/disabilita 'experimentalDecorators' per i file JavaScript che non fanno parte di un progetto. File jsconfig.json o tsconfig.json esistenti ignorano questa impostazione. Richiede TypeScript >= 2.3.1.", - "typescript.autoImportSuggestions.enabled": "Abilita/Disabilita suggerimenti importazione automatica. Richiede una versione di TypeScript >= 2.6.1", + "typescript.locale": "Consente di definire le impostazioni locail usate per segnalare errori JavaScript e TypeScript. Richiede TypeScript >= 2.6.0. Con l'impostazione predefinita 'null' vengono usate le impostazioni locali di VS Code.", + "javascript.implicitProjectConfig.experimentalDecorators": "Abilita/disabilita gli elementi 'experimentalDecorators' per file JavaScript che non fanno parte di un progetto. I file jsconfig.json o tsconfig.json esistenti sovrascrivono questa impostazione. Richiede TypeScript >= 2.3.1.", + "typescript.autoImportSuggestions.enabled": "Abilita/disabilita il suggerimento automatico per gli import. Richiede una versione di TypeScript >= 2.6.1", "typescript.experimental.syntaxFolding": "Abilita/disabilita i marcatori di folding con riconoscimento della sintassi.", "taskDefinition.tsconfig.description": "File tsconfig che definisce la compilazione TS.", "javascript.suggestionActions.enabled": "Abilita/disabilita la diagnostica dei suggerimenti per i file JavaScript nell'editor. Richiede TypeScript >= 2.8.", - "typescript.suggestionActions.enabled": "Abilita/disabilita la diagnostica dei suggerimenti per i file TypeScript nell'editor. Richiede TypeScript >= 2.8." + "typescript.suggestionActions.enabled": "Abilita/disabilita la diagnostica dei suggerimenti per i file TypeScript nell'editor. Richiede TypeScript >= 2.8.", + "typescript.preferences.quoteStyle": "Stile di virgolette preferito da usare per le correzioni rapide. È possibile scegliere tra 'single', 'double' o 'auto' per derivare il tipo di virgolette dalle importazioni esistenti. Richiede TypeScript >= 2.9", + "typescript.preferences.importModuleSpecifier": "Stile di percorso preferito per le importazioni automatiche:\n- \"relative\", ovvero relativo al percorso del file.\n- \"non-relative\", basato sull'elemento 'baseUrl' configurato in 'jsconfig.json' / 'tsconfig.json'.\n- \"auto\", per derivare il tipo di percorso più breve.\nRichiede TypeScript >= 2.9", + "typescript.showUnused": "Abilita/disabilita l'evidenziazione delle variabili inutilizzate nel codice. Richiede TypeScript > = 2,9", + "typescript.updateImportsOnFileMove.enabled": "Abilita/disabilita l'aggiornamento automatico dei percorsi di importazione quando si rinomina o si sposta un file in VS Code. I valori possibili sono: 'prompt', che chiede conferma per ogni ridenominazione, 'always', che aggiorna automaticamente i percorsi e 'never' che rinomina i percorsi senza chiedere conferma. Richiede TypeScript >= 2.9" } \ No newline at end of file diff --git a/i18n/ita/src/vs/base/node/zip.i18n.json b/i18n/ita/src/vs/base/node/zip.i18n.json index 182a37bdf0..6b7be154b5 100644 --- a/i18n/ita/src/vs/base/node/zip.i18n.json +++ b/i18n/ita/src/vs/base/node/zip.i18n.json @@ -2,10 +2,10 @@ "": [ "--------------------------------------------------------------------------------------------", "Copyright (c) Microsoft Corporation. All rights reserved.", - "Licensed under the Source EULA. See License.txt in the project root for license information.", + "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "incompleteExtract": "Operazione incompleta. Sono state estratte {0} di {1} voci", + "incompleteExtract": "Non completato. Trovate {0} di {1} voci", "notFound": "{0} non è stato trovato all'interno del file ZIP." } \ No newline at end of file diff --git a/i18n/ita/src/vs/code/electron-browser/issue/issueReporterMain.i18n.json b/i18n/ita/src/vs/code/electron-browser/issue/issueReporterMain.i18n.json index 6bec92cf6a..227d32796a 100644 --- a/i18n/ita/src/vs/code/electron-browser/issue/issueReporterMain.i18n.json +++ b/i18n/ita/src/vs/code/electron-browser/issue/issueReporterMain.i18n.json @@ -6,6 +6,8 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "hide": "nascondi", + "show": "mostra", "previewOnGitHub": "Anteprima in GitHub", "loadingData": "Caricamento dei dati...", "rateLimited": "Superato il limite di query GitHub. Attendere prego.", diff --git a/i18n/ita/src/vs/code/electron-browser/issue/issueReporterPage.i18n.json b/i18n/ita/src/vs/code/electron-browser/issue/issueReporterPage.i18n.json index 1ab03145d1..a59dbde663 100644 --- a/i18n/ita/src/vs/code/electron-browser/issue/issueReporterPage.i18n.json +++ b/i18n/ita/src/vs/code/electron-browser/issue/issueReporterPage.i18n.json @@ -17,13 +17,12 @@ "issueTitleLabel": "Titolo", "issueTitleRequired": "Immettere un titolo.", "titleLengthValidation": "Il titolo è troppo lungo.", - "systemInfo": "Informazioni sul sistema in uso", - "sendData": "Invia i dati", - "processes": "Processi attualmente in esecuzione", - "workspaceStats": "Statistiche area di lavoro personale", - "extensions": "Estensioni personali", - "searchedExtensions": "Estensioni cercate", - "settingsSearchDetails": "Dettagli ricerca impostazioni", "details": "Immettere i dettagli.", - "loadingData": "Caricamento dei dati..." + "sendSystemInfo": "Includi informazioni sul sistema ({0})", + "show": "mostra", + "sendProcessInfo": "Includi i processi attualmente in esecuzione ({0})", + "sendWorkspaceInfo": "Includi i metadati dell'area di lavoro ({0})", + "sendExtensions": "Includi le estensioni abilitate ({0})", + "sendSearchedExtensions": "Invia le estensioni cercate ({0})", + "sendSettingsSearchDetails": "Invia i dettagli di ricerca delle impostazioni ({0})" } \ No newline at end of file diff --git a/i18n/ita/src/vs/code/electron-browser/processExplorer/processExplorerMain.i18n.json b/i18n/ita/src/vs/code/electron-browser/processExplorer/processExplorerMain.i18n.json index 312cd92898..edf6b8f466 100644 --- a/i18n/ita/src/vs/code/electron-browser/processExplorer/processExplorerMain.i18n.json +++ b/i18n/ita/src/vs/code/electron-browser/processExplorer/processExplorerMain.i18n.json @@ -11,5 +11,7 @@ "pid": "PID", "name": "Nome", "killProcess": "Arresta il processo", - "forceKillProcess": "Arresto forzato del processo" + "forceKillProcess": "Arresto forzato del processo", + "copy": "Copia", + "copyAll": "Copia tutti" } \ No newline at end of file diff --git a/i18n/ita/src/vs/code/electron-main/menus.i18n.json b/i18n/ita/src/vs/code/electron-main/menus.i18n.json index aa6cd54d39..1b4c19b859 100644 --- a/i18n/ita/src/vs/code/electron-main/menus.i18n.json +++ b/i18n/ita/src/vs/code/electron-main/menus.i18n.json @@ -88,7 +88,6 @@ "miToggleDebugConsole": "Console di de&&bug", "miToggleIntegratedTerminal": "&&Terminale integrato", "miMarker": "&&Problemi", - "miAdditionalViews": "&&Visualizzazioni aggiuntive", "miCommandPalette": "&&Riquadro comandi...", "miOpenView": "&&Apri visualizzazione...", "miToggleFullScreen": "Attiva/Disattiva sc&&hermo intero", @@ -144,7 +143,7 @@ "miContinue": "&&Continua", "miToggleBreakpoint": "Attiva/Disattiva &&punto di interruzione", "miConditionalBreakpoint": "Punto di interruzione &&condizionale...", - "miColumnBreakpoint": "Punto di interruzione &&colonna", + "miInlineBreakpoint": "P&&unto di interruzione in linea", "miFunctionBreakpoint": "Punto di interruzione &&funzione...", "miLogPoint": "&&Punto di registrazione...", "miNewBreakpoint": "&&Nuovo punto di interruzione", diff --git a/i18n/ita/src/vs/editor/browser/widget/codeEditorWidget.i18n.json b/i18n/ita/src/vs/editor/browser/widget/codeEditorWidget.i18n.json new file mode 100644 index 0000000000..9f68decbcc --- /dev/null +++ b/i18n/ita/src/vs/editor/browser/widget/codeEditorWidget.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "cursors.maximum": "Il numero di cursori è stato limitato a {0}." +} \ No newline at end of file diff --git a/i18n/ita/src/vs/editor/common/config/commonEditorConfig.i18n.json b/i18n/ita/src/vs/editor/common/config/commonEditorConfig.i18n.json index a4c0ee614a..0735da99fb 100644 --- a/i18n/ita/src/vs/editor/common/config/commonEditorConfig.i18n.json +++ b/i18n/ita/src/vs/editor/common/config/commonEditorConfig.i18n.json @@ -26,6 +26,7 @@ "detectIndentation": "All'apertura di un file, `editor.tabSize` e `editor.insertSpaces` verranno rilevati in base al contenuto del file.", "roundedSelection": "Controlla se gli angoli delle selezioni sono arrotondati", "scrollBeyondLastLine": "Controlla se l'editor scorrerà oltre l'ultima riga", + "scrollBeyondLastColumn": "Controlla il numero di caratteri aggiuntivi oltre il quale l'editor scorrerà orizzontalmente", "smoothScrolling": "Controlla se per lo scorrimento dell'editor verrà usata un'animazione.", "minimap.enabled": "Controlla se la mini mappa è visualizzata", "minimap.side": "Definisce il lato in cui eseguire il rendering della mini mappa.", @@ -41,7 +42,7 @@ "wordWrap.bounded": "Verrà eseguito il wrapping delle righe alla posizione minima del viewport e di `editor.wordWrapColumn`.", "wordWrap": "Controlla il wrapping delle righe. Valori possibili:\n - 'off' (disabilita il wrapping),\n - 'on' (wrapping del viewport),\n - 'wordWrapColumn' (esegue il wrapping alla posizione corrispondente a `editor.wordWrapColumn`) o\n - 'bounded' (esegue il wrapping alla posizione minima del viewport e di `editor.wordWrapColumn`).", "wordWrapColumn": "Controlla la colonna di wrapping dell'editor quando il valore di `editor.wordWrap` è 'wordWrapColumn' o 'bounded'.", - "wrappingIndent": "Controlla il rientro delle righe con ritorno a capo. Può essere uno dei valori seguenti: 'none', 'same' o 'indent'.", + "wrappingIndent": "Controlla il rientro delle righe con ritorno a capo. Può essere uno dei valori seguenti: 'none', 'same', 'indent' o 'deepIndent'.", "mouseWheelScrollSensitivity": "Moltiplicatore da usare sui valori `deltaX` e `deltaY` degli eventi di scorrimento della rotellina del mouse", "multiCursorModifier.ctrlCmd": "Rappresenta il tasto 'Control' (ctrl) su Windows e Linux e il tasto 'Comando' (cmd) su OSX.", "multiCursorModifier.alt": "Rappresenta il tasto 'Alt' su Windows e Linux e il tasto 'Opzione' su OSX.", diff --git a/i18n/ita/src/vs/editor/common/view/editorColorRegistry.i18n.json b/i18n/ita/src/vs/editor/common/view/editorColorRegistry.i18n.json index 3ca3c86bce..047668b002 100644 --- a/i18n/ita/src/vs/editor/common/view/editorColorRegistry.i18n.json +++ b/i18n/ita/src/vs/editor/common/view/editorColorRegistry.i18n.json @@ -32,6 +32,7 @@ "infoBorder": "Colore del bordo degli squiggle di informazione nell'editor", "hintForeground": "Colore primo piano degli squiggle di suggerimento nell'editor.", "hintBorder": "Colore del bordo degli squiggle di suggerimento nell'editor.", + "unnecessaryForeground": "Colore primo piano del codice non necessario nell'editor.", "overviewRulerRangeHighlight": "Colore del marcatore righello panoramica per evidenziazione intervalli. Il colore non deve essere opaco per non nascondere decorazioni sottostanti.", "overviewRuleError": "Colore del marcatore del righello delle annotazioni per gli errori.", "overviewRuleWarning": "Colore del marcatore del righello delle annotazioni per gli avvisi.", diff --git a/i18n/ita/src/vs/editor/contrib/find/findController.i18n.json b/i18n/ita/src/vs/editor/contrib/find/findController.i18n.json index cb8d2e1af9..5c4cb025bf 100644 --- a/i18n/ita/src/vs/editor/contrib/find/findController.i18n.json +++ b/i18n/ita/src/vs/editor/contrib/find/findController.i18n.json @@ -2,12 +2,12 @@ "": [ "--------------------------------------------------------------------------------------------", "Copyright (c) Microsoft Corporation. All rights reserved.", - "Licensed under the Source EULA. See License.txt in the project root for license information.", + "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], "startFindAction": "Trova", - "startFindWithSelectionAction": "Trova con selezione", + "startFindWithSelectionAction": "Trova nella selezione", "findNextMatchAction": "Trova successivo", "findPreviousMatchAction": "Trova precedente", "nextSelectionMatchFindAction": "Trova selezione successiva", diff --git a/i18n/ita/src/vs/editor/contrib/fontZoom/fontZoom.i18n.json b/i18n/ita/src/vs/editor/contrib/fontZoom/fontZoom.i18n.json new file mode 100644 index 0000000000..6e44bb06f0 --- /dev/null +++ b/i18n/ita/src/vs/editor/contrib/fontZoom/fontZoom.i18n.json @@ -0,0 +1,12 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "EditorFontZoomIn.label": "Zoom In del Font Editor", + "EditorFontZoomOut.label": "Zoom Reset del Font Editor", + "EditorFontZoomReset.label": "Reset dello Zoom del Font Editor" +} \ No newline at end of file diff --git a/i18n/ita/src/vs/editor/contrib/goToDefinition/goToDefinitionCommands.i18n.json b/i18n/ita/src/vs/editor/contrib/goToDefinition/goToDefinitionCommands.i18n.json new file mode 100644 index 0000000000..bf65f23a92 --- /dev/null +++ b/i18n/ita/src/vs/editor/contrib/goToDefinition/goToDefinitionCommands.i18n.json @@ -0,0 +1,25 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "noResultWord": "Non è stata trovata alcuna definizione per '{0}'", + "generic.noResults": "Non è stata trovata alcuna definizione", + "meta.title": " - Definizioni di {0}", + "actions.goToDecl.label": "Vai alla definizione", + "actions.goToDeclToSide.label": "Apri definizione lateralmente", + "actions.previewDecl.label": "Visualizza la definizione", + "goToImplementation.noResultWord": "Non sono state trovate implementazioni per '{0}'", + "goToImplementation.generic.noResults": "Non sono state trovate implementazioni", + "meta.implementations.title": "- {0} implementazioni", + "actions.goToImplementation.label": "Vai all'implementazione", + "actions.peekImplementation.label": "Anteprima implementazione", + "goToTypeDefinition.noResultWord": "Non sono state trovate definizioni di tipi per '{0}'", + "goToTypeDefinition.generic.noResults": "Non sono state trovate definizioni di tipi", + "meta.typeDefinitions.title": " - {0} definizioni di tipo", + "actions.goToTypeDefinition.label": "Vai alla definizione di tipo", + "actions.peekTypeDefinition.label": "Anteprima definizione di tipo" +} \ No newline at end of file diff --git a/i18n/ita/src/vs/editor/contrib/goToDefinition/goToDefinitionMouse.i18n.json b/i18n/ita/src/vs/editor/contrib/goToDefinition/goToDefinitionMouse.i18n.json new file mode 100644 index 0000000000..3136bef3f3 --- /dev/null +++ b/i18n/ita/src/vs/editor/contrib/goToDefinition/goToDefinitionMouse.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "multipleResults": "Fare clic per visualizzare {0} definizioni." +} \ No newline at end of file diff --git a/i18n/ita/src/vs/editor/contrib/gotoError/gotoError.i18n.json b/i18n/ita/src/vs/editor/contrib/gotoError/gotoError.i18n.json index 5f596c304d..7056fe65ad 100644 --- a/i18n/ita/src/vs/editor/contrib/gotoError/gotoError.i18n.json +++ b/i18n/ita/src/vs/editor/contrib/gotoError/gotoError.i18n.json @@ -7,5 +7,7 @@ "Do not edit this file. It is machine generated." ], "markerAction.next.label": "Vai al problema successivo (Errore, Avviso, Informazioni)", - "markerAction.previous.label": "Vai al problema precedente (Errore, Avviso, Info)" + "markerAction.previous.label": "Vai al problema precedente (Errore, Avviso, Info)", + "markerAction.nextInFiles.label": "Vai al Problema Successivo nei File (Error, Warning, Info)", + "markerAction.previousInFiles.label": "Vai al Problema Precedente nei File (Error, Warning, Info) " } \ No newline at end of file diff --git a/i18n/ita/src/vs/editor/contrib/indentation/indentation.i18n.json b/i18n/ita/src/vs/editor/contrib/indentation/indentation.i18n.json index dfc1d3241e..314714fa30 100644 --- a/i18n/ita/src/vs/editor/contrib/indentation/indentation.i18n.json +++ b/i18n/ita/src/vs/editor/contrib/indentation/indentation.i18n.json @@ -13,5 +13,6 @@ "indentUsingTabs": "Imposta rientro con tabulazioni", "indentUsingSpaces": "Imposta rientro con spazi", "detectIndentation": "Rileva rientro dal contenuto", - "editor.reindentlines": "Imposta nuovo rientro per righe" + "editor.reindentlines": "Imposta nuovo rientro per righe", + "editor.reindentselectedlines": "Re-Indenta le Linee Selezionate" } \ No newline at end of file diff --git a/i18n/ita/src/vs/editor/contrib/message/messageController.i18n.json b/i18n/ita/src/vs/editor/contrib/message/messageController.i18n.json index c77490ad4d..7a1932aabc 100644 --- a/i18n/ita/src/vs/editor/contrib/message/messageController.i18n.json +++ b/i18n/ita/src/vs/editor/contrib/message/messageController.i18n.json @@ -6,5 +6,5 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "editor.readonly": "Non è possibile modificare nell'editor di sola lettura" + "editor.readonly": "Impossibile modificare nell'editor di sola lettura" } \ No newline at end of file diff --git a/i18n/ita/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json b/i18n/ita/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json index fd9808f2dd..35f8ed83f0 100644 --- a/i18n/ita/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json +++ b/i18n/ita/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json @@ -25,8 +25,6 @@ "uninstallDependeciesConfirmation": "Disinstallare solo '{0}' o anche le relative dipendenze?", "uninstallOnly": "Solo Estensioni", "uninstallAll": "Disinstalla tutti", - "uninstallConfirmation": "Disinstallare '{0}'?", - "ok": "OK", "singleDependentError": "Non è possibile disinstallare l'estensione '{0}'. L'estensione '{1}' dipende da tale estensione.", "twoDependentsError": "Non è possibile disinstallare l'estensione '{0}'. Le estensioni '{1}' e '{2}' dipendono da tale estensione.", "multipleDependentsError": "Non è possibile disinstallare l'estensione '{0}'. Alcune estensioni, tra cui '{1}' e '{2}' dipendono da tale estensione.", diff --git a/i18n/ita/src/vs/platform/node/minimalTranslations.i18n.json b/i18n/ita/src/vs/platform/node/minimalTranslations.i18n.json new file mode 100644 index 0000000000..248dd2ff32 --- /dev/null +++ b/i18n/ita/src/vs/platform/node/minimalTranslations.i18n.json @@ -0,0 +1,13 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "showLanguagePackExtensions": "VS Code è disponibile in {0}. Cercare i language packs nel Marketplace per iniziare.", + "searchMarketplace": "Cerca nel Marketplace", + "installAndRestartMessage": "Codice VS è disponibile in {0}. Installare il language pack per iniziare. È necessario un riavvio.", + "installAndRestart": "Installa e riavvia" +} \ No newline at end of file diff --git a/i18n/ita/src/vs/platform/theme/common/colorRegistry.i18n.json b/i18n/ita/src/vs/platform/theme/common/colorRegistry.i18n.json index f7f5fc1552..db040b2053 100644 --- a/i18n/ita/src/vs/platform/theme/common/colorRegistry.i18n.json +++ b/i18n/ita/src/vs/platform/theme/common/colorRegistry.i18n.json @@ -16,7 +16,7 @@ "selectionBackground": "Il colore di sfondo delle selezioni di testo nel workbench (ad esempio per i campi di input o aree di testo). Si noti che questo non si applica alle selezioni all'interno dell'editor.", "textSeparatorForeground": "Colore dei separatori di testo.", "textLinkForeground": "Colore primo piano dei link nel testo.", - "textLinkActiveForeground": "Colore primo piano dei link attivi nel testo.", + "textLinkActiveForeground": "Colore di primo piano per i link nel testo cliccati o sotto il mouse.", "textPreformatForeground": "Colore primo piano dei segmenti di testo preformattato.", "textBlockQuoteBackground": "Colore di sfondo per le citazioni nel testo.", "textBlockQuoteBorder": "Colore bordo per citazioni nel testo.", @@ -48,6 +48,8 @@ "listDropBackground": "Sfondo Elenco/Struttura ad albero durante il trascinamento degli elementi selezionati.", "highlight": "Colore primo piano Elenco/Struttura ad albero delle occorrenze trovate durante la ricerca nell'Elenco/Struttura ad albero.", "invalidItemForeground": "Colore di primo piano di Elenco/Struttura ad albero per gli elementi non validi, ad esempio una radice non risolta in Esplora.", + "listErrorForeground": "Colore di primo piano della lista degli errori.", + "listWarningForeground": "Colore di primo piano della lista delle warning.", "pickerGroupForeground": "Colore di selezione rapida per il raggruppamento delle etichette.", "pickerGroupBorder": "Colore di selezione rapida per il raggruppamento dei bordi.", "buttonForeground": "Colore primo piano del pulsante.", @@ -58,7 +60,7 @@ "scrollbarShadow": "Ombra di ScrollBar per indicare lo scorrimento della visualizzazione.", "scrollbarSliderBackground": "Colore di sfondo dello slider della barra di scorrimento.", "scrollbarSliderHoverBackground": "Colore di sfondo dello Slider della Barra di scorrimento al passaggio del mouse.", - "scrollbarSliderActiveBackground": "Colore di sfondo dello Slider della Barra di scorrimento quando è attivo.", + "scrollbarSliderActiveBackground": "Colore di sfondo del cursore della barra di scorrimento quando cliccata.", "progressBarBackground": "Colore di sfondo dell'indicatore di stato che può essere mostrato durante l'esecuzione di operazioni lunghe.", "editorBackground": "Colore di sfondo dell'editor.", "editorForeground": "Colore primo piano predefinito dell'editor.", @@ -75,6 +77,7 @@ "editorFindMatchBorder": "Colore del bordo della corrispondenza della ricerca corrente.", "findMatchHighlightBorder": "Colore del bordo delle altre corrispondenze della ricerca.", "findRangeHighlightBorder": "Colore del bordo dell'intervallo di limite della ricerca. Il colore non deve essere opaco per non nascondere decorazioni sottostanti.", + "findWidgetResizeBorder": "Colore del bordo della barra di ridimensionamento del comando trova.", "hoverHighlight": "Evidenziazione sotto la parola per cui è visualizzata un'area sensibile al passaggio del mouse. Il colore non deve essere opaco per evitare di nascondere le decorazioni sottostanti.", "hoverBackground": "Colore di sfondo dell'area sensibile al passaggio del mouse dell'editor.", "hoverBorder": "Colore del bordo dell'area sensibile al passaggio del mouse dell'editor.", diff --git a/i18n/ita/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.i18n.json b/i18n/ita/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.i18n.json index 46a4d38868..b2a5da8a7d 100644 --- a/i18n/ita/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.i18n.json +++ b/i18n/ita/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.i18n.json @@ -6,5 +6,5 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "confirmUrl": "Consentire all'estensione {0} di aprire l'URL seguente?" + "confirmUrl": "Permettere ad una estensione di aprire questo URL?" } \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json b/i18n/ita/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json index ef90c889f1..ac822acba0 100644 --- a/i18n/ita/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json +++ b/i18n/ita/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json @@ -8,11 +8,10 @@ ], "vscode.extension.contributes.views.containers.id": "ID univoco usato per identificare il contenitore in cui è possibile aggiungere visualizzazioni come contributo usando il punto di aggiunta contributo 'views'", "vscode.extension.contributes.views.containers.title": "Stringa leggibile usata per il rendering del contenitore", - "vscode.extension.contributes.views.containers.icon": "Percorso dell'icona del contenitore. Le icone, le cui dimensioni sono 24x24, sono centrate in un riquadro le cui dimensioni sono 50x40 e sono caratterizzate dal colore di riempimento 'rgb(215, 218, 224)' o '#d7dae0'. Anche se è accettato qualsiasi tipo di file immagine, per le icone è consigliabile usare il formato SVG.", + "vscode.extension.contributes.views.containers.icon": "Percorso dell'icona del contenitore. Le icone, le cui dimensioni sono 24x24, sono centrate in un blocco le cui dimensioni sono 50x40 e sono caratterizzate dal colore di riempimento 'rgb(215, 218, 224)' o '#d7dae0'. Anche se è accettato qualsiasi tipo di file immagine, per le icone è consigliabile usare il formato SVG.", "vscode.extension.contributes.viewsContainers": "Aggiunge come contributo contenitori di visualizzazioni all'editor", "views.container.activitybar": "Aggiunge come contributo contenitori di visualizzazioni alla barra attività", "test": "Test", - "proposed": "Il contributo 'viewsContainers' è disponibile solo durante l'esecuzione all'esterno dell'ambiente di sviluppo o con l'opzione seguente della riga di comando: --enable-proposed-api {0}", "requirearray": "i contenitori di visualizzazioni devono essere una matrice", "requireidstring": "la proprietà `{0}` è obbligatoria e deve essere di tipo `string`. Sono consentiti solo caratteri alfanumerici, '_' e '-'.", "requirestring": "la proprietà `{0}` è obbligatoria e deve essere di tipo `string`", diff --git a/i18n/ita/src/vs/workbench/browser/actions/workspaceActions.i18n.json b/i18n/ita/src/vs/workbench/browser/actions/workspaceActions.i18n.json index 694cd29a6f..2c447ce13e 100644 --- a/i18n/ita/src/vs/workbench/browser/actions/workspaceActions.i18n.json +++ b/i18n/ita/src/vs/workbench/browser/actions/workspaceActions.i18n.json @@ -15,5 +15,5 @@ "saveWorkspace": "Salva area di lavoro", "openWorkspaceAction": "Apri area di lavoro...", "openWorkspaceConfigFile": "Apri file di configurazione dell'area di lavoro", - "openFolderAsWorkspaceInNewWindow": "Apre la cartella come area di lavoro in una nuova finestra" + "duplicateWorkspaceInNewWindow": "Duplica area di lavoro nella nuova finestra" } \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/browser/parts/panel/panelPart.i18n.json b/i18n/ita/src/vs/workbench/browser/parts/panel/panelPart.i18n.json index e329fe4ccd..de89b63f16 100644 --- a/i18n/ita/src/vs/workbench/browser/parts/panel/panelPart.i18n.json +++ b/i18n/ita/src/vs/workbench/browser/parts/panel/panelPart.i18n.json @@ -1,8 +1,10 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the Source EULA. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ -// Do not edit this file. It is machine generated. { - "panelSwitcherBarAriaLabel": "Cambio pannello attivo" + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "hidePanel": "Nascondi pannello" } \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/browser/parts/quickopen/quickOpenController.i18n.json b/i18n/ita/src/vs/workbench/browser/parts/quickopen/quickOpenController.i18n.json index 1193df3ac1..cf8735a193 100644 --- a/i18n/ita/src/vs/workbench/browser/parts/quickopen/quickOpenController.i18n.json +++ b/i18n/ita/src/vs/workbench/browser/parts/quickopen/quickOpenController.i18n.json @@ -6,8 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "inputModeEntryDescription": "{0} (premere 'INVIO' per confermare oppure 'ESC' per annullare)", - "inputModeEntry": "Premere 'INVIO' per confermare l'input oppure 'ESC' per annullare", "emptyPicks": "Non ci sono voci selezionabili", "quickOpenInput": "Digitare '?' per visualizzare la Guida relativa alle azioni che è possibile eseguire qui", "historyMatches": "aperti di recente", diff --git a/i18n/ita/src/vs/workbench/browser/parts/views/viewsViewlet.i18n.json b/i18n/ita/src/vs/workbench/browser/parts/views/viewsViewlet.i18n.json index 7f5176155a..cbfb4f1f3f 100644 --- a/i18n/ita/src/vs/workbench/browser/parts/views/viewsViewlet.i18n.json +++ b/i18n/ita/src/vs/workbench/browser/parts/views/viewsViewlet.i18n.json @@ -6,5 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "cannot toggle": "Non è possibile attivare/disattivare la visibilità per questa visualizzazione {0}", + "cannot show": "Non è possibile mostrare questa visualizzazione {0} perché è nascosta dalla relativa condizione 'when'", "hideView": "Nascondi" } \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/common/theme.i18n.json b/i18n/ita/src/vs/workbench/common/theme.i18n.json index f537607508..bab828c8e5 100644 --- a/i18n/ita/src/vs/workbench/common/theme.i18n.json +++ b/i18n/ita/src/vs/workbench/common/theme.i18n.json @@ -11,8 +11,10 @@ "tabHoverBackground": "Colore di sfondo al passaggio del mouse sulle schede. Le schede sono i contenitori degli editor nell'area degli editor. È possibile aprire più schede in un gruppo di editor e possono esistere più gruppi di editor.", "tabUnfocusedHoverBackground": "Colore di sfondo al passaggio del mouse sulle schede in un gruppo non attivo. Le schede sono i contenitori degli editor nell'area degli editor. È possibile aprire più schede in un gruppo di editor e possono esistere più gruppi di editor.", "tabBorder": "Bordo per separare le schede l'una dall'altra. Le schede sono i contenitori degli editor nell'area degli editor. È possibile aprire più schede in un gruppo di editor e possono esistere più gruppi di editor.", - "tabActiveBorder": "Bordo per evidenziare le schede attive. Le schede sono i contenitori degli editor nell'area degli editor. È possibile aprire più schede in un gruppo di editor e possono esistere più gruppi di editor.", - "tabActiveUnfocusedBorder": "Bordo per evidenziare le schede attive in un gruppo con stato non attivo. Le schede sono i contenitori degli editor nell'area degli editor. È possibile aprire più schede in un gruppo di editor e possono esistere più gruppi di editor.", + "tabActiveBorder": "Bordo nella parte inferiore di una scheda attiva. Le schede sono i contenitori degli editor nell'area degli editor. È possibile aprire più schede in un gruppo di editor e possono esistere più gruppi di editor.", + "tabActiveBorderTop": "Bordo nella parte superiore di una scheda attiva. Le schede sono i contenitori degli editor nell'area degli editor. È possibile aprire più schede in un gruppo di editor e possono esistere più gruppi di editor.", + "tabActiveUnfocusedBorder": "Bordo nella parte inferiore di una scheda attiva in un gruppo con stato non attivo. Le schede sono i contenitori degli editor nell'area degli editor. È possibile aprire più schede in un gruppo di editor e possono esistere più gruppi di editor.", + "tabActiveUnfocusedBorderTop": "Bordo nella parte superiore di una scheda attiva in un gruppo con stato non attivo. Le schede sono i contenitori degli editor nell'area degli editor. È possibile aprire più schede in un gruppo di editor e possono esistere più gruppi di editor.", "tabHoverBorder": "Bordo da utilizzare per evidenziare la scheda al passaggio del mouse. Le schede sono i contenitori degli editor nell'area degli editor. È possibile aprire più schede in un gruppo di editor e possono esistere più gruppi di editor.", "tabUnfocusedHoverBorder": "Bordo da utilizzare per evidenziare la scheda non attiva al passaggio del mouse. Le schede sono i contenitori degli editor nell'area degli editor. È possibile aprire più schede in un gruppo di editor e possono esistere più gruppi di editor.", "tabActiveForeground": "Colore di primo piano delle schede attive in un gruppo attivo. Le schede sono i contenitori degli editor nell'area degli editor. È possibile aprire più schede in un gruppo di editor e possono esistere più gruppi di editor.", diff --git a/i18n/ita/src/vs/workbench/parts/codeEditor/electron-browser/largeFileOptimizations.i18n.json b/i18n/ita/src/vs/workbench/parts/codeEditor/electron-browser/largeFileOptimizations.i18n.json new file mode 100644 index 0000000000..3f801b948a --- /dev/null +++ b/i18n/ita/src/vs/workbench/parts/codeEditor/electron-browser/largeFileOptimizations.i18n.json @@ -0,0 +1,13 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "largeFile": "{0}: per questo file di grandi dimensioni sono state disattivate le opzioni di tokenizzazione, ritorno a capo automatico e riduzione del codice allo scopo di ridurre l'utilizzo della memoria ed evitare blocchi o arresti anomali.", + "neverShowAgain": "OK. Non visualizzare più questo messaggio", + "removeOptimizations": "Abilita le funzionalità in modo forzato", + "reopenFilePrompt": "Riaprire il file per rendere effettiva questa impostazione." +} \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/debug/browser/debugActions.i18n.json b/i18n/ita/src/vs/workbench/parts/debug/browser/debugActions.i18n.json index 40e143fc40..657cff077f 100644 --- a/i18n/ita/src/vs/workbench/parts/debug/browser/debugActions.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/debug/browser/debugActions.i18n.json @@ -41,7 +41,7 @@ "debugConsoleAction": "Console di debug", "unreadOutput": "Nuovo output nella console di debug", "debugFocusConsole": "Console di debug stato attivo", - "focusProcess": "Sposta stato attivo su processo", + "focusSession": "Sposta stato attivo su sessione", "stepBackDebug": "Torna indietro", "reverseContinue": "Inverti" } \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/debug/browser/debugCommands.i18n.json b/i18n/ita/src/vs/workbench/parts/debug/browser/debugCommands.i18n.json index 1f0b917903..9e1b6025ec 100644 --- a/i18n/ita/src/vs/workbench/parts/debug/browser/debugCommands.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/debug/browser/debugCommands.i18n.json @@ -7,7 +7,7 @@ "Do not edit this file. It is machine generated." ], "noFolderDebugConfig": "Si prega di aprire prima una cartella per consentire una configurazione di debug avanzato.", - "columnBreakpoint": "Punto di interruzione colonna", + "inlineBreakpoint": "Punto di interruzione in linea", "debug": "Debug", - "addColumnBreakpoint": "Aggiungi punto di interruzione colonna" + "addInlineBreakpoint": "Aggiungi punto di interruzione in linea" } \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/debug/browser/debugEditorActions.i18n.json b/i18n/ita/src/vs/workbench/parts/debug/browser/debugEditorActions.i18n.json index 5d0cfad57b..fc5ff62ba4 100644 --- a/i18n/ita/src/vs/workbench/parts/debug/browser/debugEditorActions.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/debug/browser/debugEditorActions.i18n.json @@ -12,5 +12,7 @@ "runToCursor": "Esegui fino al cursore", "debugEvaluate": "Debug: Valuta", "debugAddToWatch": "Debug: Aggiungi a espressione di controllo", - "showDebugHover": "Debug: Visualizza passaggio del mouse" + "showDebugHover": "Debug: Visualizza passaggio del mouse", + "goToNextBreakpoint": "Debug: Vai al punto di interruzione successivo", + "goToPreviousBreakpoint": "Debug: Vai al punto di interruzione precedente" } \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/debug/browser/debugViewlet.i18n.json b/i18n/ita/src/vs/workbench/parts/debug/browser/debugViewlet.i18n.json index a94c01c2be..da659debd3 100644 --- a/i18n/ita/src/vs/workbench/parts/debug/browser/debugViewlet.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/debug/browser/debugViewlet.i18n.json @@ -6,6 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "startAdditionalSession": "Avvia sessione aggiuntiva", "debugFocusVariablesView": "Variabili in focus", "debugFocusWatchView": "Espressione di controllo in focus", "debugFocusCallStackView": "Stack di chiamate in focus", diff --git a/i18n/ita/src/vs/workbench/parts/debug/common/debugSchemas.i18n.json b/i18n/ita/src/vs/workbench/parts/debug/common/debugSchemas.i18n.json new file mode 100644 index 0000000000..ec9fac99de --- /dev/null +++ b/i18n/ita/src/vs/workbench/parts/debug/common/debugSchemas.i18n.json @@ -0,0 +1,38 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "vscode.extension.contributes.debuggers": "Adattatori di debug per contributes.", + "vscode.extension.contributes.debuggers.type": "Identificatore univoco per questo adattatore di debug.", + "vscode.extension.contributes.debuggers.label": "Nome visualizzato per questo adattatore di debug.", + "vscode.extension.contributes.debuggers.program": "Percorso del programma dell'adattatore di debug. Il percorso è assoluto o relativo alla cartella delle estensioni.", + "vscode.extension.contributes.debuggers.args": "Argomenti facoltativi da passare all'adattatore.", + "vscode.extension.contributes.debuggers.runtime": "Runtime facoltativo nel caso in cui l'attributo del programma non sia un eseguibile ma richieda un runtime.", + "vscode.extension.contributes.debuggers.runtimeArgs": "Argomenti del runtime facoltativo.", + "vscode.extension.contributes.debuggers.variables": "Mapping tra le variabili interattive, ad esempio ${action.pickProcess}, in `launch.json` e un comando.", + "vscode.extension.contributes.debuggers.initialConfigurations": "Configurazioni per generare la versione iniziale di 'launch.json'.", + "vscode.extension.contributes.debuggers.languages": "Elenco dei linguaggi. per cui l'estensione di debug può essere considerata il \"debugger predefinito\".", + "vscode.extension.contributes.debuggers.adapterExecutableCommand": "Se è specificato, Visual Studio Code chiamerà questo comando per determinare il percorso eseguibile della scheda di debug e gli argomenti da passare.", + "vscode.extension.contributes.debuggers.configurationSnippets": "Frammenti per l'aggiunta di nuove configurazioni in 'launch.json'.", + "vscode.extension.contributes.debuggers.configurationAttributes": "Configurazioni dello schema JSON per la convalida di 'launch.json'.", + "vscode.extension.contributes.debuggers.windows": "Impostazioni specifiche di Windows.", + "vscode.extension.contributes.debuggers.windows.runtime": "Runtime usato per Windows.", + "vscode.extension.contributes.debuggers.osx": "Impostazioni specifiche di macOS.", + "vscode.extension.contributes.debuggers.osx.runtime": "Runtime usato per macOS.", + "vscode.extension.contributes.debuggers.linux": "Impostazioni specifiche di Linux.", + "vscode.extension.contributes.debuggers.linux.runtime": "Runtime usato per Linux.", + "vscode.extension.contributes.breakpoints": "Punti di interruzione per contributes.", + "vscode.extension.contributes.breakpoints.language": "Consente i punti di interruzione per questo linguaggio.", + "app.launch.json.title": "Launch", + "app.launch.json.version": "Versione di questo formato di file.", + "app.launch.json.configurations": "Elenco delle configurazioni. Aggiungere nuove configurazioni o modificare quelle esistenti con IntelliSense.", + "app.launch.json.compounds": "Elenco degli elementi compounds. Ogni elemento compounds fa riferimento a più configurazioni che verranno avviate insieme.", + "app.launch.json.compound.name": "Nome dell'elemento compounds. Viene visualizzato nel menu a discesa della configurazione di avvio.", + "useUniqueNames": "Usare nomi di configurazione univoci.", + "app.launch.json.compound.folder": "Nome della cartella in cui si trova l'elemento compounds.", + "app.launch.json.compounds.configurations": "Nomi delle configurazioni che verranno avviate per questo elemento compounds." +} \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/debug/electron-browser/callStackView.i18n.json b/i18n/ita/src/vs/workbench/parts/debug/electron-browser/callStackView.i18n.json index 503f78f3b4..37b42d20ff 100644 --- a/i18n/ita/src/vs/workbench/parts/debug/electron-browser/callStackView.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/debug/electron-browser/callStackView.i18n.json @@ -9,7 +9,7 @@ "callstackSection": "Sezione Stack di chiamate", "debugStopped": "In pausa su {0}", "callStackAriaLabel": "Stack di chiamate di debug", - "process": "Processo", + "session": "Sessione", "paused": "In pausa", "running": "In esecuzione", "thread": "Thread", diff --git a/i18n/ita/src/vs/workbench/parts/debug/electron-browser/debug.contribution.i18n.json b/i18n/ita/src/vs/workbench/parts/debug/electron-browser/debug.contribution.i18n.json index cc45a10d38..94e6644b2c 100644 --- a/i18n/ita/src/vs/workbench/parts/debug/electron-browser/debug.contribution.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/debug/electron-browser/debug.contribution.i18n.json @@ -21,11 +21,12 @@ "allowBreakpointsEverywhere": "Consente l'impostazione del punto di interruzione in qualsiasi file", "openExplorerOnEnd": "Apre automaticamente la visualizzazione di esplorazione al termine di una sessione di debug", "inlineValues": "Mostra i valori delle variabili inline nell'editor durante il debug", - "hideActionBar": "Controlla se nascondere la barra delle azioni mobile di debug", + "toolBarLocation": "Controlla la posizione della barra degli strumenti di debug. Le opzioni sono: \"floating\", ovvero mobile in tutte le visualizzazioni, \"docked\", ovvero ancorata nella visualizzazione di debug oppure \"hidden\", ovvero nascosta", "never": "Non mostrare mai debug nella barra di stato", "always": "Visualizzare sempre debug nella barra di stato", "onFirstSessionStart": "Mostra debug nella barra solo stato dopo il primo avvio del debug", "showInStatusBar": "Controlla se rendere visibile la barra di stato del debug", "openDebug": "Controlla se la visualizzazione di debug debba essere aperta all'avvio della sessione di debug.", + "enableAllHovers": "Controlla se è necessario abilitare i passaggi del mouse non di debug durante il debug. Se è true, i provider di passaggi del mouse verranno chiamati per fornire un passaggio del mouse. I passaggi del mouse normali non verranno visualizzati anche se il valore di questa impostazione è true.", "launch": "Configurazione globale per l'esecuzione del debug. Può essere usata come un'alternativa a \"launch.json\" " } \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.i18n.json b/i18n/ita/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.i18n.json index ef6954bebd..73bdd73c5d 100644 --- a/i18n/ita/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.i18n.json @@ -2,39 +2,10 @@ "": [ "--------------------------------------------------------------------------------------------", "Copyright (c) Microsoft Corporation. All rights reserved.", - "Licensed under the Source EULA. See License.txt in the project root for license information.", + "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "vscode.extension.contributes.debuggers": "Adattatori di debug per contributes.", - "vscode.extension.contributes.debuggers.type": "Identificatore univoco per questo adattatore di debug.", - "vscode.extension.contributes.debuggers.label": "Nome visualizzato per questo adattatore di debug.", - "vscode.extension.contributes.debuggers.program": "Percorso del programma dell'adattatore di debug. Il percorso è assoluto o relativo alla cartella delle estensioni.", - "vscode.extension.contributes.debuggers.args": "Argomenti facoltativi da passare all'adattatore.", - "vscode.extension.contributes.debuggers.runtime": "Runtime facoltativo nel caso in cui l'attributo del programma non sia un eseguibile ma richieda un runtime.", - "vscode.extension.contributes.debuggers.runtimeArgs": "Argomenti del runtime facoltativo.", - "vscode.extension.contributes.debuggers.variables": "Mapping tra le variabili interattive, ad esempio ${action.pickProcess}, in `launch.json` e un comando.", - "vscode.extension.contributes.debuggers.initialConfigurations": "Configurazioni per generare la versione iniziale di 'launch.json'.", - "vscode.extension.contributes.debuggers.languages": "Elenco dei linguaggi. per cui l'estensione di debug può essere considerata il \"debugger predefinito\".", - "vscode.extension.contributes.debuggers.adapterExecutableCommand": "Se è specificato, Visual Studio Code chiamerà questo comando per determinare il percorso eseguibile della scheda di debug e gli argomenti da passare.", - "vscode.extension.contributes.debuggers.configurationSnippets": "Frammenti per l'aggiunta di nuove configurazioni in 'launch.json'.", - "vscode.extension.contributes.debuggers.configurationAttributes": "Configurazioni dello schema JSON per la convalida di 'launch.json'.", - "vscode.extension.contributes.debuggers.windows": "Impostazioni specifiche di Windows.", - "vscode.extension.contributes.debuggers.windows.runtime": "Runtime usato per Windows.", - "vscode.extension.contributes.debuggers.osx": "Impostazioni specifiche di macOS.", - "vscode.extension.contributes.debuggers.osx.runtime": "Runtime usato per macOS.", - "vscode.extension.contributes.debuggers.linux": "Impostazioni specifiche di Linux.", - "vscode.extension.contributes.debuggers.linux.runtime": "Runtime usato per Linux.", - "vscode.extension.contributes.breakpoints": "Punti di interruzione per contributes.", - "vscode.extension.contributes.breakpoints.language": "Consente i punti di interruzione per questo linguaggio.", - "app.launch.json.title": "Launch", - "app.launch.json.version": "Versione di questo formato di file.", - "app.launch.json.configurations": "Elenco delle configurazioni. Aggiungere nuove configurazioni o modificare quelle esistenti con IntelliSense.", - "app.launch.json.compounds": "Elenco degli elementi compounds. Ogni elemento compounds fa riferimento a più configurazioni che verranno avviate insieme.", - "app.launch.json.compound.name": "Nome dell'elemento compounds. Viene visualizzato nel menu a discesa della configurazione di avvio.", - "useUniqueNames": "Usare nomi di configurazione univoci.", - "app.launch.json.compound.folder": "Nome della cartella in cui si trova l'elemento compounds.", - "app.launch.json.compounds.configurations": "Nomi delle configurazioni che verranno avviate per questo elemento compounds.", "debugNoType": "Il \"tipo\" del debugger non può essere omesso e deve essere di tipo \"string\"", "selectDebug": "Seleziona ambiente", "DebugConfig.failed": "Non è possibile creare il file 'launch.json' all'interno della cartella '.vscode' ({0}).", diff --git a/i18n/ita/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json b/i18n/ita/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json index bafcaa2f73..cdfee862db 100644 --- a/i18n/ita/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json @@ -13,15 +13,15 @@ "disableBreakpoint": "Disabilita {0}", "enableBreakpoint": "Abilita {0}", "removeBreakpoints": "Rimuovi punti di interruzione", - "removeBreakpointOnColumn": "Rimuovi punto di interruzione a colonna {0}", + "removeInlineBreakpointOnColumn": "Rimuovi punto di interruzione in linea a colonna {0}", "removeLineBreakpoint": "Rimuovi punto di interruzione riga", "editBreakpoints": "Modifica punti di interruzione", - "editBreakpointOnColumn": "Modifica punto di interruzione a colonna {0}", + "editInlineBreakpointOnColumn": "Modifica punto di interruzione in linea a colonna {0}", "editLineBrekapoint": "Modifica punto di interruzione riga", "enableDisableBreakpoints": "Abilita/Disabilita punti di interruzione", - "disableColumnBreakpoint": "Disabilita punto di interruzione a colonna {0}", + "disableInlineColumnBreakpoint": "Disabilita punto di interruzione in linea a colonna {0}", "disableBreakpointOnLine": "Disabilita punto di interruzione riga", - "enableBreakpoints": "Abilita punto di interruzione a colonna {0}", + "enableBreakpoints": "Abilita punto di interruzione in linea a colonna {0}", "enableBreakpointOnLine": "Abilita punto di interruzione riga", "addBreakpoint": "Aggiungi punto di interruzione", "addConditionalBreakpoint": "Aggiungi punto di interruzione condizionale...", diff --git a/i18n/ita/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.i18n.json b/i18n/ita/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.i18n.json index 89f32dfa7a..e979e51723 100644 --- a/i18n/ita/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.i18n.json @@ -16,9 +16,13 @@ "repository": "Repository", "license": "Licenza", "details": "Dettagli", + "detailstooltip": "Dettagli dell'estensione. Rendering eseguito dal file 'README.md' dell'estensione", "contributions": "Contributi", + "contributionstooltip": "Elenca i contributi a VS Code aggiunti da questa estensione", "changelog": "Log delle modifiche", + "changelogtooltip": "Cronologia degli aggiornamenti dell'estensione. Rendering eseguito dal file 'CHANGELOG.md' dell'estensione", "dependencies": "Dipendenze", + "dependenciestooltip": "Elenca le estensioni da cui dipende questa estensione", "noReadme": "File LEGGIMI non disponibile.", "noChangelog": "Changelog non disponibile.", "noContributions": "Nessun contributo", @@ -30,13 +34,17 @@ "debuggers": "Debugger ({0})", "debugger name": "Nome", "debugger type": "Tipo", + "viewContainers": "Visualizza contenitori ({0})", + "view container id": "ID", + "view container title": "Titolo", + "view container location": "Dove", "views": "Visualizzazioni ({0})", "view id": "ID", "view name": "Nome", "view location": "Dove", "localizations": "Localizzazioni ({0})", "localizations language id": "ID lingua", - "localizations language name": "Nome della lingua", + "localizations language name": "Nome del linguaggio", "localizations localized language name": "Nome della lingua (localizzato)", "colorThemes": "Temi colore ({0})", "iconThemes": "Temi icona ({0})", diff --git a/i18n/ita/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json b/i18n/ita/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json index 48363670d3..8a7fc438ed 100644 --- a/i18n/ita/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json @@ -8,7 +8,6 @@ ], "neverShowAgain": "Non visualizzare più questo messaggio", "searchMarketplace": "Cerca nel Marketplace", - "showLanguagePackExtensions": "Nel Marketplace sono disponibili estensioni che consentono di localizzare VS Code nelle impostazioni locali '{0}'", "dynamicWorkspaceRecommendation": "Questa estensione potrebbe essere interessante perché viene usata da altri utenti del repository {0}.", "exeBasedRecommendation": "Questa estensione è consigliata perché avete installato {0}.", "fileBasedRecommendation": "Questa estensione è raccomandata in base ai file aperti di recente.", diff --git a/i18n/ita/src/vs/workbench/parts/extensions/node/extensionsWorkbenchService.i18n.json b/i18n/ita/src/vs/workbench/parts/extensions/node/extensionsWorkbenchService.i18n.json index fc7942d850..fe2e353fbb 100644 --- a/i18n/ita/src/vs/workbench/parts/extensions/node/extensionsWorkbenchService.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/extensions/node/extensionsWorkbenchService.i18n.json @@ -10,12 +10,12 @@ "malicious": "Questa estensione è segnalata come problematica.", "installingMarketPlaceExtension": "Installazione dell'estensione dal Marketplace...", "uninstallingExtension": "Disinstallazione estensione in corso...", - "enableDependeciesConfirmation": "Se si abilita '{0}', verranno abilitate anche le relative dipendenze. Continuare?", + "enableDependeciesConfirmation": "Se si abilita un'estensione, verranno abilitate anche le relative dipendenze. Continuare?", "enable": "Sì", "doNotEnable": "No", - "disableDependeciesConfirmation": "Disabilitare solo '{0}' o anche le relative dipendenze?", - "disableOnly": "Solo", - "disableAll": "Tutto", + "disableDependeciesConfirmation": "Disabilitare anche le dipendenze dell'estensione?", + "yes": "Sì", + "no": "No", "cancel": "Annulla", "singleDependentError": "Non è possibile disabilitare l'estensione '{0}'. L'estensione '{1}' dipende da tale estensione.", "twoDependentsError": "Non è possibile disabilitare l'estensione '{0}'. Le estensioni '{1}' e '{2}' dipendono da tale estensione.", diff --git a/i18n/ita/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.i18n.json b/i18n/ita/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.i18n.json index 595160a7a9..a9b62477dd 100644 --- a/i18n/ita/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.i18n.json @@ -7,6 +7,7 @@ "Do not edit this file. It is machine generated." ], "updateLocale": "Cambiare la lingua dell'interfaccia utente di VS Code in {0} e riavviare?", + "activateLanguagePack": "Riavviare VS Code per attivare il Language Pack appena installato?", "yes": "Sì", "no": "No", "neverAgain": "Non visualizzare più questo messaggio", diff --git a/i18n/ita/src/vs/workbench/parts/localizations/electron-browser/localizationsActions.i18n.json b/i18n/ita/src/vs/workbench/parts/localizations/electron-browser/localizationsActions.i18n.json index 339538154c..77b3d8837e 100644 --- a/i18n/ita/src/vs/workbench/parts/localizations/electron-browser/localizationsActions.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/localizations/electron-browser/localizationsActions.i18n.json @@ -6,7 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "configureLocale": "Configura lingua", + "configureLocale": "Configura la lingua visualizzata", "displayLanguage": "Definisce la lingua visualizzata di VSCode.", "doc": "Per un elenco delle lingue supportate, vedere {0}.", "restart": "Se si modifica il valore, è necessario riavviare VSCode.", diff --git a/i18n/ita/src/vs/workbench/parts/markers/electron-browser/markersPanel.i18n.json b/i18n/ita/src/vs/workbench/parts/markers/electron-browser/markersPanel.i18n.json index 4ec323652b..4d92635341 100644 --- a/i18n/ita/src/vs/workbench/parts/markers/electron-browser/markersPanel.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/markers/electron-browser/markersPanel.i18n.json @@ -7,5 +7,5 @@ "Do not edit this file. It is machine generated." ], "disableFilesExclude": "Disabilita filtro di esclusione file.", - "clearFilter": "Cancella filtro." + "clearFilter": "Cancella il filtro." } \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/outline/electron-browser/outline.contribution.i18n.json b/i18n/ita/src/vs/workbench/parts/outline/electron-browser/outline.contribution.i18n.json new file mode 100644 index 0000000000..e040d38aae --- /dev/null +++ b/i18n/ita/src/vs/workbench/parts/outline/electron-browser/outline.contribution.i18n.json @@ -0,0 +1,12 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "name": "Contorno", + "category.focus": "File", + "label.focus": "Stato attivo su contorno" +} \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/outline/electron-browser/outlinePanel.i18n.json b/i18n/ita/src/vs/workbench/parts/outline/electron-browser/outlinePanel.i18n.json new file mode 100644 index 0000000000..f588ff6a2d --- /dev/null +++ b/i18n/ita/src/vs/workbench/parts/outline/electron-browser/outlinePanel.i18n.json @@ -0,0 +1,17 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "filter": "Filtro", + "collapse": "Comprimi tutto", + "sortByPosition": "Ordina per: posizione", + "sortByName": "Ordina per: Nome", + "sortByKind": "Ordina per: tipo", + "live": "Segui il cursore", + "no-editor": "Non ci sono editor aperti in grado di fornire informazioni sul contorno.", + "too-many-symbols": "Questo file è troppo grande per la visualizzazione di un contorno." +} \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/outline/electron-browser/outlineTree.i18n.json b/i18n/ita/src/vs/workbench/parts/outline/electron-browser/outlineTree.i18n.json new file mode 100644 index 0000000000..99d8204139 --- /dev/null +++ b/i18n/ita/src/vs/workbench/parts/outline/electron-browser/outlineTree.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "outline.title": "riga {0} in {1}" +} \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/output/browser/outputPanel.i18n.json b/i18n/ita/src/vs/workbench/parts/output/browser/outputPanel.i18n.json index 6dc08e99e3..caa8c77bbd 100644 --- a/i18n/ita/src/vs/workbench/parts/output/browser/outputPanel.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/output/browser/outputPanel.i18n.json @@ -6,6 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "output": "Output", "outputPanelWithInputAriaLabel": "{0}, Pannello di output", "outputPanelAriaLabel": "Pannello di output" } \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/preferences/browser/keybindingWidgets.i18n.json b/i18n/ita/src/vs/workbench/parts/preferences/browser/keybindingWidgets.i18n.json index 72d5a2db6b..089ff68a95 100644 --- a/i18n/ita/src/vs/workbench/parts/preferences/browser/keybindingWidgets.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/preferences/browser/keybindingWidgets.i18n.json @@ -6,6 +6,8 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "defineKeybinding.oneExists": "Questo tasto di scelta rapida è assegnato a 1 comando esistente", + "defineKeybinding.existing": "Questo tasto di scelta rapida è assegnato a {0} comandi esistenti", "defineKeybinding.initial": "Premere la combinazione di tasti desiderata, quindi INVIO.", "defineKeybinding.chordsTo": "premi contemporaneamente per" } \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json b/i18n/ita/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json index bf645644a0..962cbb4059 100644 --- a/i18n/ita/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json @@ -7,6 +7,7 @@ "Do not edit this file. It is machine generated." ], "openRawDefaultSettings": "Apri impostazioni predefinite non elaborate", + "openSettings2": "Apri impostazioni (anteprima)", "openSettings": "Apri impostazioni", "openGlobalSettings": "Apri impostazioni utente", "openGlobalKeybindings": "Apri tasti di scelta rapida", diff --git a/i18n/ita/src/vs/workbench/parts/preferences/browser/settingsEditor2.i18n.json b/i18n/ita/src/vs/workbench/parts/preferences/browser/settingsEditor2.i18n.json new file mode 100644 index 0000000000..dd23b2f46c --- /dev/null +++ b/i18n/ita/src/vs/workbench/parts/preferences/browser/settingsEditor2.i18n.json @@ -0,0 +1,18 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "previewWarning": "Anteprima", + "previewLabel": "Anteprima del nuovo editor impostazioni", + "SearchSettings.AriaLabel": "Cerca impostazioni", + "SearchSettings.Placeholder": "Cerca impostazioni", + "advancedCustomizationLabel": "Per personalizzazioni avanzate, aprire e modificare", + "openSettingsLabel": "settings.json", + "showOverriddenOnly": "Mostra solo i modificati", + "treeAriaLabel": "Impostazioni", + "feedbackButtonLabel": "Invia commenti e suggerimenti" +} \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/preferences/browser/settingsTree.i18n.json b/i18n/ita/src/vs/workbench/parts/preferences/browser/settingsTree.i18n.json new file mode 100644 index 0000000000..8747aaf553 --- /dev/null +++ b/i18n/ita/src/vs/workbench/parts/preferences/browser/settingsTree.i18n.json @@ -0,0 +1,19 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "modifiedItemForeground": "Colore primo piano per un'impostazione modificata.", + "workspace": "Area di lavoro", + "user": "Utente", + "resetButtonTitle": "reimposta", + "configured": "Modificato", + "alsoConfiguredIn": "Modificato anche in", + "configuredIn": "Modificato in", + "editInSettingsJson": "Modifica in settings.json", + "settingRowAriaLabel": "{0} {1}, impostazione", + "groupRowAriaLabel": "{0}, gruppo" +} \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/preferences/electron-browser/preferences.contribution.i18n.json b/i18n/ita/src/vs/workbench/parts/preferences/electron-browser/preferences.contribution.i18n.json index f9ff17c989..8bf9db9194 100644 --- a/i18n/ita/src/vs/workbench/parts/preferences/electron-browser/preferences.contribution.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/preferences/electron-browser/preferences.contribution.i18n.json @@ -7,6 +7,7 @@ "Do not edit this file. It is machine generated." ], "defaultPreferencesEditor": "Editor preferenze predefinite", + "settingsEditor2": "Editor impostazioni 2", "keybindingsEditor": "Editor tasti di scelta rapida", "preferences": "Preferenze" } \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/search/browser/searchActions.i18n.json b/i18n/ita/src/vs/workbench/parts/search/browser/searchActions.i18n.json index 83a2b2f56d..147a3ecf0e 100644 --- a/i18n/ita/src/vs/workbench/parts/search/browser/searchActions.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/search/browser/searchActions.i18n.json @@ -12,6 +12,8 @@ "previousSearchExcludePattern": "Mostra i criteri di esclusione per la ricerca precedenti", "nextSearchTerm": "Mostra il termine di ricerca successivo", "previousSearchTerm": "Mostra il termine di ricerca precedente", + "nextReplaceTerm": "Mostra il termine di ricerca/sostituzione successivo", + "previousReplaceTerm": "Mostra il termine di ricerca/sostituzione precedente", "findInFiles": "Cerca nei file", "replaceInFiles": "Sostituisci nei file", "RefreshAction.label": "Aggiorna", diff --git a/i18n/ita/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json b/i18n/ita/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json index dab16abc98..13379f4fe2 100644 --- a/i18n/ita/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json @@ -31,5 +31,5 @@ "search.followSymlinks": "Controlla se seguire i collegamenti simbolici durante la ricerca.", "search.smartCase": "Cerca in modo insensibile alle maiuscole/minuscole se il criterio è tutto minuscolo, altrimenti cerca in modalità sensibile a maiuscole/minuscole", "search.globalFindClipboard": "Controlla se il viewlet di ricerca deve leggere o modificare gli appunti di ricerca condivisi in macOS", - "search.location": "Controlla se la ricerca verrà mostrata come visualizzazione nella barra laterale o come pannello nell'area pannelli per ottenere più spazio orizzontale. Nella prossima versione la ricerca nel pannello avrà un layout orizzontale migliorato e non sarà più disponibile in anteprima." + "search.location": "Controlla se la ricerca verrà mostrata come visualizzazione nella barra laterale o come pannello nell'area pannelli per ottenere più spazio orizzontale." } \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/tasks/electron-browser/jsonSchema_v2.i18n.json b/i18n/ita/src/vs/workbench/parts/tasks/electron-browser/jsonSchema_v2.i18n.json index 6783a29e30..2e050fe8a6 100644 --- a/i18n/ita/src/vs/workbench/parts/tasks/electron-browser/jsonSchema_v2.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/tasks/electron-browser/jsonSchema_v2.i18n.json @@ -28,6 +28,7 @@ "JsonSchema.tasks.group.none": "Non assegna l'attività ad alcun gruppo", "JsonSchema.tasks.group": "Definisce il gruppo di esecuzione a cui appartiene questa attività. Supporta \"build\" per aggiungerlo al gruppo di compilazione e \"test\" per aggiungerlo al gruppo di test.", "JsonSchema.tasks.type": "Definisce se l'attività viene eseguita come un processo o come un comando all'interno di una shell.", + "JsonSchema.commandArray": "Comando della shell da eseguire. Per unire gli elementi della matrice verrà usato un carattere di spazio", "JsonSchema.command.quotedString.value": "Valore effettivo del comando", "JsonSchema.tasks.quoting.escape": "Evita i caratteri utilizzando il carattere di escape della shell (per esempio ` sotto PowerShell e \\ sotto bash).", "JsonSchema.tasks.quoting.strong": "Virgoletta l'argomento utilizzando il carattere di doppio apice della shell (per esempio \" sotto PowerShell e bash).", diff --git a/i18n/ita/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.i18n.json b/i18n/ita/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.i18n.json index 7d29432648..ad7b26fdc5 100644 --- a/i18n/ita/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.i18n.json @@ -19,6 +19,7 @@ "terminal.integrated.copyOnSelection": "Quando impostato, il testo selezionato nel terminale sarà copiato negli appunti.", "terminal.integrated.fontFamily": "Controlla la famiglia di caratteri del terminale. L'impostazione predefinita è il valore di editor.fontFamily.", "terminal.integrated.fontSize": "Consente di controllare le dimensioni del carattere in pixel del terminale.", + "terminal.integrated.letterSpacing": "Controlla la spaziatura delle lettere del terminale. Si tratta di un valore intero che rappresenta il numero di pixel da aggiungere tra i caratteri.", "terminal.integrated.lineHeight": "Controlla l'altezza della riga del terminale. Questo numero è moltiplicato per la dimensione del carattere del terminale per ottenere l'effettiva altezza della riga in pixel.", "terminal.integrated.fontWeight": "Spessore del carattere da usare nel terminale per il testo non in grassetto.", "terminal.integrated.fontWeightBold": "Spessore del carattere da usare nel terminale per il testo in grassetto.", @@ -26,7 +27,8 @@ "terminal.integrated.cursorStyle": "Controlla lo stile del cursore del terminale.", "terminal.integrated.scrollback": "Consente di controllare il numero massimo di righe che il terminale mantiene nel buffer.", "terminal.integrated.setLocaleVariables": "Controlla se le variabili delle impostazioni locali sono impostate all'avvio del terminale. Il valore predefinito è true per OS X e false per altre piattaforme.", - "terminal.integrated.rightClickBehavior": "Controlla la reazione del terminale quando viene fatto clic con il pulsante destro del mouse. Le opzioni disponibili solo 'default', 'copyPaste' e 'selectWord'. Con 'default' verrà visualizzato il menu di scelta rapida. Con 'copyPaste' verrà eseguita un'operazione di copia in presenza di una selezione o in caso contrario un'operazione di incollamento. Con 'selectWord' verrà selezionata la parola sotto il cursore e verrà visualizzato il menu di scelta rapida.", + "terminal.integrated.rendererType": "Controlla la modalità di rendering del terminale. Le opzioni sono \"canvas\" per il renderer di canvas standard (rapido), \"dom\" per il renderer di fallback basato su DOM oppure \"auto\" che consente a VS Code di individuare quello migliore. Per rendere effettiva questa impostazione, è necessario ricariare VS Code.", + "terminal.integrated.rightClickBehavior": "Controlla la reazione del terminale quando viene fatto clic con il pulsante destro del mouse. Le opzioni disponibili solo \"default\", \"copyPaste\" e \"selectWord\". Con \"default\" verrà visualizzato il menu di scelta rapida. Con \"copyPaste\" verrà eseguita un'operazione di copia in presenza di una selezione o in caso contrario un'operazione di incollamento. Con \"selectWord\" verrà selezionata la parola sotto il cursore e verrà visualizzato il menu di scelta rapida.", "terminal.integrated.cwd": "Percorso di avvio esplicito in cui verrà avviato il terminale. Viene usato come directory di lavoro corrente per il processo della shell. Può risultare particolarmente utile nelle impostazioni dell'area di lavoro se la directory radice non costituisce una directory di lavoro corrente comoda.", "terminal.integrated.confirmOnExit": "Indica se confermare all'uscita la presenza di sessioni di terminale attive.", "terminal.integrated.enableBell": "Indica se il cicalino del terminale è abilitato o meno.", diff --git a/i18n/ita/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json b/i18n/ita/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json index 42d1b0441a..9af26b9889 100644 --- a/i18n/ita/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json @@ -57,5 +57,7 @@ "workbench.action.terminal.scrollToPreviousCommand": "Scorri al comando precedente", "workbench.action.terminal.scrollToNextCommand": "Scorri al comando successivo", "workbench.action.terminal.selectToPreviousCommand": "Aggiungi selezione a comando precedente", - "workbench.action.terminal.selectToNextCommand": "Aggiungi selezione a comando successivo" + "workbench.action.terminal.selectToNextCommand": "Aggiungi selezione a comando successivo", + "workbench.action.terminal.selectToPreviousLine": "Aggiungi selezione a riga precedente", + "workbench.action.terminal.selectToNextLine": "Aggiungi selezione a riga successiva" } \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.i18n.json b/i18n/ita/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.i18n.json index e7c8e50783..343f27488e 100644 --- a/i18n/ita/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.i18n.json @@ -9,6 +9,11 @@ "terminal.integrated.a11yBlankLine": "Riga vuota", "terminal.integrated.a11yPromptLabel": "Input di terminale", "terminal.integrated.a11yTooMuchOutput": "Troppo output da annunciare. Per leggere, spostarsi manualmente nelle righe", + "yes": "Sì", + "terminal.rendererInAllNewTerminals": "Per tutti i nuovi terminali creati verrà usato il renderer non GPU.", + "no": "No", + "dontShowAgain": "Non visualizzare più questo messaggio", + "terminal.slowRendering": "Il renderer standard per il terminale integrato sembra lento nel computer. Passare al renderer alternativo basato su DOM che potrebbe offrire migliori prestazioni? [Altre informazioni sulle impostazioni del terminale](https://code.visualstudio.com/docs/editor/integrated-terminal#_changing-how-the-terminal-is-rendered).", "terminal.integrated.copySelection.noSelection": "Il terminale non contiene alcuna selezione da copiare", "terminal.integrated.exitedWithCode": "Il processo del terminale è stato terminato. Codice di uscita: {0}", "terminal.integrated.waitOnExit": "Premere un tasto qualsiasi per chiudere il terminale", diff --git a/i18n/ita/src/vs/workbench/parts/terminal/electron-browser/terminalPanel.i18n.json b/i18n/ita/src/vs/workbench/parts/terminal/electron-browser/terminalPanel.i18n.json index 327aa7f6a4..5097d262cf 100644 --- a/i18n/ita/src/vs/workbench/parts/terminal/electron-browser/terminalPanel.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/terminal/electron-browser/terminalPanel.i18n.json @@ -6,6 +6,8 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "terminal.useMonospace": "Usa 'monospace'", + "terminal.monospaceOnly": "Il terminale supporta solo tipi di carattere a spaziatura fissa.", "copy": "Copia", "split": "Dividi", "paste": "Incolla", diff --git a/i18n/ita/src/vs/workbench/parts/trust/electron-browser/unsupportedWorkspaceSettings.contribution.i18n.json b/i18n/ita/src/vs/workbench/parts/trust/electron-browser/unsupportedWorkspaceSettings.contribution.i18n.json index 77ad8ad577..5926095b5b 100644 --- a/i18n/ita/src/vs/workbench/parts/trust/electron-browser/unsupportedWorkspaceSettings.contribution.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/trust/electron-browser/unsupportedWorkspaceSettings.contribution.i18n.json @@ -6,7 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "unsupportedWorkspaceSettings": "Quest'area di lavoro contiene impostazioni che è possibile specificare solo nelle impostazioni utente ({0}). Per maggiori informazioni, fare clic [qui]({1}).", "openWorkspaceSettings": "Apri impostazioni area di lavoro", "dontShowAgain": "Non visualizzare più questo messaggio", "unsupportedWorkspaceSettings": "Quest'area di lavoro contiene impostazioni che è possibile specificare solo nelle impostazioni utente ({0}). Per maggiori informazioni, fare clic [qui]({1})." diff --git a/i18n/ita/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThrough.contribution.i18n.json b/i18n/ita/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThrough.contribution.i18n.json index d96ad810dd..65c6b57eab 100644 --- a/i18n/ita/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThrough.contribution.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThrough.contribution.i18n.json @@ -7,6 +7,5 @@ "Do not edit this file. It is machine generated." ], "walkThrough.editor.label": "Playground interattivo", - "help": "Guida", - "interactivePlayground": "Playground interattivo" + "help": "Guida" } \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/services/bulkEdit/electron-browser/bulkEditService.i18n.json b/i18n/ita/src/vs/workbench/services/bulkEdit/electron-browser/bulkEditService.i18n.json new file mode 100644 index 0000000000..b13c64b973 --- /dev/null +++ b/i18n/ita/src/vs/workbench/services/bulkEdit/electron-browser/bulkEditService.i18n.json @@ -0,0 +1,13 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "summary.0": "Non sono state effettuate modifiche", + "summary.nm": "Effettuate {0} modifiche al testo in {1} file", + "summary.n0": "Effettuate {0} modifiche al testo in un file", + "conflict": "Nel frattempo questi file sono stati modificati: {0}" +} \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/services/configuration/common/configurationExtensionPoint.i18n.json b/i18n/ita/src/vs/workbench/services/configuration/common/configurationExtensionPoint.i18n.json index bdae9b7565..85aad3a9fc 100644 --- a/i18n/ita/src/vs/workbench/services/configuration/common/configurationExtensionPoint.i18n.json +++ b/i18n/ita/src/vs/workbench/services/configuration/common/configurationExtensionPoint.i18n.json @@ -16,6 +16,7 @@ "vscode.extension.contributes.configuration": "Impostazioni di configurazione di contributes.", "invalid.title": "'configuration.title' deve essere una stringa", "invalid.properties": "'configuration.properties' deve essere un oggetto", + "invalid.property": "'configuration.property' deve essere un oggetto", "invalid.allOf": "'configuration.allOf' è deprecato e non deve più essere usato. Passare invece una matrice di sezioni di configurazione al punto di aggiunta contributo 'configuration'.", "workspaceConfig.folders.description": "Elenco di cartelle da caricare nell'area di lavoro.", "workspaceConfig.path.description": "Percorso di file, ad esempio `/root/folderA` o `./folderA` per un percorso relativo che verrà risolto in base alla posizione del file dell'area di lavoro.", diff --git a/i18n/ita/src/vs/workbench/services/configurationResolver/electron-browser/configurationResolverService.i18n.json b/i18n/ita/src/vs/workbench/services/configurationResolver/electron-browser/configurationResolverService.i18n.json index 35229bd669..39897d5e6c 100644 --- a/i18n/ita/src/vs/workbench/services/configurationResolver/electron-browser/configurationResolverService.i18n.json +++ b/i18n/ita/src/vs/workbench/services/configurationResolver/electron-browser/configurationResolverService.i18n.json @@ -5,5 +5,6 @@ "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." - ] + ], + "stringsOnlySupported": "Il comando {0} non ha restituito un risultato in formato stringa. Come risultati dei comandi usati per la sostituzione delle variabili sono supportate solo le stringhe." } \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/services/files/electron-browser/remoteFileService.i18n.json b/i18n/ita/src/vs/workbench/services/files/electron-browser/remoteFileService.i18n.json index d842f60e68..edc095a054 100644 --- a/i18n/ita/src/vs/workbench/services/files/electron-browser/remoteFileService.i18n.json +++ b/i18n/ita/src/vs/workbench/services/files/electron-browser/remoteFileService.i18n.json @@ -6,6 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "invalidPath": "Il percorso della risorsa '{0}' deve essere assoluto", "fileNotFoundError": "Il file non è stato trovato ({0})", "fileIsDirectoryError": "Il File è una Directory", "fileNotModifiedError": "File non modificato dal giorno", diff --git a/i18n/ita/src/vs/workbench/services/themes/common/fileIconThemeSchema.i18n.json b/i18n/ita/src/vs/workbench/services/themes/common/fileIconThemeSchema.i18n.json index 47ac6812f1..e78659675a 100644 --- a/i18n/ita/src/vs/workbench/services/themes/common/fileIconThemeSchema.i18n.json +++ b/i18n/ita/src/vs/workbench/services/themes/common/fileIconThemeSchema.i18n.json @@ -21,7 +21,7 @@ "schema.languageId": "ID della definizione di icona per l'associazione.", "schema.fonts": "Tipi di carattere usati nelle definizioni di icona.", "schema.id": "ID del tipo di carattere.", - "schema.src": "Posizioni del tipo di carattere.", + "schema.src": "Percorso del tipo di carattere.", "schema.font-path": "Percorso del tipo di carattere, relativo al file del tema dell'icona corrente.", "schema.font-format": "Formato del tipo di carattere.", "schema.font-weight": "Spessore del carattere.", diff --git a/i18n/jpn/extensions/configuration-editing/out/extension.i18n.json b/i18n/jpn/extensions/configuration-editing/out/extension.i18n.json index 6710539ee0..d3dafac121 100644 --- a/i18n/jpn/extensions/configuration-editing/out/extension.i18n.json +++ b/i18n/jpn/extensions/configuration-editing/out/extension.i18n.json @@ -6,5 +6,16 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "workspaceFolder": "VS Code で開いているフォルダーのパス", + "workspaceFolderBasename": "スラッシュ (/) を含まない VS Code で開いているフォルダーのパス", + "relativeFile": "${workspaceFolder} に相対的な現在開いているファイル", + "file": "現在開いているファイル", + "cwd": "タスク ランナー起動時の作業ディレクトリ", + "lineNumber": "アクティブなファイル内で選択している行の番号", + "selectedText": "アクティブなファイル内で選択しているテキスト", + "fileDirname": "現在開いているファイルのディレクトリ名", + "fileExtname": "現在開いているファイルの拡張子", + "fileBasename": "現在開いているファイルのベース名", + "fileBasenameNoExtension": "現在開いているファイルの拡張子を含まないベース名", "exampleExtension": "例" } \ No newline at end of file diff --git a/i18n/jpn/extensions/git/out/commands.i18n.json b/i18n/jpn/extensions/git/out/commands.i18n.json index 2a37bf2715..9e38217888 100644 --- a/i18n/jpn/extensions/git/out/commands.i18n.json +++ b/i18n/jpn/extensions/git/out/commands.i18n.json @@ -2,7 +2,7 @@ "": [ "--------------------------------------------------------------------------------------------", "Copyright (c) Microsoft Corporation. All rights reserved.", - "Licensed under the Source EULA. See License.txt in the project root for license information.", + "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], @@ -10,10 +10,12 @@ "remote branch at": "{0} でのリモート ブランチ", "create branch": "$(plus) 新しいブランチを作成", "repourl": "リポジトリ URL", - "parent": "親ディレクトリ", + "selectFolder": "リポジトリの場所を選択", "cloning": "Git リポジトリ '{0}' を複製しています...", - "openrepo": "リポジトリを開く", "proposeopen": "クローンしたリポジトリを開きますか?", + "openrepo": "リポジトリを開く", + "add": "ワークスペースに追加", + "proposeopen2": "複製したリポジトリを開きますか? または現在のワークスペースに追加しますか?", "init": "Git リポジトリを初期化するワークスペース フォルダーを選択してください", "init repo": "リポジトリの初期化", "create repo": "リポジトリの初期化", diff --git a/i18n/jpn/extensions/npm/out/npmView.i18n.json b/i18n/jpn/extensions/npm/out/npmView.i18n.json index 65a4786ba2..b97b06cabb 100644 --- a/i18n/jpn/extensions/npm/out/npmView.i18n.json +++ b/i18n/jpn/extensions/npm/out/npmView.i18n.json @@ -6,6 +6,9 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "npm.noDebugOptions": "スクリプトの Node デバッグ オプションが不足しているため、\"{0}\" をデバッグ起動できません。例: --inspect-brk\"。", - "npm.scriptInvalid": "スクリプト '{0}' が見つかりませんでした。ビューを更新してください。" + "noScripts": "スクリプトが見つかりません", + "noDebugOptions": "スクリプトの Node デバッグ オプションが不足しているため、\"{0}\" をデバッグ起動できません。例: --inspect-brk\"。", + "learnMore": "詳細情報", + "ok": "OK", + "scriptInvalid": "スクリプト '{0}' が見つかりませんでした。ビューを更新してください。" } \ No newline at end of file diff --git a/i18n/jpn/extensions/npm/package.i18n.json b/i18n/jpn/extensions/npm/package.i18n.json index dc9753211e..0ff30c62c2 100644 --- a/i18n/jpn/extensions/npm/package.i18n.json +++ b/i18n/jpn/extensions/npm/package.i18n.json @@ -12,15 +12,15 @@ "config.npm.runSilent": "`--silent` オプションを使用して npm コマンドを実行する。", "config.npm.packageManager": "スクリプトを実行するために使用するパッケージ マネージャー。", "config.npm.exclude": "自動スクリプト検出から除外するフォルダーの glob パターンを構成します。", - "config.npm.enableScriptExplorer": "'package.json' ファイルがワークスペースに含まれている場合、npm スクリプトのエクスプ ローラー ビューを有効にします。", + "config.npm.enableScriptExplorer": "npm スクリプトのエクスプ ローラー ビューを有効にします。", + "config.npm.scriptExplorerAction": "スクリプトエクスプローラーで使用される規定のクリックアクション: 'open' または 'run' 、規定値は 'open' です。", "npm.parseError": "npmタスク検出: ファイル {0} の解析に失敗しました", "taskdef.script": "カスタマイズする npm スクリプト。", - "taskdef.path": "スクリプトを提供する package.json ファイルのフォルダーへのパス。省略をすることができます。", + "taskdef.path": "スクリプトを提供する package.json ファイルのフォルダー パス。省略できます。", "view.name": "Npm スクリプト", "command.refresh": "最新の情報に更新", "command.run": "実行", "command.debug": "デバッグ", "command.openScript": "Open", - "npm.scriptInvalid": "スクリプト '{0}' が見つかりませんでした。ビューを更新してください。", - "npm.noDebugOptions": "スクリプトの Node デバッグ オプションが不足しているため、\"{0}\" をデバッグ起動できません。例: --inspect-brk\"。" + "command.runInstall": "インストールを実行" } \ No newline at end of file diff --git a/i18n/jpn/extensions/search-rg/package.i18n.json b/i18n/jpn/extensions/search-rg/package.i18n.json new file mode 100644 index 0000000000..dbcf08fd4e --- /dev/null +++ b/i18n/jpn/extensions/search-rg/package.i18n.json @@ -0,0 +1,11 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "displayName": "検索 (ripgrep)", + "description": "Ripgrep を使用して検索を提供します。" +} \ No newline at end of file diff --git a/i18n/jpn/extensions/typescript-language-features/out/features/updatePathsOnRename.i18n.json b/i18n/jpn/extensions/typescript-language-features/out/features/updatePathsOnRename.i18n.json new file mode 100644 index 0000000000..9c9457ec2e --- /dev/null +++ b/i18n/jpn/extensions/typescript-language-features/out/features/updatePathsOnRename.i18n.json @@ -0,0 +1,14 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "prompt": "移動したファイルの import を自動的に更新しますか: '{0}'?", + "reject.title": "いいえ", + "accept.title": "はい", + "always.title": "はい。常に import を自動的に更新します。", + "never.title": "いいえ。常に import を自動的に更新しません。" +} \ No newline at end of file diff --git a/i18n/jpn/extensions/typescript-language-features/package.i18n.json b/i18n/jpn/extensions/typescript-language-features/package.i18n.json index 9cfdd47338..63f8c98d30 100644 --- a/i18n/jpn/extensions/typescript-language-features/package.i18n.json +++ b/i18n/jpn/extensions/typescript-language-features/package.i18n.json @@ -8,8 +8,7 @@ ], "displayName": "TypeScript と JavaScript の言語機能", "description": "JavaScript と TypeScript ファイルに豊富な言語サポートを提供。", - "typescript.reloadProjects.title": "プロジェクトの再読み込み", - "javascript.reloadProjects.title": "プロジェクトの再読み込み", + "reloadProjects.title": "プロジェクトの再読み込み", "configuration.typescript": "TypeScript", "typescript.useCodeSnippetsOnMethodSuggest.dec": "パラメーター シグネチャを含む完全な関数。", "typescript.tsdk.desc": "使用する tsserver と lib*.d.ts ファイルが含まれているフォルダーのパスを指定します。", @@ -37,8 +36,7 @@ "format.placeOpenBraceOnNewLineForFunctions": "新しい行に関数の始め波かっこを配置するかどうかを定義します。", "format.placeOpenBraceOnNewLineForControlBlocks": "新しい行にコントロール ブロックの始め波かっこを配置するかどうかを定義します。", "javascript.validate.enable": "JavaScript の検証を有効/無効にします。", - "typescript.goToProjectConfig.title": "プロジェクト構成に移動", - "javascript.goToProjectConfig.title": "プロジェクト構成に移動", + "goToProjectConfig.title": "プロジェクト構成に移動", "javascript.referencesCodeLens.enabled": "JavaScript ファイル内で CodeLens の参照を有効/無効にします。", "typescript.referencesCodeLens.enabled": "TypeScript ファイル内で CodeLens の参照を有効/無効にします。TypeScript 2.0.6 以上が必要です。", "typescript.implementationsCodeLens.enabled": "CodeLens の実装を有効/無効にします。TypeScript 2.2.0 以上が必要です。", @@ -47,7 +45,7 @@ "typescript.selectTypeScriptVersion.title": "TypeScript のバージョンの選択", "typescript.reportStyleChecksAsWarnings": "スタイルチェックレポートを警告扱いとする", "jsDocCompletion.enabled": " 自動 JSDoc コメントを有効/無効にします", - "javascript.implicitProjectConfig.checkJs": "JavaScript ファイルのセマンティック チェックを有効/無効にします。既存の jsconfi.json や tsconfi.json ファイルの設定はこれより優先されます。TypeScript は 2.3.1 以上である必要があります。", + "javascript.implicitProjectConfig.checkJs": "JavaScript ファイルのセマンティック チェックを有効/無効にします。既存の jsconfig.json や tsconfig.json ファイルの設定はこれより優先されます。TypeScript は 2.3.1 以上が必要です。", "typescript.npm": "型定義の自動取得に使用される NPM 実行可能ファイルへのパスを指定します。TypeScript 2.3.4 以上が必要です。", "typescript.check.npmIsInstalled": "型定義の自動取得に NPM がインストールされているかどうかを確認します。", "javascript.nameSuggestions": "JavaScript の候補リスト内でファイルから一意の名前を含むかどうかを有効/無効にします。", @@ -55,11 +53,15 @@ "typescript.problemMatchers.tsc.label": "TypeScript の問題", "typescript.problemMatchers.tscWatch.label": "TypeScript の問題 (ウォッチ モード)", "typescript.quickSuggestionsForPaths": "Import パスを入力するときのクイック候補を有効/無効にします。", - "typescript.locale": "TypeScript のエラーを報告するために使用するロケールを設定します。TypeScript 2.6.0 以上が必要です。'null' の規定値は TypeScript のエラーに VS Code のロケールを使用します。", - "javascript.implicitProjectConfig.experimentalDecorators": "プロジェクト外の JavaScript ファイルの 'experimentalDecorators' を有効/無効にします。既存の jsconfi.json や tsconfi.json ファイルの設定はこれより優先されます。TypeScript は 2.3.1 以上である必要があります。", + "typescript.locale": "JavaScript と TypeScript のエラーを報告するために使用するロケールを設定します。TypeScript は 2.6.0 以上が必要です。'null' の既定値では VS Code のロケールを使用します。", + "javascript.implicitProjectConfig.experimentalDecorators": "プロジェクト外の JavaScript ファイルの 'experimentalDecorators' を有効/無効にします。既存の jsconfi.json や tsconfi.json ファイルの設定はこれより優先されます。TypeScript は 2.3.1 以上が必要です。", "typescript.autoImportSuggestions.enabled": "自動 import 提案を有効/無効にします。TypeScript 2.6.1 以上が必要です", "typescript.experimental.syntaxFolding": "構文の折りたたみマーカー認識を有効/無効にします。", "taskDefinition.tsconfig.description": "TS ビルドを定義する tsconfig ファイル。", "javascript.suggestionActions.enabled": "エディター内で JavaScript ファイルの診断の提案を有効または無効にします。TypeScript 2.8 以上である必要があります。", - "typescript.suggestionActions.enabled": "エディター内で TypeScript ファイルの診断の提案を有効または無効にします。TypeScript 2.8 以上である必要があります。" + "typescript.suggestionActions.enabled": "エディター内で TypeScript ファイルの提案診断を有効/無効にします。TypeScript 2.8 以上が必要です", + "typescript.preferences.quoteStyle": "クイック修正に使用するのに好ましい引用符のスタイル: 'single' 引用符、'double' 引用符、既存の import から種類を推測する 'auto'。TypeScript 2.9 以上が必要です", + "typescript.preferences.importModuleSpecifier": "自動 import で優先されるパスのスタイル:\n- ファイルの場所に相対的な \"relative\"。\n- 'jsconfig.json' / 'tsconfig.json' で構成されている 'baseUrl' に基づく \"non-relative\"。\n- 最短のパス型を推論する \"auto\"。\nTypeScript 2.9 以上が必要です", + "typescript.showUnused": "コード内で使用されていない変数の強調表示を有効/無効にします。TypeScript 2.9 以上が必要です。", + "typescript.updateImportsOnFileMove.enabled": "VS Code でファイルの名前変更や移動するときの import パスの自動的な更新を有効/無効にします。有効な値は: 名前変更時に確認をする 'prompt'、常に自動的にパスを更新する 'always'、パスの名前を変更せず確認も行わない 'never' です。TypeScript 2.9 以上が必要です。" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/base/node/processes.i18n.json b/i18n/jpn/src/vs/base/node/processes.i18n.json index a5e43e509d..199e9aa539 100644 --- a/i18n/jpn/src/vs/base/node/processes.i18n.json +++ b/i18n/jpn/src/vs/base/node/processes.i18n.json @@ -6,5 +6,5 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "TaskRunner.UNC": "UNC ドライブ上のシェル コマンドを実行できません。" + "TaskRunner.UNC": "UNC ドライブ上でシェル コマンドを実行できません。" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/base/node/zip.i18n.json b/i18n/jpn/src/vs/base/node/zip.i18n.json index 005cfd7640..0e7e212635 100644 --- a/i18n/jpn/src/vs/base/node/zip.i18n.json +++ b/i18n/jpn/src/vs/base/node/zip.i18n.json @@ -6,6 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "incompleteExtract": "不完全。{0} / {1} 個のエントリが抽出されました", + "incompleteExtract": "不完全です。{0} / {1} 個のエントリが見つかりました", "notFound": "zip ファイルの中に {0} が見つかりません。" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/code/electron-browser/issue/issueReporterMain.i18n.json b/i18n/jpn/src/vs/code/electron-browser/issue/issueReporterMain.i18n.json index 5cd44ec9ec..aefc511148 100644 --- a/i18n/jpn/src/vs/code/electron-browser/issue/issueReporterMain.i18n.json +++ b/i18n/jpn/src/vs/code/electron-browser/issue/issueReporterMain.i18n.json @@ -6,6 +6,8 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "hide": "非表示", + "show": "表示", "previewOnGitHub": "GitHub 上でプレビュー", "loadingData": "データを読み込んでいます...", "rateLimited": "GitHub クエリの制限を超えました。お待ちください。", diff --git a/i18n/jpn/src/vs/code/electron-browser/issue/issueReporterPage.i18n.json b/i18n/jpn/src/vs/code/electron-browser/issue/issueReporterPage.i18n.json index 06d09e1c61..0b1e88174f 100644 --- a/i18n/jpn/src/vs/code/electron-browser/issue/issueReporterPage.i18n.json +++ b/i18n/jpn/src/vs/code/electron-browser/issue/issueReporterPage.i18n.json @@ -17,13 +17,12 @@ "issueTitleLabel": "題名", "issueTitleRequired": "題名を入力してください", "titleLengthValidation": "タイトルが長すぎます。", - "systemInfo": "私のシステム情報", - "sendData": "データを送信する", - "processes": "現在実行中のプロセス", - "workspaceStats": "私のワークスペースのステータス", - "extensions": "私の拡張機能", - "searchedExtensions": "見つかった拡張機能", - "settingsSearchDetails": "設定検索の詳細", "details": "詳細を入力してください。", - "loadingData": "データを読み込んでいます..." + "sendSystemInfo": "自分のシステム情報 ({0}) を含める", + "show": "表示", + "sendProcessInfo": "自分が現在実行中のプロセス ({0}) を含める", + "sendWorkspaceInfo": "自分のワークスペースのメタデータ ({0}) を含める", + "sendExtensions": "自分の利用可能な拡張機能 ({0}) を含める", + "sendSearchedExtensions": "検索された拡張機能 ({0}) を送信する", + "sendSettingsSearchDetails": "設定検索の詳細 ({0}) を送信する" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/code/electron-browser/processExplorer/processExplorerMain.i18n.json b/i18n/jpn/src/vs/code/electron-browser/processExplorer/processExplorerMain.i18n.json index fb628eb4d5..d8aef7839d 100644 --- a/i18n/jpn/src/vs/code/electron-browser/processExplorer/processExplorerMain.i18n.json +++ b/i18n/jpn/src/vs/code/electron-browser/processExplorer/processExplorerMain.i18n.json @@ -11,5 +11,7 @@ "pid": "pid", "name": "名前", "killProcess": "プロセスの終了", - "forceKillProcess": "プロセスの強制終了" + "forceKillProcess": "プロセスの強制終了", + "copy": "コピー", + "copyAll": "すべてコピー" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/code/electron-main/menus.i18n.json b/i18n/jpn/src/vs/code/electron-main/menus.i18n.json index 34246feba0..a361abbfef 100644 --- a/i18n/jpn/src/vs/code/electron-main/menus.i18n.json +++ b/i18n/jpn/src/vs/code/electron-main/menus.i18n.json @@ -88,7 +88,6 @@ "miToggleDebugConsole": "デバッグ コンソール(&&B)", "miToggleIntegratedTerminal": "統合ターミナル(&&I)", "miMarker": "問題(&&P)", - "miAdditionalViews": "その他のビュー(&&V)", "miCommandPalette": "コマンド パレット(&&C)...", "miOpenView": "ビューを開く... &&O", "miToggleFullScreen": "全画面表示の切り替え(&&F)", @@ -119,7 +118,7 @@ "miNextEditorInGroup": "グループ内の次の使用されているエディター(&&N)", "miPreviousEditorInGroup": "グループ内の前の使用されているエディター(&&P)", "miSwitchEditor": "エディターの切り替え(&&E)", - "miFocusFirstGroup": "最初のグループ(&&F)", + "miFocusFirstGroup": "1 番目のグループ(&&F)", "miFocusSecondGroup": "2 番目のグループ(&&S)", "miFocusThirdGroup": "3 番目のグループ(&&T)", "miNextGroup": "次のグループ(&&N)", @@ -144,7 +143,7 @@ "miContinue": "続行(&&C)", "miToggleBreakpoint": "ブレークポイントの切り替え(&&B)", "miConditionalBreakpoint": "条件付きブレークポイント(&&C)...", - "miColumnBreakpoint": "列のブレークポイント(&&O)", + "miInlineBreakpoint": "インライン ブレークポイント(&&O)", "miFunctionBreakpoint": "関数のブレークポイント(&&F)...", "miLogPoint": "ログポイント(&&L)", "miNewBreakpoint": "新しいブレークポイント(&&N)", diff --git a/i18n/jpn/src/vs/editor/browser/widget/codeEditorWidget.i18n.json b/i18n/jpn/src/vs/editor/browser/widget/codeEditorWidget.i18n.json new file mode 100644 index 0000000000..f29a4df99e --- /dev/null +++ b/i18n/jpn/src/vs/editor/browser/widget/codeEditorWidget.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "cursors.maximum": "カーソルの数は {0} 個に制限されています。" +} \ No newline at end of file diff --git a/i18n/jpn/src/vs/editor/common/config/commonEditorConfig.i18n.json b/i18n/jpn/src/vs/editor/common/config/commonEditorConfig.i18n.json index ff6a459c07..d5981f3f60 100644 --- a/i18n/jpn/src/vs/editor/common/config/commonEditorConfig.i18n.json +++ b/i18n/jpn/src/vs/editor/common/config/commonEditorConfig.i18n.json @@ -26,6 +26,7 @@ "detectIndentation": "ファイルを開くと、そのファイルの内容に基づいて `editor.tabSize` と `editor.insertSpaces` が検出されます。", "roundedSelection": "選択範囲の角を丸くするかどうかを制御します", "scrollBeyondLastLine": "エディターで最後の行を越えてスクロールするかどうかを制御します", + "scrollBeyondLastColumn": "エディターが水平方向に余分にスクロールする文字数を制御します", "smoothScrolling": "アニメーションでエディターをスクロールするかどうかを制御します", "minimap.enabled": "ミニマップを表示するかどうかを制御します", "minimap.side": "ミニマップを表示する場所を制御します。", @@ -41,7 +42,7 @@ "wordWrap.bounded": "ビューポートと 'editor.wordWrapColumn' の最小値で行を折り返します。", "wordWrap": "行の折り返し方法を制御します。次の値を指定できます。\n - 'off' (折り返さない),\n - 'on' (ビューポート折り返し),\n - 'wordWrapColumn' ('editor.wordWrapColumn' で折り返し) or\n - 'bounded' (ビューポートと 'editor.wordWrapColumn' の最小値で折り返し).", "wordWrapColumn": "'editor.wordWrap' が 'wordWrapColumn' または 'bounded' の場合に、エディターの折り返し桁を制御します。", - "wrappingIndent": "折り返し行のインデントを制御します。'none'、'same'、または 'indent' のいずれかを指定できます。", + "wrappingIndent": "折り返し行のインデントを制御します。'none'、'same'、'indent' または 'deepIndent' のいずれかを指定できます。", "mouseWheelScrollSensitivity": "マウス ホイール スクロール イベントの `deltaX` と `deltaY` で使用される乗数", "multiCursorModifier.ctrlCmd": "Windows および Linux 上の `Control` キーと macOS 上の `Command` キーに割り当てます。", "multiCursorModifier.alt": "Windows および Linux 上の `Alt` キーと macOS 上の `Option` キーに割り当てます。", diff --git a/i18n/jpn/src/vs/editor/common/view/editorColorRegistry.i18n.json b/i18n/jpn/src/vs/editor/common/view/editorColorRegistry.i18n.json index a111c73efa..95e7fca612 100644 --- a/i18n/jpn/src/vs/editor/common/view/editorColorRegistry.i18n.json +++ b/i18n/jpn/src/vs/editor/common/view/editorColorRegistry.i18n.json @@ -32,6 +32,7 @@ "infoBorder": "エディターで情報を示す波線の境界線の色。", "hintForeground": "エディターでヒントを示す波線の前景色。", "hintBorder": "エディターでヒントを示す波線の境界線の色。", + "unnecessaryForeground": "エディターの中で不要なコードを示す前景色。", "overviewRulerRangeHighlight": "範囲を強調表示するときの概要ルーラーのマーカー色。この色は下地の色に紛れないよう不明瞭であってはいけません。", "overviewRuleError": "エラーを示す概要ルーラーのマーカー色。", "overviewRuleWarning": "警告を示す概要ルーラーのマーカー色。", diff --git a/i18n/jpn/src/vs/editor/contrib/fontZoom/fontZoom.i18n.json b/i18n/jpn/src/vs/editor/contrib/fontZoom/fontZoom.i18n.json new file mode 100644 index 0000000000..138aaa20e3 --- /dev/null +++ b/i18n/jpn/src/vs/editor/contrib/fontZoom/fontZoom.i18n.json @@ -0,0 +1,12 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "EditorFontZoomIn.label": "エディターのフォントを拡大", + "EditorFontZoomOut.label": "エディターのフォントを縮小", + "EditorFontZoomReset.label": "エディターのフォントのズームをリセット" +} \ No newline at end of file diff --git a/i18n/jpn/src/vs/editor/contrib/goToDefinition/goToDefinitionCommands.i18n.json b/i18n/jpn/src/vs/editor/contrib/goToDefinition/goToDefinitionCommands.i18n.json new file mode 100644 index 0000000000..45c062ceeb --- /dev/null +++ b/i18n/jpn/src/vs/editor/contrib/goToDefinition/goToDefinitionCommands.i18n.json @@ -0,0 +1,25 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "noResultWord": "'{0}' の定義は見つかりません", + "generic.noResults": "定義が見つかりません", + "meta.title": " – {0} 個の定義", + "actions.goToDecl.label": "定義へ移動", + "actions.goToDeclToSide.label": "定義を横に開く", + "actions.previewDecl.label": "定義をここに表示", + "goToImplementation.noResultWord": "'{0}' の実装が見つかりません", + "goToImplementation.generic.noResults": "実装が見つかりません", + "meta.implementations.title": "– {0} 個の実装", + "actions.goToImplementation.label": "実装に移動", + "actions.peekImplementation.label": "実装のプレビュー", + "goToTypeDefinition.noResultWord": "'{0}' の型定義が見つかりません", + "goToTypeDefinition.generic.noResults": "型定義が見つかりません", + "meta.typeDefinitions.title": " – {0} 個の型定義", + "actions.goToTypeDefinition.label": "型定義へ移動", + "actions.peekTypeDefinition.label": "型定義を表示" +} \ No newline at end of file diff --git a/i18n/jpn/src/vs/editor/contrib/goToDefinition/goToDefinitionMouse.i18n.json b/i18n/jpn/src/vs/editor/contrib/goToDefinition/goToDefinitionMouse.i18n.json new file mode 100644 index 0000000000..6d3fcaf1cd --- /dev/null +++ b/i18n/jpn/src/vs/editor/contrib/goToDefinition/goToDefinitionMouse.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "multipleResults": "クリックして、{0} の定義を表示します。" +} \ No newline at end of file diff --git a/i18n/jpn/src/vs/editor/contrib/gotoError/gotoError.i18n.json b/i18n/jpn/src/vs/editor/contrib/gotoError/gotoError.i18n.json index d6f37d9e89..b81bc58365 100644 --- a/i18n/jpn/src/vs/editor/contrib/gotoError/gotoError.i18n.json +++ b/i18n/jpn/src/vs/editor/contrib/gotoError/gotoError.i18n.json @@ -7,5 +7,7 @@ "Do not edit this file. It is machine generated." ], "markerAction.next.label": "次の問題 (エラー、警告、情報) へ移動", - "markerAction.previous.label": "前の問題 (エラー、警告、情報) へ移動" + "markerAction.previous.label": "前の問題 (エラー、警告、情報) へ移動", + "markerAction.nextInFiles.label": "ファイル内の次の問題 (エラー、警告、情報) へ移動", + "markerAction.previousInFiles.label": "ファイル内の前の問題 (エラー、警告、情報) へ移動" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/editor/contrib/indentation/indentation.i18n.json b/i18n/jpn/src/vs/editor/contrib/indentation/indentation.i18n.json index 3c1f5fd986..ad7a40fbe4 100644 --- a/i18n/jpn/src/vs/editor/contrib/indentation/indentation.i18n.json +++ b/i18n/jpn/src/vs/editor/contrib/indentation/indentation.i18n.json @@ -13,5 +13,6 @@ "indentUsingTabs": "タブによるインデント", "indentUsingSpaces": "スペースによるインデント", "detectIndentation": "内容からインデントを検出", - "editor.reindentlines": "行の再インデント" + "editor.reindentlines": "行の再インデント", + "editor.reindentselectedlines": "選択行を再インデント" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json b/i18n/jpn/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json index 91e8cedc8a..64efa1b1db 100644 --- a/i18n/jpn/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json +++ b/i18n/jpn/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json @@ -25,8 +25,6 @@ "uninstallDependeciesConfirmation": "'{0}' のみをアンインストールしますか、または依存関係もアンインストールしますか?", "uninstallOnly": "拡張機能のみ", "uninstallAll": "すべてアンインストール", - "uninstallConfirmation": "'{0}' をアンインストールしてもよろしいですか?", - "ok": "OK", "singleDependentError": "拡張機能 '{0}' をアンインストールできません。拡張機能 '{1}' がこの拡張機能に依存しています。", "twoDependentsError": "拡張機能 '{0}' をアンインストールできません。拡張機能 '{1}' と '{2}' がこの拡張機能に依存しています。", "multipleDependentsError": "拡張機能 '{0}' をアンインストールできません。拡張機能 '{1}'、'{2}'、その他がこの拡張機能に依存しています。", diff --git a/i18n/jpn/src/vs/platform/node/minimalTranslations.i18n.json b/i18n/jpn/src/vs/platform/node/minimalTranslations.i18n.json new file mode 100644 index 0000000000..2d79fb7e0f --- /dev/null +++ b/i18n/jpn/src/vs/platform/node/minimalTranslations.i18n.json @@ -0,0 +1,13 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "showLanguagePackExtensions": "VS Codeは{0}で使用可能です。 初めに Marketplace で言語パックを検索してください。", + "searchMarketplace": "Marketplace を検索", + "installAndRestartMessage": "VS Codeは{0}で使用可能です。 初めに言語パックをインストールしてください。再起動が必要です。", + "installAndRestart": "インストールし再起動する" +} \ No newline at end of file diff --git a/i18n/jpn/src/vs/platform/theme/common/colorRegistry.i18n.json b/i18n/jpn/src/vs/platform/theme/common/colorRegistry.i18n.json index 2352214efc..842bb83c71 100644 --- a/i18n/jpn/src/vs/platform/theme/common/colorRegistry.i18n.json +++ b/i18n/jpn/src/vs/platform/theme/common/colorRegistry.i18n.json @@ -16,7 +16,7 @@ "selectionBackground": "ワークベンチ内のテキスト選択の背景色 (例: 入力フィールドやテキストエリア)。エディター内の選択には適用されないことに注意してください。", "textSeparatorForeground": "テキストの区切り文字の色。", "textLinkForeground": "テキスト内のリンクの前景色。", - "textLinkActiveForeground": "テキスト内のアクティブなリンクの前景色。", + "textLinkActiveForeground": "クリックされたときとマウスをホバーしたときのテキスト内のリンクの前景色。", "textPreformatForeground": "フォーマット済みテキスト セグメントの前景色。", "textBlockQuoteBackground": "テキスト内のブロック引用の背景色。", "textBlockQuoteBorder": "テキスト内のブロック引用の境界線色。", @@ -48,6 +48,8 @@ "listDropBackground": "マウス操作で項目を移動するときのツリーリスト ドラッグ アンド ドロップの背景。", "highlight": "ツリーリスト内を検索しているとき、一致した強調のツリーリスト前景色。", "invalidItemForeground": "無効な項目のツリーリストの前景色。たとえばエクスプローラーの未解決なルート。", + "listErrorForeground": "エラーを含むリスト項目の前景色。", + "listWarningForeground": "警告が含まれるリスト項目の前景色。", "pickerGroupForeground": "ラベルをグループ化するためのクリック選択の色。", "pickerGroupBorder": "境界線をグループ化するためのクイック選択の色。", "buttonForeground": "ボタンの前景色。", @@ -58,7 +60,7 @@ "scrollbarShadow": "ビューがスクロールされたことを示すスクロール バーの影。", "scrollbarSliderBackground": "スクロール バーのスライダーの背景色。", "scrollbarSliderHoverBackground": "ホバー時のスクロール バー スライダー背景色。", - "scrollbarSliderActiveBackground": "アクティブ時のスクロール バー スライダー背景色。", + "scrollbarSliderActiveBackground": "クリック時のスクロール バー スライダー背景色。", "progressBarBackground": "時間のかかる操作で表示するプログレス バーの背景色。", "editorBackground": "エディターの背景色。", "editorForeground": "エディターの既定の前景色。", @@ -75,6 +77,7 @@ "editorFindMatchBorder": "現在の検索一致項目の境界線の色。", "findMatchHighlightBorder": "他の検索一致項目の境界線の色。", "findRangeHighlightBorder": "検索を制限する範囲の境界線の色。下にある装飾を隠さないために、色は不透過であってはなりません。", + "findWidgetResizeBorder": "検索ウィジェットのサイズ変更バーの境界線の色。", "hoverHighlight": "ホバーが表示されているワードの下を強調表示します。下にある装飾を隠さないために、色は不透過であってはなりません。", "hoverBackground": "エディター ホバーの背景色。", "hoverBorder": "エディター ホバーの境界線の色。", diff --git a/i18n/jpn/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.i18n.json b/i18n/jpn/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.i18n.json index 710b493051..cb7d4b5186 100644 --- a/i18n/jpn/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.i18n.json +++ b/i18n/jpn/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.i18n.json @@ -6,5 +6,5 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "confirmUrl": "{0} 拡張機能に次の URL を開かせますか?" + "confirmUrl": "拡張機能がこの URL を開くことを許可しますか?" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json b/i18n/jpn/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json index a21d309305..ee5ed252d7 100644 --- a/i18n/jpn/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json +++ b/i18n/jpn/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json @@ -8,13 +8,12 @@ ], "vscode.extension.contributes.views.containers.id": "'views' コントリビューション ポイントを使用して提供できるコンテナを識別するための一意の ID", "vscode.extension.contributes.views.containers.title": "コンテナーの表示に使用する、人が判別できる文字列", - "vscode.extension.contributes.views.containers.icon": "コンテナ アイコンのパス。アイコンは、50x40 の四角形の中心に配置された 24x24 のサイズで、'rgb(215, 218, 224)' または '#d7dae0' の色で塗りつぶされます。アイコンでは、任意の種類の画像を使用できますが、SVG にすることをお勧めします。", + "vscode.extension.contributes.views.containers.icon": "コンテナ アイコンのパス。アイコンは、50x40 のブロックの中心に配置された 24x24 のサイズで、'rgb(215, 218, 224)' または '#d7dae0' の色で塗りつぶされます。アイコンでは、任意の種類の画像を使用できますが、SVG にすることをお勧めします。", "vscode.extension.contributes.viewsContainers": "ビュー コンテナをエディターに提供します", "views.container.activitybar": "アクティビティ バーにビュー コンテナを提供します", "test": "テスト", - "proposed": "'viewsContainers' コントリビューションは、dev または次のコマンド ライン スイッチを使用しているときにのみ用いることができます: --enable-proposed-api {0}", "requirearray": "ビュー コンテナは配列である必要があります", - "requireidstring": "プロパティ '{0}' は必須で、'string' 型でなければなりません。使用できるのは、半角英数字、'_'、'-' のみです。", + "requireidstring": "プロパティ '{0}' は必須で、'string' 型でなければなりません。英数字と '_' , '-' のみが使用できます。", "requirestring": " `{0}` プロパティは必須で、`string` 型でなければなりません", "showViewlet": "{0} を表示", "view": "表示" diff --git a/i18n/jpn/src/vs/workbench/browser/actions/workspaceActions.i18n.json b/i18n/jpn/src/vs/workbench/browser/actions/workspaceActions.i18n.json index aee3d3c40a..a365424a50 100644 --- a/i18n/jpn/src/vs/workbench/browser/actions/workspaceActions.i18n.json +++ b/i18n/jpn/src/vs/workbench/browser/actions/workspaceActions.i18n.json @@ -15,5 +15,5 @@ "saveWorkspace": "ワークスペースを保存", "openWorkspaceAction": "ワークスペースを開く...", "openWorkspaceConfigFile": "ワークスペースの構成ファイルを開く", - "openFolderAsWorkspaceInNewWindow": "新しいウィンドウでワークスペースとしてフォルダーを開く" + "duplicateWorkspaceInNewWindow": "新しいウィンドウでワークスペースを複製" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/browser/parts/editor/editorActions.i18n.json b/i18n/jpn/src/vs/workbench/browser/parts/editor/editorActions.i18n.json index bdeb6f3c80..2aecee7a52 100644 --- a/i18n/jpn/src/vs/workbench/browser/parts/editor/editorActions.i18n.json +++ b/i18n/jpn/src/vs/workbench/browser/parts/editor/editorActions.i18n.json @@ -37,7 +37,7 @@ "navigateLast": "戻る", "reopenClosedEditor": "閉じたエディターを再度開く", "clearRecentFiles": "最近開いた項目をクリア", - "showEditorsInFirstGroup": "最初のグループのエディターを表示する", + "showEditorsInFirstGroup": "1 番目のグループのエディターを表示する", "showEditorsInSecondGroup": "2 番目のグループでエディターを表示する", "showEditorsInThirdGroup": "3 番目のグループのエディターを表示する", "showAllEditors": "すべてのエディターを表示する", diff --git a/i18n/jpn/src/vs/workbench/browser/parts/panel/panelPart.i18n.json b/i18n/jpn/src/vs/workbench/browser/parts/panel/panelPart.i18n.json index a86197c012..a8fe6e6f73 100644 --- a/i18n/jpn/src/vs/workbench/browser/parts/panel/panelPart.i18n.json +++ b/i18n/jpn/src/vs/workbench/browser/parts/panel/panelPart.i18n.json @@ -1,8 +1,10 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the Source EULA. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ -// Do not edit this file. It is machine generated. { - "panelSwitcherBarAriaLabel": "アクティブ パネル スイッチャー" + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "hidePanel": "パネルを非表示" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/browser/parts/quickopen/quickOpenController.i18n.json b/i18n/jpn/src/vs/workbench/browser/parts/quickopen/quickOpenController.i18n.json index 03b017e676..43a63eb5a4 100644 --- a/i18n/jpn/src/vs/workbench/browser/parts/quickopen/quickOpenController.i18n.json +++ b/i18n/jpn/src/vs/workbench/browser/parts/quickopen/quickOpenController.i18n.json @@ -6,8 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "inputModeEntryDescription": "{0} ('Enter' を押して確認するか 'Escape' を押して取り消します)", - "inputModeEntry": "'Enter' を押して入力を確認するか 'Escape' を押して取り消します", "emptyPicks": "選べるエントリがありません", "quickOpenInput": "'?' と入力すると、ここで実行できる処理に関するヘルプが表示されます", "historyMatches": "最近開いたもの", diff --git a/i18n/jpn/src/vs/workbench/browser/parts/views/viewsViewlet.i18n.json b/i18n/jpn/src/vs/workbench/browser/parts/views/viewsViewlet.i18n.json index 5890c2ab70..f683624fc4 100644 --- a/i18n/jpn/src/vs/workbench/browser/parts/views/viewsViewlet.i18n.json +++ b/i18n/jpn/src/vs/workbench/browser/parts/views/viewsViewlet.i18n.json @@ -6,5 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "cannot toggle": "このビュー {0} は表示/非表示を切り替えることができません。", + "cannot show": "ビュー {0} は 'when' 条件によって隠されているため表示できません", "hideView": "非表示" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/common/theme.i18n.json b/i18n/jpn/src/vs/workbench/common/theme.i18n.json index fe8013c859..22b670a3a3 100644 --- a/i18n/jpn/src/vs/workbench/common/theme.i18n.json +++ b/i18n/jpn/src/vs/workbench/common/theme.i18n.json @@ -11,8 +11,10 @@ "tabHoverBackground": "ホバー時のタブの背景色。タブはエディター領域におけるエディターのコンテナです。1 つのエディター グループで複数のタブを開くことができます。エディター グループを複数にすることもできます。", "tabUnfocusedHoverBackground": "ホバー時のフォーカスされていないグループ内のタブの背景色。タブはエディター領域におけるエディターのコンテナです。1 つのエディター グループで複数のタブを開くことができます。エディター グループを複数にすることもできます。", "tabBorder": "タブ同士を分けるための境界線。タブはエディター領域内にあるエディターのコンテナーです。複数のタブを 1 つのエディター グループで開くことができます。複数のエディター グループがある可能性があります。", - "tabActiveBorder": "アクティブなタブを強調表示するための境界線。タブはエディター領域内にあるエディターのコンテナーです。複数のタブを 1 つのエディター グループで開くことができます。複数のエディター グループがある可能性があります。", - "tabActiveUnfocusedBorder": "フォーカスされていないグループ内のアクティブ タブを強調表示するための境界線。タブはエディター領域内にあるエディターのコンテナーです。複数のタブを 1 つのエディター グループで開くことができます。複数のエディター グループがある可能性があります。", + "tabActiveBorder": "アクティブなタブの下部の境界線。タブはエディター領域内にあるエディターのコンテナーです。複数のタブを 1 つのエディター グループで開くことができます。複数のエディター グループがある可能性があります。", + "tabActiveBorderTop": "アクティブなタブの上部の境界線。タブはエディター領域内にあるエディターのコンテナーです。複数のタブを 1 つのエディター グループで開くことができます。複数のエディター グループがある可能性があります。", + "tabActiveUnfocusedBorder": "フォーカスされていないグループ内で、アクティブなタブの下部の境界線。タブはエディター領域内にあるエディターのコンテナーです。複数のタブを 1 つのエディター グループで開くことができます。複数のエディター グループがある可能性があります。", + "tabActiveUnfocusedBorderTop": "フォーカスされていないグループ内で、アクティブなタブの上部の境界線。タブはエディター領域内にあるエディターのコンテナーです。複数のタブを 1 つのエディター グループで開くことができます。複数のエディター グループがある可能性があります。", "tabHoverBorder": "ホバー時のタブを強調表示するための境界線。タブはエディター領域内にあるエディターのコンテナーです。複数のタブを 1 つのエディター グループで開くことができます。複数のエディター グループがある可能性があります。", "tabUnfocusedHoverBorder": "ホバー時のフォーカスされていないグループ内のタブを強調表示するための境界線。タブはエディター領域内にあるエディターのコンテナーです。複数のタブを 1 つのエディター グループで開くことができます。複数のエディター グループがある可能性があります。", "tabActiveForeground": "アクティブ グループ内のアクティブ タブの前景色。タブはエディター領域におけるエディターのコンテナーです。1 つのエディター グループで複数のタブを開くことができます。エディター グループを複数にすることもできます。", diff --git a/i18n/jpn/src/vs/workbench/parts/codeEditor/electron-browser/largeFileOptimizations.i18n.json b/i18n/jpn/src/vs/workbench/parts/codeEditor/electron-browser/largeFileOptimizations.i18n.json new file mode 100644 index 0000000000..370ce49161 --- /dev/null +++ b/i18n/jpn/src/vs/workbench/parts/codeEditor/electron-browser/largeFileOptimizations.i18n.json @@ -0,0 +1,13 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "largeFile": "{0}: トークン化、折り返し、折りたたみは、メモリの使用量を減らしてフリーズやクラッシュを回避するために、この大きいファイルで無効化されています。", + "neverShowAgain": "OK、今後は表示しない", + "removeOptimizations": "強制的に機能を有効化", + "reopenFilePrompt": "この設定を有効にするためにファイルを再度開いてください。" +} \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/debug/browser/breakpointsView.i18n.json b/i18n/jpn/src/vs/workbench/parts/debug/browser/breakpointsView.i18n.json index 563331d9b6..24b7053292 100644 --- a/i18n/jpn/src/vs/workbench/parts/debug/browser/breakpointsView.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/debug/browser/breakpointsView.i18n.json @@ -8,7 +8,7 @@ ], "logPoint": "ログポイント", "breakpoint": "ブレークポイント", - "editBreakpoint": "{0} を編集", + "editBreakpoint": "{0} を編集...", "removeBreakpoint": "{0} を削除", "functionBreakpointsNotSupported": "このデバッグの種類では関数ブレークポイントはサポートされていません", "functionBreakpointPlaceholder": "中断対象の関数", diff --git a/i18n/jpn/src/vs/workbench/parts/debug/browser/debugActions.i18n.json b/i18n/jpn/src/vs/workbench/parts/debug/browser/debugActions.i18n.json index 1582dc356e..28b58d8046 100644 --- a/i18n/jpn/src/vs/workbench/parts/debug/browser/debugActions.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/debug/browser/debugActions.i18n.json @@ -41,7 +41,7 @@ "debugConsoleAction": "デバッグ コンソール", "unreadOutput": "デバッグ コンソールでの新しい出力", "debugFocusConsole": "デバッグ コンソールにフォーカスを移動", - "focusProcess": "フォーカスのプロセス", + "focusSession": "セッションにフォーカス", "stepBackDebug": "1 つ戻る", "reverseContinue": "反転" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/debug/browser/debugCommands.i18n.json b/i18n/jpn/src/vs/workbench/parts/debug/browser/debugCommands.i18n.json index 302fa5a35e..e06b11a7e8 100644 --- a/i18n/jpn/src/vs/workbench/parts/debug/browser/debugCommands.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/debug/browser/debugCommands.i18n.json @@ -7,7 +7,7 @@ "Do not edit this file. It is machine generated." ], "noFolderDebugConfig": "高度なデバッグ構成を行うには、最初にフォルダーを開いてください。", - "columnBreakpoint": "列ブレークポイント", + "inlineBreakpoint": "インライン ブレークポイント", "debug": "デバッグ", - "addColumnBreakpoint": "列ブレークポイントの追加" + "addInlineBreakpoint": "インライン ブレークポイントを追加" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/debug/browser/debugEditorActions.i18n.json b/i18n/jpn/src/vs/workbench/parts/debug/browser/debugEditorActions.i18n.json index 3bb7ec0120..182e02ab91 100644 --- a/i18n/jpn/src/vs/workbench/parts/debug/browser/debugEditorActions.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/debug/browser/debugEditorActions.i18n.json @@ -12,5 +12,7 @@ "runToCursor": "カーソル行の前まで実行", "debugEvaluate": "デバッグ: 評価", "debugAddToWatch": "デバッグ: ウォッチに追加", - "showDebugHover": "デバッグ: ホバーの表示" + "showDebugHover": "デバッグ: ホバーの表示", + "goToNextBreakpoint": "デバッグ: 次のブレークポイントへ移動", + "goToPreviousBreakpoint": "デバッグ: 前のブレークポイントへ移動" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/debug/browser/debugViewlet.i18n.json b/i18n/jpn/src/vs/workbench/parts/debug/browser/debugViewlet.i18n.json index 94396a8bdc..71a7b66878 100644 --- a/i18n/jpn/src/vs/workbench/parts/debug/browser/debugViewlet.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/debug/browser/debugViewlet.i18n.json @@ -6,6 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "startAdditionalSession": "追加のセッションを開始", "debugFocusVariablesView": "変数にフォーカス", "debugFocusWatchView": "ウォッチにフォーカス", "debugFocusCallStackView": "コールスタックにフォーカス", diff --git a/i18n/jpn/src/vs/workbench/parts/debug/common/debugSchemas.i18n.json b/i18n/jpn/src/vs/workbench/parts/debug/common/debugSchemas.i18n.json new file mode 100644 index 0000000000..f4ab983e56 --- /dev/null +++ b/i18n/jpn/src/vs/workbench/parts/debug/common/debugSchemas.i18n.json @@ -0,0 +1,38 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "vscode.extension.contributes.debuggers": "デバッグ アダプターを提供します。", + "vscode.extension.contributes.debuggers.type": "このデバッグ アダプターの一意識別子。", + "vscode.extension.contributes.debuggers.label": "このデバッグ アダプターの表示名。", + "vscode.extension.contributes.debuggers.program": "デバッグ アダプター プログラムへのパス。絶対パスか拡張機能フォルダーへの相対パスです。", + "vscode.extension.contributes.debuggers.args": "アダプターに渡すオプションの引数。", + "vscode.extension.contributes.debuggers.runtime": "プログラム属性が実行可能でなく、ランタイムが必要な場合のオプション ランタイム。", + "vscode.extension.contributes.debuggers.runtimeArgs": "オプションのランタイム引数。", + "vscode.extension.contributes.debuggers.variables": "`launch.json` 内の対話型の変数 (例: ${action.pickProcess}) からコマンドへマッピングしています。", + "vscode.extension.contributes.debuggers.initialConfigurations": "初期 'launch.json' を生成するための構成。", + "vscode.extension.contributes.debuggers.languages": "デバッグ拡張機能が \"既定のデバッガー\" とされる言語の一覧。", + "vscode.extension.contributes.debuggers.adapterExecutableCommand": "指定されている場合、VS Code はこのコマンドを呼び出し、デバッグ アダプターの実行可能パスと、渡す引数を決定します。", + "vscode.extension.contributes.debuggers.configurationSnippets": "'launch.json' に新しい構成を追加するためのスニペット。", + "vscode.extension.contributes.debuggers.configurationAttributes": "'launch.json' を検証するための JSON スキーマ構成。", + "vscode.extension.contributes.debuggers.windows": "Windows 固有の設定。", + "vscode.extension.contributes.debuggers.windows.runtime": "Windows で使用されるランタイム。", + "vscode.extension.contributes.debuggers.osx": "macOS 固有の設定。", + "vscode.extension.contributes.debuggers.osx.runtime": "macOS で使用されるランタイム。", + "vscode.extension.contributes.debuggers.linux": "Linux 固有の設定。", + "vscode.extension.contributes.debuggers.linux.runtime": "Linux で使用されるランタイム。", + "vscode.extension.contributes.breakpoints": "ブレークポイントを提供します。", + "vscode.extension.contributes.breakpoints.language": "この言語でブレークポイントを許可します。", + "app.launch.json.title": "起動", + "app.launch.json.version": "このファイル形式のバージョン。", + "app.launch.json.configurations": "構成の一覧。IntelliSense を使用して、新しい構成を追加したり、既存の構成を編集したります。", + "app.launch.json.compounds": "複合の一覧。各複合は、同時に起動される複数の構成を参照します。", + "app.launch.json.compound.name": "複合の名前。起動構成のドロップダウン メニューに表示されます。", + "useUniqueNames": "一意の構成名を使用してください。", + "app.launch.json.compound.folder": "複合があるフォルダーの名前。", + "app.launch.json.compounds.configurations": "この複合の一部として開始される構成の名前。" +} \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/debug/electron-browser/callStackView.i18n.json b/i18n/jpn/src/vs/workbench/parts/debug/electron-browser/callStackView.i18n.json index a83e21f9d1..1e9c0d6de2 100644 --- a/i18n/jpn/src/vs/workbench/parts/debug/electron-browser/callStackView.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/debug/electron-browser/callStackView.i18n.json @@ -9,9 +9,9 @@ "callstackSection": "コール スタック セクション", "debugStopped": "{0} で一時停止", "callStackAriaLabel": "コール スタックのデバッグ", - "process": "プロセス", + "session": "セッション", "paused": "一時停止", - "running": "実行しています", + "running": "実行中", "thread": "スレッド", "pausedOn": "{0} で一時停止", "loadMoreStackFrames": "スタック フレームをさらに読み込む", diff --git a/i18n/jpn/src/vs/workbench/parts/debug/electron-browser/debug.contribution.i18n.json b/i18n/jpn/src/vs/workbench/parts/debug/electron-browser/debug.contribution.i18n.json index 49eb047826..f0db92e901 100644 --- a/i18n/jpn/src/vs/workbench/parts/debug/electron-browser/debug.contribution.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/debug/electron-browser/debug.contribution.i18n.json @@ -21,11 +21,12 @@ "allowBreakpointsEverywhere": "任意のファイルにブレークポイントを設定できるようにする", "openExplorerOnEnd": "デバッグ セッションの終わりにエクスプローラ ビューを自動的に開きます", "inlineValues": "デバッグ中にエディターの行内に変数値を表示します", - "hideActionBar": "浮動デバッグ操作バーを非表示にするかどうかを制御します", + "toolBarLocation": "デバッグ ツールバーの位置を制御します。\"floating\" はすべてのビュー内、 \"docked\" はデバッグ ビュー内、または \"hidden\" のいずれかです", "never": "今後ステータス バーにデバッグを表示しない", "always": "ステータス バーにデバッグを常に表示する", "onFirstSessionStart": "初めてデバッグが開始されたときのみステータス バーにデバッグを表示する", "showInStatusBar": "デバッグのステータス バーが表示されるタイミングを制御", "openDebug": "デバッグ ビューを開くか、デバッグ セッションを開始するかを制御します。", + "enableAllHovers": "デバッグ中に非デバッグ ホバーを有効にするかどうかを制御します。true の場合、ホバーを提供するためにホバー プロバイダーが呼び出されます。この設定が true でも通常のホバーは表示されません。", "launch": "グローバル デバッグ起動構成。ワークスペース間で共有される 'launch.json' の代わりとして使用する必要があります" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.i18n.json b/i18n/jpn/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.i18n.json index 34ed685b9f..ad12818ef7 100644 --- a/i18n/jpn/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.i18n.json @@ -6,35 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "vscode.extension.contributes.debuggers": "デバッグ アダプターを提供します。", - "vscode.extension.contributes.debuggers.type": "このデバッグ アダプターの一意識別子。", - "vscode.extension.contributes.debuggers.label": "このデバッグ アダプターの表示名。", - "vscode.extension.contributes.debuggers.program": "デバッグ アダプター プログラムへのパス。絶対パスか拡張機能フォルダーへの相対パスです。", - "vscode.extension.contributes.debuggers.args": "アダプターに渡すオプションの引数。", - "vscode.extension.contributes.debuggers.runtime": "プログラム属性が実行可能でなく、ランタイムが必要な場合のオプション ランタイム。", - "vscode.extension.contributes.debuggers.runtimeArgs": "オプションのランタイム引数。", - "vscode.extension.contributes.debuggers.variables": "`launch.json` 内の対話型の変数 (例: ${action.pickProcess}) からコマンドへマッピングしています。", - "vscode.extension.contributes.debuggers.initialConfigurations": "初期 'launch.json' を生成するための構成。", - "vscode.extension.contributes.debuggers.languages": "デバッグ拡張機能が \"既定のデバッガー\" とされる言語の一覧。", - "vscode.extension.contributes.debuggers.adapterExecutableCommand": "指定されている場合、VS Code はこのコマンドを呼び出し、デバッグ アダプターの実行可能パスと、渡す引数を決定します。", - "vscode.extension.contributes.debuggers.configurationSnippets": "'launch.json' に新しい構成を追加するためのスニペット。", - "vscode.extension.contributes.debuggers.configurationAttributes": "'launch.json' を検証するための JSON スキーマ構成。", - "vscode.extension.contributes.debuggers.windows": "Windows 固有の設定。", - "vscode.extension.contributes.debuggers.windows.runtime": "Windows で使用されるランタイム。", - "vscode.extension.contributes.debuggers.osx": "macOS 固有の設定。", - "vscode.extension.contributes.debuggers.osx.runtime": "macOS で使用されるランタイム。", - "vscode.extension.contributes.debuggers.linux": "Linux 固有の設定。", - "vscode.extension.contributes.debuggers.linux.runtime": "Linux で使用されるランタイム。", - "vscode.extension.contributes.breakpoints": "ブレークポイントを提供します。", - "vscode.extension.contributes.breakpoints.language": "この言語でブレークポイントを許可します。", - "app.launch.json.title": "起動", - "app.launch.json.version": "このファイル形式のバージョン。", - "app.launch.json.configurations": "構成の一覧。IntelliSense を使用して、新しい構成を追加したり、既存の構成を編集したります。", - "app.launch.json.compounds": "複合の一覧。各複合は、同時に起動される複数の構成を参照します。", - "app.launch.json.compound.name": "複合の名前。起動構成のドロップダウン メニューに表示されます。", - "useUniqueNames": "一意の構成名を使用してください。", - "app.launch.json.compound.folder": "複合があるフォルダーの名前。", - "app.launch.json.compounds.configurations": "この複合の一部として開始される構成の名前。", "debugNoType": "デバッガー 'type' は省略不可で、'string' 型でなければなりません。", "selectDebug": "環境の選択", "DebugConfig.failed": "'launch.json' ファイルを '.vscode' フォルダー ({0}) 内に作成できません。", diff --git a/i18n/jpn/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json b/i18n/jpn/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json index a0c1afdf3f..a0d3c5795d 100644 --- a/i18n/jpn/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json @@ -13,15 +13,15 @@ "disableBreakpoint": "{0} を無効にする", "enableBreakpoint": "{0} を有効にする", "removeBreakpoints": "ブレークポイントの削除", - "removeBreakpointOnColumn": "列 {0} のブレークポイントの削除", + "removeInlineBreakpointOnColumn": "列 {0} のインライン ブレークポイントを削除", "removeLineBreakpoint": "行のブレークポイントの削除", "editBreakpoints": "ブレークポイントの編集", - "editBreakpointOnColumn": "列 {0} のブレークポイントの編集", + "editInlineBreakpointOnColumn": "列 {0} のインライン ブレークポイントを編集", "editLineBrekapoint": "行のブレークポイントの編集", "enableDisableBreakpoints": "ブレークポイントの有効化/無効化", - "disableColumnBreakpoint": "列 {0} のブレークポイントの無効化", + "disableInlineColumnBreakpoint": "列 {0} のインライン ブレークポイントを無効化", "disableBreakpointOnLine": "行のブレークポイントの無効化", - "enableBreakpoints": "列 {0} のブレークポイントの有効化", + "enableBreakpoints": "列 {0} のインライン ブレークポイントを有効化", "enableBreakpointOnLine": "行のブレークポイントの有効化", "addBreakpoint": "ブレークポイントの追加", "addConditionalBreakpoint": "条件付きブレークポイントの追加...", diff --git a/i18n/jpn/src/vs/workbench/parts/extensions/browser/extensionsActions.i18n.json b/i18n/jpn/src/vs/workbench/parts/extensions/browser/extensionsActions.i18n.json index 94afd2b58c..001f6ff012 100644 --- a/i18n/jpn/src/vs/workbench/parts/extensions/browser/extensionsActions.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/extensions/browser/extensionsActions.i18n.json @@ -14,7 +14,7 @@ "uninstallAction": "アンインストール", "Uninstalling": "アンインストールしています", "updateAction": "更新", - "updateTo": "{0} に更新します", + "updateTo": "{0} に更新", "failedToUpdate": "'{0}' を更新できませんでした。", "ManageExtensionAction.uninstallingTooltip": "アンインストールしています", "enableForWorkspaceAction": "有効にする (ワークスペース)", diff --git a/i18n/jpn/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.i18n.json b/i18n/jpn/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.i18n.json index 6012be2dbf..52ef71e8bf 100644 --- a/i18n/jpn/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.i18n.json @@ -16,9 +16,13 @@ "repository": "リポジトリ", "license": "ライセンス", "details": "詳細", + "detailstooltip": "拡張機能の詳細、拡張機能の 'README.md' ファイルから表示", "contributions": "コントリビューション", + "contributionstooltip": "この拡張機能による VS Code へのコントリビューションの一覧", "changelog": "変更ログ", + "changelogtooltip": "拡張機能の更新履歴、拡張機能の 'CHANGELOG.md' ファイルから表示", "dependencies": "依存関係", + "dependenciestooltip": "この拡張機能が依存する拡張機能の一覧", "noReadme": "利用できる README はありません。", "noChangelog": "使用可能な変更ログはありません。", "noContributions": "コントリビューションはありません", @@ -30,6 +34,10 @@ "debuggers": "デバッガー ({0})", "debugger name": "名前", "debugger type": "種類", + "viewContainers": "ビュー コンテナ ({0})", + "view container id": "ID", + "view container title": "題名", + "view container location": "場所", "views": "ビュー ({0})", "view id": "ID", "view name": "名前", diff --git a/i18n/jpn/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json b/i18n/jpn/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json index 98f8cd7ff1..a462baf93e 100644 --- a/i18n/jpn/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json @@ -8,7 +8,6 @@ ], "neverShowAgain": "今後は表示しない", "searchMarketplace": "Marketplace を検索", - "showLanguagePackExtensions": "Marketplace には VS Code を {0} へローカライズするのに役立つ拡張機能が用意されています", "dynamicWorkspaceRecommendation": "{0} レポジトリのユーザーに人気があるので、あなたもこの拡張機能に関心を持たれるかもしれません。", "exeBasedRecommendation": "{0} がインストールされているため、この拡張機能を推奨します。", "fileBasedRecommendation": "最近開いたファイルに基づいてこの拡張機能が推奨されます。", diff --git a/i18n/jpn/src/vs/workbench/parts/extensions/node/extensionsWorkbenchService.i18n.json b/i18n/jpn/src/vs/workbench/parts/extensions/node/extensionsWorkbenchService.i18n.json index 10f6fe05b3..63347a9791 100644 --- a/i18n/jpn/src/vs/workbench/parts/extensions/node/extensionsWorkbenchService.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/extensions/node/extensionsWorkbenchService.i18n.json @@ -10,12 +10,12 @@ "malicious": "この拡張機能には問題があると報告されています。", "installingMarketPlaceExtension": "Marketplace から拡張機能をインストールしています...", "uninstallingExtension": "拡張機能をアンインストールしています...", - "enableDependeciesConfirmation": "'{0}' を有効にするとその依存関係も有効になります。続行しますか?", + "enableDependeciesConfirmation": "拡張機能を有効にすると、その依存関係も有効になります。 続行しますか?", "enable": "はい", "doNotEnable": "いいえ", - "disableDependeciesConfirmation": "'{0}' のみ、またはその依存関係も無効にしますか?", - "disableOnly": "限定", - "disableAll": "すべて", + "disableDependeciesConfirmation": "拡張機能の依存関係も無効にしますか?", + "yes": "はい", + "no": "いいえ", "cancel": "キャンセル", "singleDependentError": "拡張機能 '{0}' を無効にできません。これに拡張機能 '{1}' が依存しています。", "twoDependentsError": "拡張機能 '{0}' を無効にできません。これに拡張機能 '{1}' と '{2}' が依存しています。", diff --git a/i18n/jpn/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json b/i18n/jpn/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json index 9e89cdbe16..509a2f61cc 100644 --- a/i18n/jpn/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json @@ -65,7 +65,6 @@ "emptyFileNameError": "ファイルまたはフォルダーの名前を指定する必要があります。", "fileNameStartsWithSlashError": "ファイルまたはフォルダーの名前はスラッシュで始めることができません。", "fileNameExistsError": "**{0}** というファイルまたはフォルダーはこの場所に既に存在します。別の名前を指定してください。", - "fileUsedAsFolderError": "**{0}** はファイルのため階層構造を持つことはできません。", "invalidFileNameError": "名前 **{0}** がファイル名またはフォルダー名として無効です。別の名前を指定してください。", "filePathTooLongError": "名前 **{0}** のパスが長すぎます。名前を短くしてください。", "compareWithClipboard": "クリップボードとアクティブ ファイルを比較", diff --git a/i18n/jpn/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.i18n.json b/i18n/jpn/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.i18n.json index a821e834d0..17369bf498 100644 --- a/i18n/jpn/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.i18n.json @@ -7,10 +7,11 @@ "Do not edit this file. It is machine generated." ], "updateLocale": "VS Code の UI 言語を {0} にして再起動しますか?", + "activateLanguagePack": "今インストールされた言語パックを有効にするために、VS Codeを再起動しますか?", "yes": "はい", "no": "いいえ", "neverAgain": "今後は表示しない", - "install language pack": "近い将来、VS Codeはマーケットプレイスの拡張機能のみをサポートします。現在構成されている言語を使い続けるためには、拡張機能 '{0}' をインストールしてください。", + "install language pack": "近い将来、VS Code は Marketplace から入手する言語パックのみをサポートするようになります。現在構成している言語を使い続けるためには '{0}' 拡張機能をインストールしてください。", "install": "インストール", "more information": "詳細情報...", "JsonSchema.locale": "使用する UI 言語。", diff --git a/i18n/jpn/src/vs/workbench/parts/localizations/electron-browser/localizationsActions.i18n.json b/i18n/jpn/src/vs/workbench/parts/localizations/electron-browser/localizationsActions.i18n.json index 3b68fb6c14..d3e5957a33 100644 --- a/i18n/jpn/src/vs/workbench/parts/localizations/electron-browser/localizationsActions.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/localizations/electron-browser/localizationsActions.i18n.json @@ -6,7 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "configureLocale": "言語を構成する", + "configureLocale": "表示言語を構成する", "displayLanguage": "VSCode の表示言語を定義します。", "doc": "サポートされている言語の一覧については、{0} をご覧ください。", "restart": "値を変更するには VS Code の再起動が必要です。", diff --git a/i18n/jpn/src/vs/workbench/parts/outline/electron-browser/outline.contribution.i18n.json b/i18n/jpn/src/vs/workbench/parts/outline/electron-browser/outline.contribution.i18n.json new file mode 100644 index 0000000000..5f57c31262 --- /dev/null +++ b/i18n/jpn/src/vs/workbench/parts/outline/electron-browser/outline.contribution.i18n.json @@ -0,0 +1,12 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "name": "概要", + "category.focus": "ファイル", + "label.focus": "アウトラインにフォーカスする" +} \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/outline/electron-browser/outlinePanel.i18n.json b/i18n/jpn/src/vs/workbench/parts/outline/electron-browser/outlinePanel.i18n.json new file mode 100644 index 0000000000..46cf0edab8 --- /dev/null +++ b/i18n/jpn/src/vs/workbench/parts/outline/electron-browser/outlinePanel.i18n.json @@ -0,0 +1,17 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "filter": "フィルター", + "collapse": "すべて折りたたむ", + "sortByPosition": "並べ替え: 位置", + "sortByName": "並べ替え: 名前", + "sortByKind": "並べ替え: 種類", + "live": "カーソルに追従", + "no-editor": "概要情報を提供できるエディターが開かれていません。", + "too-many-symbols": "申し訳ありません、このファイルは大きすぎるのでアウトラインを表示できません。" +} \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/outline/electron-browser/outlineTree.i18n.json b/i18n/jpn/src/vs/workbench/parts/outline/electron-browser/outlineTree.i18n.json new file mode 100644 index 0000000000..45af06d7d6 --- /dev/null +++ b/i18n/jpn/src/vs/workbench/parts/outline/electron-browser/outlineTree.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "outline.title": "行 {1} の {0}" +} \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/output/browser/outputPanel.i18n.json b/i18n/jpn/src/vs/workbench/parts/output/browser/outputPanel.i18n.json index 44efab0263..4500264232 100644 --- a/i18n/jpn/src/vs/workbench/parts/output/browser/outputPanel.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/output/browser/outputPanel.i18n.json @@ -6,6 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "output": "出力", "outputPanelWithInputAriaLabel": "{0}、出力パネル", "outputPanelAriaLabel": "出力パネル" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/preferences/browser/keybindingWidgets.i18n.json b/i18n/jpn/src/vs/workbench/parts/preferences/browser/keybindingWidgets.i18n.json index e77efe0d22..c72d15424e 100644 --- a/i18n/jpn/src/vs/workbench/parts/preferences/browser/keybindingWidgets.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/preferences/browser/keybindingWidgets.i18n.json @@ -6,6 +6,8 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "defineKeybinding.oneExists": "1つの既存コマンドがこのキーバインドを使用しています", + "defineKeybinding.existing": "{0}つの既存コマンドがこのキーバインドを使用しています", "defineKeybinding.initial": "任意のキーの組み合わせを押し、ENTER キーを押します。", "defineKeybinding.chordsTo": "の次に" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json b/i18n/jpn/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json index b3c9c9cb67..5f8eabf44a 100644 --- a/i18n/jpn/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json @@ -7,6 +7,7 @@ "Do not edit this file. It is machine generated." ], "openRawDefaultSettings": "既定の設定を Raw で開く", + "openSettings2": "設定を開く (プレビュー)", "openSettings": "設定を開く", "openGlobalSettings": "ユーザー設定を開く", "openGlobalKeybindings": "キーボード ショートカットを開く", diff --git a/i18n/jpn/src/vs/workbench/parts/preferences/browser/settingsEditor2.i18n.json b/i18n/jpn/src/vs/workbench/parts/preferences/browser/settingsEditor2.i18n.json new file mode 100644 index 0000000000..cd42ac1c72 --- /dev/null +++ b/i18n/jpn/src/vs/workbench/parts/preferences/browser/settingsEditor2.i18n.json @@ -0,0 +1,18 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "previewWarning": "プレビュー", + "previewLabel": "これは私たちの新しい設定エディターのプレビューです。", + "SearchSettings.AriaLabel": "設定の検索", + "SearchSettings.Placeholder": "設定の検索", + "advancedCustomizationLabel": "高度なカスタマイズを行うには、次を開いて編集:", + "openSettingsLabel": "settings.json", + "showOverriddenOnly": "変更済みのみを表示", + "treeAriaLabel": "設定", + "feedbackButtonLabel": "フィードバックを提供" +} \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/preferences/browser/settingsTree.i18n.json b/i18n/jpn/src/vs/workbench/parts/preferences/browser/settingsTree.i18n.json new file mode 100644 index 0000000000..14432e92b8 --- /dev/null +++ b/i18n/jpn/src/vs/workbench/parts/preferences/browser/settingsTree.i18n.json @@ -0,0 +1,19 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "modifiedItemForeground": "変更された設定の前景色。", + "workspace": "ワークスペース", + "user": "ユーザー", + "resetButtonTitle": "リセット", + "configured": "変更済み", + "alsoConfiguredIn": "次でも変更されています", + "configuredIn": "変更されています", + "editInSettingsJson": "settings.json で編集", + "settingRowAriaLabel": "{0} {1}、設定", + "groupRowAriaLabel": "{0}、グループ" +} \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/preferences/electron-browser/preferences.contribution.i18n.json b/i18n/jpn/src/vs/workbench/parts/preferences/electron-browser/preferences.contribution.i18n.json index b9d7556f6e..3a5981c635 100644 --- a/i18n/jpn/src/vs/workbench/parts/preferences/electron-browser/preferences.contribution.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/preferences/electron-browser/preferences.contribution.i18n.json @@ -7,6 +7,7 @@ "Do not edit this file. It is machine generated." ], "defaultPreferencesEditor": "既定の基本設定エディター", + "settingsEditor2": "設定エディター 2", "keybindingsEditor": "キー バインド エディター", "preferences": "基本設定" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/search/browser/searchActions.i18n.json b/i18n/jpn/src/vs/workbench/parts/search/browser/searchActions.i18n.json index 3e019a0041..9d5a8aea55 100644 --- a/i18n/jpn/src/vs/workbench/parts/search/browser/searchActions.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/search/browser/searchActions.i18n.json @@ -12,6 +12,8 @@ "previousSearchExcludePattern": "前の検索除外パターンを表示", "nextSearchTerm": "次の検索語句を表示", "previousSearchTerm": "前の検索語句を表示", + "nextReplaceTerm": "次の検索置換語句を表示", + "previousReplaceTerm": "前の検索置換語句を表示", "findInFiles": "フォルダーを指定して検索", "replaceInFiles": "複数のファイルで置換", "RefreshAction.label": "最新の情報に更新", diff --git a/i18n/jpn/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json b/i18n/jpn/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json index 11a7af1bc6..d63dc1c7de 100644 --- a/i18n/jpn/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json @@ -31,5 +31,5 @@ "search.followSymlinks": "検索中にシンボリック リンクをたどるかどうかを制御します。", "search.smartCase": "すべて小文字のパターンの場合、大文字と小文字を区別しないで検索し、そうでない場合は大文字と小文字を区別して検索する", "search.globalFindClipboard": "macOS で検索ビューが共有の検索クリップボードを読み取りまたは変更するかどうかを制御します", - "search.location": "検索をサイドバーのビューとして、または、より水平的なパネルとして表示するかを制御します。次期リリースではパネル内検索の水平レイアウトが改善され、プレビューではなくなります。" + "search.location": "検索をサイドバーのビューとして表示するか、より水平方向の空間をとるためにパネル領域のパネルとして表示するかを制御します。" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/tasks/electron-browser/jsonSchema_v2.i18n.json b/i18n/jpn/src/vs/workbench/parts/tasks/electron-browser/jsonSchema_v2.i18n.json index 5fef404b79..fb921ef466 100644 --- a/i18n/jpn/src/vs/workbench/parts/tasks/electron-browser/jsonSchema_v2.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/tasks/electron-browser/jsonSchema_v2.i18n.json @@ -28,6 +28,7 @@ "JsonSchema.tasks.group.none": "タスクをグループに割り当てない", "JsonSchema.tasks.group": "このタスクが属する実行グループを定義します。ビルド グループに追加する \"build\" とテスト グループに追加する \"test\" をサポートしています。", "JsonSchema.tasks.type": "タスクをプロセスとして実行するか、またはシェル内部でコマンドとして実行するかどうかを定義します。", + "JsonSchema.commandArray": "実行されるシェル コマンドです。配列の項目は空白文字を使用して結合されます。", "JsonSchema.command.quotedString.value": "実際のコマンド値", "JsonSchema.tasks.quoting.escape": "シェルのエスケープ文字を使用して文字をエスケープします (例: PowerShell の ` 、bash の \\)。", "JsonSchema.tasks.quoting.strong": "シェルの strong quote 文字を使用して引数を引用します (例: PowerShell や bash の下の \")。", diff --git a/i18n/jpn/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.i18n.json b/i18n/jpn/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.i18n.json index 26dafe3bce..0417abdc44 100644 --- a/i18n/jpn/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.i18n.json @@ -19,6 +19,7 @@ "terminal.integrated.copyOnSelection": "設定した場合、ターミナルで選択しているテキストはクリップボードにコピーされます。", "terminal.integrated.fontFamily": "端末のフォント ファミリを制御します。既定値は editor.fontFamily になります。", "terminal.integrated.fontSize": "ターミナルのフォント サイズをピクセル単位で制御します。", + "terminal.integrated.letterSpacing": "ターミナルの文字間隔を制御、これは文字間の追加ピクセル数を表す整数値です。", "terminal.integrated.lineHeight": "ターミナルの行の高さを制御します。この数値にターミナルのフォント サイズを乗算すると、実際の行の高さ (ピクセル単位) になります。", "terminal.integrated.fontWeight": "ターミナル内で太字ではないテキストに使用するフォントの太さ。", "terminal.integrated.fontWeightBold": "ターミナル内で太字のテキストに使用するフォントの太さ。", @@ -26,7 +27,8 @@ "terminal.integrated.cursorStyle": "端末のカーソルのスタイルを制御します。", "terminal.integrated.scrollback": "端末がそのバッファーに保持できる最大行数を制御します。", "terminal.integrated.setLocaleVariables": "ターミナルの開始時にロケール変数を設定するかどうかを制御します。OS X では既定で true になり、その他のプラットフォームでは false です。", - "terminal.integrated.rightClickBehavior": "ターミナルが右クリックにどのように反応するかを制御します。'default'、'copyPaste'、 'selectWord' を指定できます。'default' はコンテキスト メニューを表示します。'copyPaste' は選択範囲があるとコピーし、そうでない場合は貼り付けを行います。'selectWord' はカーソル下の単語を選択し、コンテキスト メニューを表示します。", + "terminal.integrated.rendererType": "ターミナルのレンダリングを制御します。オプションは標準的な (速い) キャンバス方式の \"canvas\"、代替的な DOM ベースのレンダリングの \"dom\"、いずれか良い方を VS Code に推測させる \"auto\" です。この設定は反映させるために VS Code を再読み込みする必要があります。", + "terminal.integrated.rightClickBehavior": "ターミナルが右クリックにどのように反応するかを制御します。\"default\"、\"copyPaste\"、 \"selectWord\" を指定できます。\"default\" はコンテキスト メニューを表示します。\"copyPaste\" は選択範囲があるとコピーし、そうでない場合は貼り付けを行います。\"selectWord\" はカーソル下の単語を選択し、コンテキスト メニューを表示します。", "terminal.integrated.cwd": "端末を起動する明示的な開始パスです。これはシェル プロセスの現在の作業ディレクトリ (cwd) として使用されます。特にルート ディレクトリが cwd に適していない場合に、ワークスペースの設定で役立ちます。", "terminal.integrated.confirmOnExit": "アクティブなターミナル セッションがある場合に終了の確認をするかどうか。", "terminal.integrated.enableBell": "ターミナルのベルが有効かどうか。", diff --git a/i18n/jpn/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json b/i18n/jpn/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json index 3d8535cf2d..3740b398cf 100644 --- a/i18n/jpn/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json @@ -57,5 +57,7 @@ "workbench.action.terminal.scrollToPreviousCommand": "前のコマンドにスクロール", "workbench.action.terminal.scrollToNextCommand": "次のコマンドにスクロール", "workbench.action.terminal.selectToPreviousCommand": "前のコマンドを選択", - "workbench.action.terminal.selectToNextCommand": "次のコマンドを選択" + "workbench.action.terminal.selectToNextCommand": "次のコマンドを選択", + "workbench.action.terminal.selectToPreviousLine": "前の行を選択", + "workbench.action.terminal.selectToNextLine": "次の行を選択" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.i18n.json b/i18n/jpn/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.i18n.json index ff3e8a7649..b8d6bff5db 100644 --- a/i18n/jpn/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.i18n.json @@ -9,6 +9,11 @@ "terminal.integrated.a11yBlankLine": "空白行", "terminal.integrated.a11yPromptLabel": "端末入力", "terminal.integrated.a11yTooMuchOutput": "通知する出力が多すぎます。行に移動して手動で読み取ってください", + "yes": "はい", + "terminal.rendererInAllNewTerminals": "すべての新しく作成されるターミナルは非 GPU レンダラーを使用します。", + "no": "いいえ", + "dontShowAgain": "今後は表示しない", + "terminal.slowRendering": "統合ターミナルの標準レンダラーが遅くなっているようです。パフォーマンスの向上を見込める DOM ベースのレンダラーに切り替えますか? [ターミナルの設定についてこちらを参照してください](https://code.visualstudio.com/docs/editor/integrated-terminal#_changing-how-the-terminal-is-rendered)。", "terminal.integrated.copySelection.noSelection": "ターミナルにコピー対象の選択範囲がありません", "terminal.integrated.exitedWithCode": "ターミナルの処理が終了しました (終了コード: {0})", "terminal.integrated.waitOnExit": "任意のキーを押して端末を終了します", diff --git a/i18n/jpn/src/vs/workbench/parts/terminal/electron-browser/terminalPanel.i18n.json b/i18n/jpn/src/vs/workbench/parts/terminal/electron-browser/terminalPanel.i18n.json index bf946d3e74..61c83fc38e 100644 --- a/i18n/jpn/src/vs/workbench/parts/terminal/electron-browser/terminalPanel.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/terminal/electron-browser/terminalPanel.i18n.json @@ -6,6 +6,8 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "terminal.useMonospace": "「等幅」を使用します。", + "terminal.monospaceOnly": "ターミナルは等幅フォントのみサポートしています。", "copy": "コピー", "split": "分割", "paste": "貼り付け", diff --git a/i18n/jpn/src/vs/workbench/parts/trust/electron-browser/unsupportedWorkspaceSettings.contribution.i18n.json b/i18n/jpn/src/vs/workbench/parts/trust/electron-browser/unsupportedWorkspaceSettings.contribution.i18n.json index 86a0089a0d..8a9f6312bf 100644 --- a/i18n/jpn/src/vs/workbench/parts/trust/electron-browser/unsupportedWorkspaceSettings.contribution.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/trust/electron-browser/unsupportedWorkspaceSettings.contribution.i18n.json @@ -6,7 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "unsupportedWorkspaceSettings": "このワークスペースには、ユーザー設定でのみ設定可能な設定が含まれています ({0})。詳細情報は[こちら]({1})をクリックしてください。", "openWorkspaceSettings": "ワークスペース設定を開く", - "dontShowAgain": "今後は表示しない" + "dontShowAgain": "今後は表示しない", + "unsupportedWorkspaceSettings": "このワークスペースには、ユーザー設定でのみ設定可能な設定が含まれています ({0})。詳細情報は[こちら]({1})をクリックしてください。" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThrough.contribution.i18n.json b/i18n/jpn/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThrough.contribution.i18n.json index f9131d938e..84025fba32 100644 --- a/i18n/jpn/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThrough.contribution.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThrough.contribution.i18n.json @@ -7,6 +7,5 @@ "Do not edit this file. It is machine generated." ], "walkThrough.editor.label": "対話型プレイグラウンド", - "help": "ヘルプ", - "interactivePlayground": "対話型プレイグラウンド" + "help": "ヘルプ" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/services/bulkEdit/electron-browser/bulkEditService.i18n.json b/i18n/jpn/src/vs/workbench/services/bulkEdit/electron-browser/bulkEditService.i18n.json new file mode 100644 index 0000000000..89893c1411 --- /dev/null +++ b/i18n/jpn/src/vs/workbench/services/bulkEdit/electron-browser/bulkEditService.i18n.json @@ -0,0 +1,13 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "summary.0": "編集は行われませんでした", + "summary.nm": "{1} 個のファイルで {0} 件のテキスト編集を実行", + "summary.n0": "1 つのファイルで {0} 個のテキストを編集", + "conflict": "この間に次のファイルが変更されました: {0}" +} \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/services/configuration/common/configurationExtensionPoint.i18n.json b/i18n/jpn/src/vs/workbench/services/configuration/common/configurationExtensionPoint.i18n.json index c46932cec9..08163ea643 100644 --- a/i18n/jpn/src/vs/workbench/services/configuration/common/configurationExtensionPoint.i18n.json +++ b/i18n/jpn/src/vs/workbench/services/configuration/common/configurationExtensionPoint.i18n.json @@ -16,6 +16,7 @@ "vscode.extension.contributes.configuration": "構成の設定を提供します。", "invalid.title": "'configuration.title' は、文字列である必要があります", "invalid.properties": "'configuration.properties' は、オブジェクトである必要があります", + "invalid.property": "'configuration.property' は、オブジェクトである必要があります", "invalid.allOf": "'configuration.allOf' は非推奨で使用できなくなります。代わりに 'configuration' コントリビューション ポイントに複数の構成セクションを配列として渡します。", "workspaceConfig.folders.description": "ワークスペースで読み込まれるフォルダーのリスト。", "workspaceConfig.path.description": "ファイルパス。例: `/root/folderA` または `./folderA` のようなワークスペース ファイルの場所に対して解決される相対パス。", diff --git a/i18n/jpn/src/vs/workbench/services/configurationResolver/electron-browser/configurationResolverService.i18n.json b/i18n/jpn/src/vs/workbench/services/configurationResolver/electron-browser/configurationResolverService.i18n.json index 9ca110727d..b7ae27bc9d 100644 --- a/i18n/jpn/src/vs/workbench/services/configurationResolver/electron-browser/configurationResolverService.i18n.json +++ b/i18n/jpn/src/vs/workbench/services/configurationResolver/electron-browser/configurationResolverService.i18n.json @@ -6,16 +6,5 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "canNotResolveWorkspaceFolderMultiRoot": "'${workspaceFolder}' はマルチ フォルダー ワークスペースで解決できません。 ':' とフォルダー名を使用して、この変数のスコープを指定してください。", - "canNotResolveWorkspaceFolder": "'${workspaceFolder}' を解決できません。フォルダーを開いてください。", - "canNotResolveFolderBasenameMultiRoot": "'${workspaceFolderBasename}' はマルチ フォルダー ワークスペースで解決できません。 ':' とフォルダー名を使用して、この変数のスコープを指定してください。", - "canNotResolveFolderBasename": "'${workspaceFolderBasename}' を解決できません。フォルダーを開いてください。", - "canNotResolveLineNumber": "'${lineNumber}' を解決できません。エディターを開いてください。", - "canNotResolveSelectedText": "'${selectedText}' を解決できません。エディターを開いてください。", - "canNotResolveFile": "'${file}' を解決できません。エディターを開いてください。", - "canNotResolveRelativeFile": "'${relativeFile}' を解決できません。エディターを開いてください。", - "canNotResolveFileDirname": "'${fileDirname}' を解決できません。エディターを開いてください。", - "canNotResolveFileExtname": "'${fileExtname}' を解決できません。エディターを開いてください。", - "canNotResolveFileBasename": "'${fileBasename}' を解決できません。エディターを開いてください。", - "canNotResolveFileBasenameNoExtension": "'${fileBasenameNoExtension}' を解決できません。エディターを開いてください。" + "stringsOnlySupported": "コマンド {0} は文字列を返しませんでした。変数の置換に使用されるコマンドの戻り値は、文字列のみがサポートされます。" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/services/files/electron-browser/remoteFileService.i18n.json b/i18n/jpn/src/vs/workbench/services/files/electron-browser/remoteFileService.i18n.json index 1b25dacd1f..adcde42dd2 100644 --- a/i18n/jpn/src/vs/workbench/services/files/electron-browser/remoteFileService.i18n.json +++ b/i18n/jpn/src/vs/workbench/services/files/electron-browser/remoteFileService.i18n.json @@ -6,6 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "invalidPath": "リソース '{0}' のパスは絶対パスにする必要があります", "fileNotFoundError": "ファイルが見つかりません ({0})", "fileIsDirectoryError": "ファイルはディレクトリです", "fileNotModifiedError": "ファイルは次の時点以後に変更されていません:", diff --git a/i18n/kor/extensions/configuration-editing/out/extension.i18n.json b/i18n/kor/extensions/configuration-editing/out/extension.i18n.json index 8432c33f36..64606dca32 100644 --- a/i18n/kor/extensions/configuration-editing/out/extension.i18n.json +++ b/i18n/kor/extensions/configuration-editing/out/extension.i18n.json @@ -6,5 +6,16 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "workspaceFolder": "VS Code에서 연 폴더의 경로", + "workspaceFolderBasename": "VS Code에서 연 폴더의 이름(슬래시(/) 제외)", + "relativeFile": "${workspaceFolder}을(를) 기준으로 현재 열려 있는 파일", + "file": "현재 열려 있는 파일", + "cwd": "시작 시 작업 러너의 현재 작업 디렉터리", + "lineNumber": "활성 파일에서 현재 선택된 줄 번호", + "selectedText": "활성 파일에서 현재 선택된 텍스트", + "fileDirname": "현재 열려 있는 파일의 dirname", + "fileExtname": "현재 열려 있는 파일의 확장명", + "fileBasename": "현재 열려 있는 파일의 기본 이름", + "fileBasenameNoExtension": "현재 열려 있는 파일의 기본 이름(파일 확장명 제외)", "exampleExtension": "예" } \ No newline at end of file diff --git a/i18n/kor/extensions/git/out/commands.i18n.json b/i18n/kor/extensions/git/out/commands.i18n.json index 26beb55003..5c881abd45 100644 --- a/i18n/kor/extensions/git/out/commands.i18n.json +++ b/i18n/kor/extensions/git/out/commands.i18n.json @@ -2,7 +2,7 @@ "": [ "--------------------------------------------------------------------------------------------", "Copyright (c) Microsoft Corporation. All rights reserved.", - "Licensed under the Source EULA. See License.txt in the project root for license information.", + "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], @@ -10,10 +10,12 @@ "remote branch at": "{0}에서 원격 분기", "create branch": "$(plus) 새 분기 생성", "repourl": "리포지토리 URL", - "parent": "부모 디렉터리", + "selectFolder": "리포지토리 위치 선택", "cloning": "Git 리포지토리 '{0}'을(를) 복제하는 중...", - "openrepo": "리포지토리 열기", "proposeopen": "복제된 리포지토리를 여시겠습니까?", + "openrepo": "리포지토리 열기", + "add": "작업 영역에 추가", + "proposeopen2": "복제된 리포지토리를 열거나 현재 작업 영역에 추가하시겠습니까?", "init": "Git 리포지토리를 초기화할 작업 영역 폴더 선택", "init repo": "리포지토리 초기화", "create repo": "리포지토리 초기화", diff --git a/i18n/kor/extensions/npm/out/npmView.i18n.json b/i18n/kor/extensions/npm/out/npmView.i18n.json index 94edf3b4b0..1f8713e1e4 100644 --- a/i18n/kor/extensions/npm/out/npmView.i18n.json +++ b/i18n/kor/extensions/npm/out/npmView.i18n.json @@ -6,6 +6,9 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "npm.noDebugOptions": "스크립트에 노드 디버그 옵션(예: '--inspect-brk')이 없으므로 디버깅에 사용할 \"{0}\"을(를) 시작할 수 없습니다.", - "npm.scriptInvalid": "\"{0}\" 스크립트를 찾을 수 없습니다. 뷰로 새로 고쳐 보세요." + "noScripts": "스크립트를 찾을 수 없음", + "noDebugOptions": "스크립트에 노드 디버그 옵션(예: '--inspect-brk')이 없으므로 디버깅에 사용할 \"{0}\"을(를) 시작할 수 없습니다.", + "learnMore": "자세한 정보", + "ok": "확인", + "scriptInvalid": "\"{0}\" 스크립트를 찾을 수 없습니다. 뷰로 새로 고쳐 보세요." } \ No newline at end of file diff --git a/i18n/kor/extensions/npm/package.i18n.json b/i18n/kor/extensions/npm/package.i18n.json index ca92d6afee..b762a88ac6 100644 --- a/i18n/kor/extensions/npm/package.i18n.json +++ b/i18n/kor/extensions/npm/package.i18n.json @@ -12,15 +12,15 @@ "config.npm.runSilent": " `--silent` 옵션으로 npm 명령 실행.", "config.npm.packageManager": "스크립트를 실행하는 데 사용하는 패키지 관리자.", "config.npm.exclude": "자동 스크립트 검색에서 제외할 폴더에 대한 Glob 패턴을 구성합니다.", - "config.npm.enableScriptExplorer": "작업 영역에 'package.json' 파일이 포함되어 있는 경우 npm 스크립트에 대한 탐색기 뷰를 사용하도록 설정합니다.", + "config.npm.enableScriptExplorer": "npm 스크립트에 대한 탐색기 뷰를 사용하도록 설정합니다.", + "config.npm.scriptExplorerAction": "스크립트 탐색기에서 사용되는 기본 클릭 동작으로 '열기' 또는 '실행'이며, 기본값은 '열기'입니다.", "npm.parseError": "Npm 작업 검색: {0} 파일을 구문 분석하지 못했습니다.", "taskdef.script": "사용자 지정할 npm 스크립트입니다.", - "taskdef.path": "스크립트를 제공하는 package.json 파일의 폴더에 대한 경로이며 생략할 수 있습니다.", + "taskdef.path": "스크립트를 제공하는 package.json 파일의 폴더 경로이며 생략할 수 있습니다.", "view.name": "Npm 스크립트", "command.refresh": "새로 고침", "command.run": "실행", "command.debug": "디버그", "command.openScript": "열기", - "npm.scriptInvalid": "'{0}' 스크립트를 찾을 수 없습니다. 뷰를 새로 고쳐 보세요.", - "npm.noDebugOptions": "스크립트에 노드 디버그 옵션(예: '--inspect-brk')이 없으므로 디버깅에 사용할 '{0}'을(를) 시작할 수 없습니다." + "command.runInstall": "설치 실행" } \ No newline at end of file diff --git a/i18n/kor/extensions/search-rg/package.i18n.json b/i18n/kor/extensions/search-rg/package.i18n.json new file mode 100644 index 0000000000..244c93586d --- /dev/null +++ b/i18n/kor/extensions/search-rg/package.i18n.json @@ -0,0 +1,11 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "displayName": "검색(ripgrep)", + "description": "Ripgrep을 사용하여 검색을 제공합니다." +} \ No newline at end of file diff --git a/i18n/kor/extensions/typescript-language-features/out/features/updatePathsOnRename.i18n.json b/i18n/kor/extensions/typescript-language-features/out/features/updatePathsOnRename.i18n.json new file mode 100644 index 0000000000..f9ea82243d --- /dev/null +++ b/i18n/kor/extensions/typescript-language-features/out/features/updatePathsOnRename.i18n.json @@ -0,0 +1,14 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "prompt": "이동된 파일 '{0}'에 대한 가져오기를 가종으로 업데이트하시겠습니까?", + "reject.title": "아니요", + "accept.title": "예", + "always.title": "예, 가져오기 항상 업데이트", + "never.title": "아니요, 가져오기 업데이트 안 함" +} \ No newline at end of file diff --git a/i18n/kor/extensions/typescript-language-features/package.i18n.json b/i18n/kor/extensions/typescript-language-features/package.i18n.json index 8aa324a017..984ed51999 100644 --- a/i18n/kor/extensions/typescript-language-features/package.i18n.json +++ b/i18n/kor/extensions/typescript-language-features/package.i18n.json @@ -8,8 +8,7 @@ ], "displayName": "TypeScript 및 JavaScript 언어 기능", "description": "JavaScript 및 TypeScript에 대한 다양한 언어 지원을 제공합니다.", - "typescript.reloadProjects.title": "프로젝트 다시 로드", - "javascript.reloadProjects.title": "프로젝트 다시 로드", + "reloadProjects.title": "프로젝트 다시 로드", "configuration.typescript": "TypeScript", "typescript.useCodeSnippetsOnMethodSuggest.dec": "매개 변수 서명으로 함수를 완료하세요.", "typescript.tsdk.desc": "사용할 tsserver 및 lib*.d.ts 파일이 들어 있는 폴더 경로를 지정합니다.", @@ -37,8 +36,7 @@ "format.placeOpenBraceOnNewLineForFunctions": "함수의 새 줄에 여는 중괄호를 넣을지 정의합니다.", "format.placeOpenBraceOnNewLineForControlBlocks": "제어 블록의 새 줄에 여는 중괄호를 넣을지 정의합니다.", "javascript.validate.enable": "JavaScript 유효성 검사를 사용하거나 사용하지 않습니다.", - "typescript.goToProjectConfig.title": "프로젝트 구성으로 이동", - "javascript.goToProjectConfig.title": "프로젝트 구성으로 이동", + "goToProjectConfig.title": "프로젝트 구성으로 이동", "javascript.referencesCodeLens.enabled": "JavaScript 파일에서 CodeLense 참조를 사용/사용 안 함으로 설정합니다.", "typescript.referencesCodeLens.enabled": "TypeScript 파일에서 참조 CodeLense를 사용/사용 안 함으로 설정합니다. TypeScript >= 2.0.6이 필요합니다.", "typescript.implementationsCodeLens.enabled": "구현 CodeLens를 사용하거나 사용하지 않도록 설정합니다. TypeScript >= 2.2.0이 필요합니다.", @@ -47,7 +45,7 @@ "typescript.selectTypeScriptVersion.title": "TypeScript 버전 선택", "typescript.reportStyleChecksAsWarnings": "스타일 검사를 경고로 보고", "jsDocCompletion.enabled": "자동 JSDoc 주석 사용/사용 안 함", - "javascript.implicitProjectConfig.checkJs": "JavaScript 파일의 의미 체계 검사를 사용/사용하지 않습니다. 기존 jsconfig.json 또는 tsconfig.json 파일은 이 설정을 재정의합니다. TypeScript >=2.3.1이 필요합니다. ", + "javascript.implicitProjectConfig.checkJs": "JavaScript 파일의 의미 체계 검사를 사용하거나 사용하지 않도록 설정합니다. 기존 jsconfig.json 또는 tsconfig.json 파일은 이 설정을 재정의합니다. TypeScript 2.3.1 이상이 필요합니다. ", "typescript.npm": "자동 입력 인식에 사용된 NPM 실행 파일 경로를 지정합니다. TypeScript >= 2.3.4가 필요합니다.", "typescript.check.npmIsInstalled": "자동 입력 인식에 대해 NPM이 설치되어 있는지 확인합니다.", "javascript.nameSuggestions": "JavaScript 제안 목록의 파일에서 고유한 이름 포함을 사용/사용 안 함으로 설정합니다.", @@ -55,11 +53,15 @@ "typescript.problemMatchers.tsc.label": "TypeScript 문제", "typescript.problemMatchers.tscWatch.label": "TypeScript 문제(감시 모드)", "typescript.quickSuggestionsForPaths": "가져오기 경로를 입력할 때 빠른 제안을 사용하거나 사용하지 않습니다.", - "typescript.locale": "TypeScript 오류를 보고하는 데 사용하는 로캘을 설정합니다. TypeScript >= 2.6.0이 필요합니다. 기본값 'null'은 TypeScript 오류에 대해 VS Code의 로캘을 사용합니다.", - "javascript.implicitProjectConfig.experimentalDecorators": "프로젝트의 일부가 아닌 JavaScript 파일에 대해 'experimentalDecorators'를 사용하거나 사용하지 않도록 설정합니다. 기존 jsconfig.json 또는 tsconfig.json 파일은 이 설정을 재정의합니다. TypeScript >=2.3.1이 필요합니다.", - "typescript.autoImportSuggestions.enabled": "자동 가져오기 제안을 사용하거나 사용하지 않도록 설정합니다. TypeScript >=2.6.1이 필요합니다.", + "typescript.locale": "JavaScript 또는 TypeScript 오류를 보고하는 데 사용하는 로캘을 설정합니다. TypeScript 2.6.0 이상이 필요합니다. 기본값 'null'을 설정하면 VS Code의 로캘이 사용됩니다.", + "javascript.implicitProjectConfig.experimentalDecorators": "프로젝트의 일부가 아닌 JavaScript 파일에 대해 'experimentalDecorators'를 사용하거나 사용하지 않도록 설정합니다. 기존 jsconfig.json 또는 tsconfig.json 파일은 이 설정을 재정의합니다. TypeScript 2.3.1 이상이 필요합니다.", + "typescript.autoImportSuggestions.enabled": "자동 가져오기 제안을 사용하거나 사용하지 않도록 설정합니다. TypeScript 2.6.1 이상이 필요합니다.", "typescript.experimental.syntaxFolding": "구문 인식 접기 마커를 설정하거나 해제합니다.", "taskDefinition.tsconfig.description": "TS 빌드를 정의하는 tsconfig 파일입니다.", "javascript.suggestionActions.enabled": "편집기에서 JavaScript 파일에 대한 제안 진단을 사용하거나 사용하지 않도록 설정합니다. TypeScript 2.8 이상이 필요합니다.", - "typescript.suggestionActions.enabled": "편집기에서 TypeScript 파일에 대한 제안 진단을 사용하거나 사용하지 않도록 설정합니다. TypeScript 2.8 이상이 필요합니다." + "typescript.suggestionActions.enabled": "편집기에서 TypeScript 파일에 대한 제안 진단을 사용하거나 사용하지 않도록 설정합니다. TypeScript 2.8 이상이 필요합니다.", + "typescript.preferences.quoteStyle": "빠른 수정에 사용할 기본 따옴표 스타일로 '작은' 따옴표, '큰' 따옴표 또는 '자동'입니다. '자동'이면 기존 가져오기에서 따옴표 형식이 유추됩니다. TypeScript 2.9 이상이 필요합니다.", + "typescript.preferences.importModuleSpecifier": "자동 가져오기에 대한 기본 경로 스타일:\n- 파일 위치에 \"상대적\"\n- 'jsconfig.json' / 'tsconfig.json'에 구성된 'baseUrl'을 기준으로 \"상대적이지 않음\"\n- \"자동\"은 가장 짧은 경로 유형을 유추합니다.\nTypeScript 2.9 이상이 필요합니다.", + "typescript.showUnused": "코드에서 사용되지 않는 변수의 강조 표시를 사용하거나 사용하지 않도록 설정합니다. TypeScript 2.9 이상이 필요합니다.", + "typescript.updateImportsOnFileMove.enabled": "VS Code에서 파일을 이동하거나 이름을 바꿀 때 가져오기 경로의 자동 업데이트를 사용하거나 사용하지 않도록 설정합니다. 가능한 값은 'prompt'(이름을 바꿀 때마다 메시지 표시)', 'always'(경로를 항상 자동으로 업데이트) 및 'never'(경로 이름을 바꾸지 않고 메시지를 다시 표시 안 함)입니다. TypeScript 2.9 이상이 필요합니다." } \ No newline at end of file diff --git a/i18n/kor/src/vs/base/node/zip.i18n.json b/i18n/kor/src/vs/base/node/zip.i18n.json index d58831ee8b..0ed982e1de 100644 --- a/i18n/kor/src/vs/base/node/zip.i18n.json +++ b/i18n/kor/src/vs/base/node/zip.i18n.json @@ -2,10 +2,10 @@ "": [ "--------------------------------------------------------------------------------------------", "Copyright (c) Microsoft Corporation. All rights reserved.", - "Licensed under the Source EULA. See License.txt in the project root for license information.", + "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "incompleteExtract": "완료되지 않았습니다. {1}개 항목 중 {0}개가 추출되었습니다.", + "incompleteExtract": "완료되지 않았습니다. {1}개 항목 중 {0}개를 찾았습니다.", "notFound": "zip 파일 내에 {0}이(가) 없습니다." } \ No newline at end of file diff --git a/i18n/kor/src/vs/code/electron-browser/issue/issueReporterMain.i18n.json b/i18n/kor/src/vs/code/electron-browser/issue/issueReporterMain.i18n.json index e629243de3..76588bffb7 100644 --- a/i18n/kor/src/vs/code/electron-browser/issue/issueReporterMain.i18n.json +++ b/i18n/kor/src/vs/code/electron-browser/issue/issueReporterMain.i18n.json @@ -6,6 +6,8 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "hide": "숨기기", + "show": "표시", "previewOnGitHub": "GitHub에서 미리 보기", "loadingData": "데이터 로드 중...", "rateLimited": "GitHub 쿼리 제한이 초과되었습니다. 기다려 주세요.", diff --git a/i18n/kor/src/vs/code/electron-browser/issue/issueReporterPage.i18n.json b/i18n/kor/src/vs/code/electron-browser/issue/issueReporterPage.i18n.json index ea3d4e905b..ff0a015d19 100644 --- a/i18n/kor/src/vs/code/electron-browser/issue/issueReporterPage.i18n.json +++ b/i18n/kor/src/vs/code/electron-browser/issue/issueReporterPage.i18n.json @@ -17,13 +17,12 @@ "issueTitleLabel": "제목", "issueTitleRequired": "제목을 입력하세요.", "titleLengthValidation": "제목이 너무 깁니다.", - "systemInfo": "내 시스템 정보", - "sendData": "내 데이터 보내기", - "processes": "현재 실행 중인 프로세스", - "workspaceStats": "내 작업 영역 통계", - "extensions": "내 확장", - "searchedExtensions": "검색된 확장", - "settingsSearchDetails": "설정 검색 세부 정보", "details": "상세 내용을 입력하세요.", - "loadingData": "데이터 로드 중..." + "sendSystemInfo": "내 시스템 정보 포함({0})", + "show": "표시", + "sendProcessInfo": "현재 실행 중인 프로세스 포함({0})", + "sendWorkspaceInfo": "내 작업 영역 메타데이터 포함({0})", + "sendExtensions": "사용하도록 설정된 확장 포함({0})", + "sendSearchedExtensions": "검색된 확장 보내기({0})", + "sendSettingsSearchDetails": "설정 검색 세부 정보 보내기({0})" } \ No newline at end of file diff --git a/i18n/kor/src/vs/code/electron-browser/processExplorer/processExplorerMain.i18n.json b/i18n/kor/src/vs/code/electron-browser/processExplorer/processExplorerMain.i18n.json index 7fdbd9cc5d..159ef5e93d 100644 --- a/i18n/kor/src/vs/code/electron-browser/processExplorer/processExplorerMain.i18n.json +++ b/i18n/kor/src/vs/code/electron-browser/processExplorer/processExplorerMain.i18n.json @@ -8,8 +8,10 @@ ], "cpu": "CPU %", "memory": "메모리(MB)", - "pid": "pid", + "pid": "PID", "name": "이름", "killProcess": "프로세스 종료", - "forceKillProcess": "프로세스 강제 종료" + "forceKillProcess": "프로세스 강제 종료", + "copy": "복사", + "copyAll": "모두 복사" } \ No newline at end of file diff --git a/i18n/kor/src/vs/code/electron-main/menus.i18n.json b/i18n/kor/src/vs/code/electron-main/menus.i18n.json index 9982cf045f..3c98eab91a 100644 --- a/i18n/kor/src/vs/code/electron-main/menus.i18n.json +++ b/i18n/kor/src/vs/code/electron-main/menus.i18n.json @@ -88,7 +88,6 @@ "miToggleDebugConsole": "디버그 콘솔(&&B)", "miToggleIntegratedTerminal": "통합 터미널(&&I)", "miMarker": "문제(&&P)", - "miAdditionalViews": "추가 뷰(&&V)", "miCommandPalette": "명령 팔레트(&&C)...", "miOpenView": "뷰 열기(&&O)...", "miToggleFullScreen": "전체 화면 설정/해제(&&F)", @@ -144,7 +143,7 @@ "miContinue": "계속(&&C)", "miToggleBreakpoint": "중단점 설정/해제(&&B)", "miConditionalBreakpoint": "조건부 중단점(&&C)...", - "miColumnBreakpoint": "열 중단점(&&O)", + "miInlineBreakpoint": "인라인 중단점(&&O)", "miFunctionBreakpoint": "함수 중단점(&&F)...", "miLogPoint": "Logpoint(&&L)...", "miNewBreakpoint": "새 중단점(&&N)", diff --git a/i18n/kor/src/vs/editor/browser/widget/codeEditorWidget.i18n.json b/i18n/kor/src/vs/editor/browser/widget/codeEditorWidget.i18n.json new file mode 100644 index 0000000000..abc2f81a46 --- /dev/null +++ b/i18n/kor/src/vs/editor/browser/widget/codeEditorWidget.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "cursors.maximum": "커서 수는 {0}(으)로 제한되었습니다." +} \ No newline at end of file diff --git a/i18n/kor/src/vs/editor/common/config/commonEditorConfig.i18n.json b/i18n/kor/src/vs/editor/common/config/commonEditorConfig.i18n.json index fb14d2e1bc..c96c0fe146 100644 --- a/i18n/kor/src/vs/editor/common/config/commonEditorConfig.i18n.json +++ b/i18n/kor/src/vs/editor/common/config/commonEditorConfig.i18n.json @@ -2,7 +2,7 @@ "": [ "--------------------------------------------------------------------------------------------", "Copyright (c) Microsoft Corporation. All rights reserved.", - "Licensed under the Source EULA. See License.txt in the project root for license information.", + "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], @@ -16,7 +16,7 @@ "lineNumbers.on": "줄 번호는 절대값으로 렌더링 됩니다.", "lineNumbers.relative": "줄 번호는 커서 위치에서 줄 간격 거리로 렌더링 됩니다.", "lineNumbers.interval": "줄 번호는 매 10 줄마다 렌더링이 이루어집니다.", - "lineNumbers": "줄 번호 표시를 제어합니다.", + "lineNumbers": "줄 번호의 표시 여부를 제어합니다.", "rulers": "특정 수의 고정 폭 문자 뒤에 세로 눈금자를 렌더링합니다. 여러 눈금자의 경우 여러 값을 사용합니다. 배열이 비어 있는 경우 눈금자가 그려져 있지 않습니다.", "wordSeparators": "단어 관련 탐색 또는 작업을 수행할 때 단어 구분 기호로 사용되는 문자입니다.", "tabSize": "탭 한 개에 해당하는 공백 수입니다. `editor.detectIndentation`이 켜져 있는 경우 이 설정은 파일 콘텐츠에 따라 재정의됩니다.", @@ -26,6 +26,7 @@ "detectIndentation": "파일을 열면 파일 콘텐츠를 기반으로 하여 'editor.tabSize'와 'editor.insertSpaces'가 검색됩니다.", "roundedSelection": "선택 항목의 모서리를 둥글게 할지 여부를 제어합니다.", "scrollBeyondLastLine": "편집기에서 마지막 줄 이후로 스크롤할지 여부를 제어합니다.", + "scrollBeyondLastColumn": "편집기에서 가로로 스크롤되는 범위를 벗어나는 추가 문자의 수를 제어합니다.", "smoothScrolling": "편집기에서 애니메이션을 사용하여 스크롤할지 여부를 제어합니다.", "minimap.enabled": "미니맵 표시 여부를 제어합니다.", "minimap.side": "미니맵을 렌더링할 측면을 제어합니다.", @@ -41,7 +42,7 @@ "wordWrap.bounded": "뷰포트의 최소값 및 `editor.wordWrapColumn`에서 줄이 바뀝니다.", "wordWrap": "줄 바꿈 여부를 제어합니다. 다음 중 하나일 수 있습니다.\n - 'off' (줄 바꿈 사용 안 함),\n - 'on' (뷰포트 줄 바꿈),\n - 'wordWrapColumn' (`editor.wordWrapColumn`에서 줄 바꿈) 또는\n - 'bounded' (뷰포트의 최소값 및 `editor.wordWrapColumn`에서 줄 바꿈).", "wordWrapColumn": "`editor.wordWrap`이 'wordWrapColumn' 또는 'bounded'인 경우 편집기의 열 줄 바꿈을 제어합니다.", - "wrappingIndent": "줄 바꿈 행의 들여쓰기를 제어합니다. 'none', 'same' 또는 'indent' 중 하나일 수 있습니다.", + "wrappingIndent": "줄 바꿈 행의 들여쓰기를 제어합니다. 'none', 'same', 'indent' 또는 'deepIndent' 중 하나일 수 있습니다.", "mouseWheelScrollSensitivity": "마우스 휠 스크롤 이벤트의 `deltaX` 및 `deltaY`에서 사용할 승수", "multiCursorModifier.ctrlCmd": "Windows와 Linux의 'Control'을 macOS의 'Command'로 매핑합니다.", "multiCursorModifier.alt": "Windows와 Linux의 'Alt'를 macOS의 'Option'으로 매핑합니다.", diff --git a/i18n/kor/src/vs/editor/common/view/editorColorRegistry.i18n.json b/i18n/kor/src/vs/editor/common/view/editorColorRegistry.i18n.json index 6dd11aae95..c148a56d8d 100644 --- a/i18n/kor/src/vs/editor/common/view/editorColorRegistry.i18n.json +++ b/i18n/kor/src/vs/editor/common/view/editorColorRegistry.i18n.json @@ -17,7 +17,7 @@ "editorActiveIndentGuide": "활성 편집기 들여쓰기 안내선 색입니다.", "editorLineNumbers": "편집기 줄 번호 색입니다.", "editorActiveLineNumber": "편집기 활성 영역 줄번호 색상", - "deprecatedEditorActiveLineNumber": "Id는 사용 되지 않습니다. 대신 'editorLineNumber.activeForeground'를 사용 합니다.", + "deprecatedEditorActiveLineNumber": "ID는 사용되지 않습니다. 대신 'editorLineNumber.activeForeground'를 사용하세요.", "editorRuler": "편집기 눈금의 색상입니다.", "editorCodeLensForeground": "편집기 코드 렌즈의 전경색입니다.", "editorBracketMatchBackground": "일치하는 괄호 뒤의 배경색", @@ -32,6 +32,7 @@ "infoBorder": "편집기 내 정보 표시선의 테두리 색입니다.", "hintForeground": "편집기에서 힌트 표시선의 전경색입니다.", "hintBorder": "편집기에서 힌트 표시선의 테두리 색입니다.", + "unnecessaryForeground": "편집기 내 불필요한 코드의 전경색입니다.", "overviewRulerRangeHighlight": "범위 강조의 개요 눈금자 표식 색입니다. 이 색은 불투명해야만 내부 장식을 가리지 않습니다.", "overviewRuleError": "오류의 개요 눈금자 마커 색입니다.", "overviewRuleWarning": "경고의 개요 눈금자 마커 색입니다.", diff --git a/i18n/kor/src/vs/editor/contrib/fontZoom/fontZoom.i18n.json b/i18n/kor/src/vs/editor/contrib/fontZoom/fontZoom.i18n.json new file mode 100644 index 0000000000..bd09d8f546 --- /dev/null +++ b/i18n/kor/src/vs/editor/contrib/fontZoom/fontZoom.i18n.json @@ -0,0 +1,12 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "EditorFontZoomIn.label": "편집기 글꼴 확대", + "EditorFontZoomOut.label": "편집기 글꼴 축소", + "EditorFontZoomReset.label": "편집기 글꼴 확대/축소 다시 설정" +} \ No newline at end of file diff --git a/i18n/kor/src/vs/editor/contrib/goToDefinition/goToDefinitionCommands.i18n.json b/i18n/kor/src/vs/editor/contrib/goToDefinition/goToDefinitionCommands.i18n.json new file mode 100644 index 0000000000..9ea2577ce6 --- /dev/null +++ b/i18n/kor/src/vs/editor/contrib/goToDefinition/goToDefinitionCommands.i18n.json @@ -0,0 +1,25 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "noResultWord": "'{0}'에 대한 정의를 찾을 수 없습니다.", + "generic.noResults": "정의를 찾을 수 없음", + "meta.title": "– {0} 정의", + "actions.goToDecl.label": "정의로 이동", + "actions.goToDeclToSide.label": "측면에서 정의 열기", + "actions.previewDecl.label": "정의 피킹(Peeking)", + "goToImplementation.noResultWord": "'{0}'에 대한 구현을 찾을 수 없습니다.", + "goToImplementation.generic.noResults": "구현을 찾을 수 없습니다.", + "meta.implementations.title": " – {0} 개 구현", + "actions.goToImplementation.label": "구현으로 이동", + "actions.peekImplementation.label": "구현 미리 보기", + "goToTypeDefinition.noResultWord": "'{0}'에 대한 형식 정의를 찾을 수 없습니다.", + "goToTypeDefinition.generic.noResults": "형식 정의를 찾을 수 없습니다.", + "meta.typeDefinitions.title": "– {0} 형식 정의", + "actions.goToTypeDefinition.label": "형식 정의로 이동", + "actions.peekTypeDefinition.label": "형식 정의 미리 보기" +} \ No newline at end of file diff --git a/i18n/kor/src/vs/editor/contrib/goToDefinition/goToDefinitionMouse.i18n.json b/i18n/kor/src/vs/editor/contrib/goToDefinition/goToDefinitionMouse.i18n.json new file mode 100644 index 0000000000..98ad1f027b --- /dev/null +++ b/i18n/kor/src/vs/editor/contrib/goToDefinition/goToDefinitionMouse.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "multipleResults": "{0}개 정의를 표시하려면 클릭하세요." +} \ No newline at end of file diff --git a/i18n/kor/src/vs/editor/contrib/gotoError/gotoError.i18n.json b/i18n/kor/src/vs/editor/contrib/gotoError/gotoError.i18n.json index 75c3b305c9..3f2081c589 100644 --- a/i18n/kor/src/vs/editor/contrib/gotoError/gotoError.i18n.json +++ b/i18n/kor/src/vs/editor/contrib/gotoError/gotoError.i18n.json @@ -7,5 +7,7 @@ "Do not edit this file. It is machine generated." ], "markerAction.next.label": "다음 문제로 이동 (오류, 경고, 정보)", - "markerAction.previous.label": "이전 문제로 이동 (오류, 경고, 정보)" + "markerAction.previous.label": "이전 문제로 이동 (오류, 경고, 정보)", + "markerAction.nextInFiles.label": "파일의 다음 문제로 이동 (오류, 경고, 정보)", + "markerAction.previousInFiles.label": "파일의 이전 문제로 이동 (오류, 경고, 정보)" } \ No newline at end of file diff --git a/i18n/kor/src/vs/editor/contrib/indentation/indentation.i18n.json b/i18n/kor/src/vs/editor/contrib/indentation/indentation.i18n.json index 6fcabd476e..48d9d79aba 100644 --- a/i18n/kor/src/vs/editor/contrib/indentation/indentation.i18n.json +++ b/i18n/kor/src/vs/editor/contrib/indentation/indentation.i18n.json @@ -13,5 +13,6 @@ "indentUsingTabs": "탭을 사용한 들여쓰기", "indentUsingSpaces": "공백을 사용한 들여쓰기", "detectIndentation": "콘텐츠에서 들여쓰기 감지", - "editor.reindentlines": "줄 다시 들여쓰기" + "editor.reindentlines": "줄 다시 들여쓰기", + "editor.reindentselectedlines": "선택한 줄 다시 들여쓰기" } \ No newline at end of file diff --git a/i18n/kor/src/vs/editor/contrib/message/messageController.i18n.json b/i18n/kor/src/vs/editor/contrib/message/messageController.i18n.json index 1ef12fcdba..af6229ea68 100644 --- a/i18n/kor/src/vs/editor/contrib/message/messageController.i18n.json +++ b/i18n/kor/src/vs/editor/contrib/message/messageController.i18n.json @@ -6,5 +6,5 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "editor.readonly": "읽기 전용 편집기에서 편집할 수 없습니다." + "editor.readonly": "읽기 전용 편집기에서는 편집할 수 없습니다." } \ No newline at end of file diff --git a/i18n/kor/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json b/i18n/kor/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json index 79962c1adb..05518f9620 100644 --- a/i18n/kor/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json +++ b/i18n/kor/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json @@ -25,8 +25,6 @@ "uninstallDependeciesConfirmation": "'{0}'만 제거할까요, 아니면 종속성도 제거할까요?", "uninstallOnly": "확장만", "uninstallAll": "모두 제거", - "uninstallConfirmation": "'{0}'을(를) 제거할까요?", - "ok": "확인", "singleDependentError": "확장 '{0}'을(를) 제거할 수 없습니다. 확장 '{1}'이(가) 이 확장에 종속됩니다.", "twoDependentsError": "확장 '{0}'을(를) 제거할 수 없습니다. 확장 '{1}' 및 '{2}'이(가) 이 확장에 종속됩니다.", "multipleDependentsError": "확장 '{0}'을(를) 제거할 수 없습니다. 확장 '{1}', '{2}' 등이 이 확장에 종속됩니다.", diff --git a/i18n/kor/src/vs/platform/node/minimalTranslations.i18n.json b/i18n/kor/src/vs/platform/node/minimalTranslations.i18n.json new file mode 100644 index 0000000000..94c91cdbba --- /dev/null +++ b/i18n/kor/src/vs/platform/node/minimalTranslations.i18n.json @@ -0,0 +1,13 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "showLanguagePackExtensions": "VS Code는 {0}(으)로 제공됩니다. 시작하려면 Marketplace에서 언어 팩을 검색하세요.", + "searchMarketplace": "Marketplace 검색", + "installAndRestartMessage": "VS Code는 {0}(으)로 제공됩니다. 시작하려면 언어 팩을 설치하세요. 다시 시작해야 합니다.", + "installAndRestart": "설치 및 다시 시작" +} \ No newline at end of file diff --git a/i18n/kor/src/vs/platform/theme/common/colorRegistry.i18n.json b/i18n/kor/src/vs/platform/theme/common/colorRegistry.i18n.json index f6ecf213a0..44b01274f5 100644 --- a/i18n/kor/src/vs/platform/theme/common/colorRegistry.i18n.json +++ b/i18n/kor/src/vs/platform/theme/common/colorRegistry.i18n.json @@ -2,7 +2,7 @@ "": [ "--------------------------------------------------------------------------------------------", "Copyright (c) Microsoft Corporation. All rights reserved.", - "Licensed under the Source EULA. See License.txt in the project root for license information.", + "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], @@ -16,7 +16,7 @@ "selectionBackground": "워크벤치의 텍스트 선택(예: 입력 필드 또는 텍스트 영역) 전경색입니다. 편집기 내의 선택에는 적용되지 않습니다.", "textSeparatorForeground": "텍스트 구분자 색상입니다.", "textLinkForeground": "텍스트 내 링크의 전경색입니다.", - "textLinkActiveForeground": "텍스트 내 활성 링크의 전경색입니다.", + "textLinkActiveForeground": "클릭하고 마우스가 올라간 상태의 텍스트 내 링크의 전경색입니다.", "textPreformatForeground": "미리 서식이 지정된 텍스트 세그먼트의 전경색입니다.", "textBlockQuoteBackground": "텍스트 내 블록 인용의 전경색입니다.", "textBlockQuoteBorder": "텍스트 내 블록 인용의 테두리 색입니다.", @@ -48,6 +48,8 @@ "listDropBackground": "마우스로 항목을 이동할 때 목록/트리 끌어서 놓기 배경입니다.", "highlight": "목록/트리 내에서 검색할 때 일치 항목 강조 표시의 목록/트리 전경색입니다.", "invalidItemForeground": "잘못된 항목에 대한 목록/트리 전경 색(예: 탐색기의 확인할 수 없는 루트).", + "listErrorForeground": "오류를 포함하는 목록 항목의 전경색입니다.", + "listWarningForeground": "경고를 포함하는 목록 항목의 전경색입니다.", "pickerGroupForeground": "그룹화 레이블에 대한 빠른 선택기 색입니다.", "pickerGroupBorder": "그룹화 테두리에 대한 빠른 선택기 색입니다.", "buttonForeground": "단추 기본 전경색입니다.", @@ -58,7 +60,7 @@ "scrollbarShadow": "스크롤되는 보기를 나타내는 스크롤 막대 그림자입니다.", "scrollbarSliderBackground": "스크롤 막대 슬라이버 배경색입니다.", "scrollbarSliderHoverBackground": "마우스로 가리킬 때 스크롤 막대 슬라이더 배경색입니다.", - "scrollbarSliderActiveBackground": "활성 상태일 때 스크롤 막대 슬라이더 배경색입니다.", + "scrollbarSliderActiveBackground": "클릭된 상태일 때 스크롤 막대 슬라이더 배경색입니다.", "progressBarBackground": "오래 실행 중인 작업에 대해 표시되는 진행률 표시 막대의 배경색입니다.", "editorBackground": "편집기 배경색입니다.", "editorForeground": "편집기 기본 전경색입니다.", @@ -75,6 +77,7 @@ "editorFindMatchBorder": "현재 검색과 일치하는 테두리 색입니다.", "findMatchHighlightBorder": "다른 검색과 일치하는 테두리 색입니다.", "findRangeHighlightBorder": "검색을 제한하는 범위의 테두리 색입니다. 이 색은 기본 장식을 가리지 않도록 불투명하지 않아야 합니다.", + "findWidgetResizeBorder": "찾기 위젯의 크기 조정 막대의 테두리 색입니다.", "hoverHighlight": "호버가 표시된 단어 아래를 강조 표시합니다. 색상은 밑의 꾸밈을 가리지 않도록 반드시 불투명이 아니어야 합니다.", "hoverBackground": "편집기 호버의 배경색.", "hoverBorder": "편집기 호버의 테두리 색입니다.", diff --git a/i18n/kor/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.i18n.json b/i18n/kor/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.i18n.json index 06c3296dbe..6846014640 100644 --- a/i18n/kor/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.i18n.json +++ b/i18n/kor/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.i18n.json @@ -6,5 +6,5 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "confirmUrl": "{0} 확장에서 다음 URL을 열도록 허용하시겠습니까?" + "confirmUrl": "확장이 이 URL을 열도록 허용하겠습니까?" } \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json b/i18n/kor/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json index a294bc2701..4fcdf62298 100644 --- a/i18n/kor/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json +++ b/i18n/kor/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json @@ -8,13 +8,12 @@ ], "vscode.extension.contributes.views.containers.id": "'뷰' 기여 지점을 사용하여 뷰가 기여될 수 있는 컨테이너를 식별하는 데 사용되는 고유한 ID", "vscode.extension.contributes.views.containers.title": "컨테이너를 렌더링하는 데 사용되는 사람이 읽을 수 있는 문자열", - "vscode.extension.contributes.views.containers.icon": "컨테이너 아이콘의 경로입니다. 아이콘은 50x40 사각형의 가운데에 있는 24x24 크기이며 채우기 색은 'rgb(215, 218, 224)' 또는 '#d7dae0'입니다. 아이콘의 이미지 파일 형식은 무엇이든 상관없지만 SVG를 사용하는 것이 좋습니다.", + "vscode.extension.contributes.views.containers.icon": "컨테이너 아이콘의 경로입니다. 아이콘은 50x40 사각형의 가운데에 있는 24x24 크기이며 채우기 색은 'rgb(215, 218, 224)' 또는 '#d7dae0'입니다. 아이콘의 이미지 파일 형식은 무엇이든 상관없지만 SVG를 사용하는 것이 좋습니다..", "vscode.extension.contributes.viewsContainers": "뷰 컨테이너를 편집기에 기여합니다.", "views.container.activitybar": "뷰 컨테이너를 작업 막대에 기여", "test": "테스트", - "proposed": "'viewsContainers' 기여는 dev 외부에서 실행하거나 명령줄 스위치 --enable-proposed-api {0}을(를) 사용하여 실행할 때만 사용할 수 있습니다.", "requirearray": "뷰 컨테이너는 배열이어야 합니다.", - "requireidstring": "`{0}` 속성은 필수이며 `string` 형식이어야 합니다. 영숫자, '_', '-'만 사용할 수 있습니다.", + "requireidstring": "`{0}` 속성은 필수이며 `string` 형식이어야 합니다. 영숫자와 , '_', '-'만 사용할 수 있습니다.", "requirestring": "속성 `{0}`은(는) 필수이며 `string` 형식이어야 합니다.", "showViewlet": "{0} 표시", "view": "보기" diff --git a/i18n/kor/src/vs/workbench/browser/actions/workspaceActions.i18n.json b/i18n/kor/src/vs/workbench/browser/actions/workspaceActions.i18n.json index 3188156427..08c7f8855a 100644 --- a/i18n/kor/src/vs/workbench/browser/actions/workspaceActions.i18n.json +++ b/i18n/kor/src/vs/workbench/browser/actions/workspaceActions.i18n.json @@ -15,5 +15,5 @@ "saveWorkspace": "작업 영역 저장", "openWorkspaceAction": "작업 영역 열기...", "openWorkspaceConfigFile": "작업 영역 구성 파일 열기", - "openFolderAsWorkspaceInNewWindow": "새 창에서 작업 영역으로 폴더 열기" + "duplicateWorkspaceInNewWindow": "새 창에 작업 영역 복제" } \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/browser/parts/panel/panelPart.i18n.json b/i18n/kor/src/vs/workbench/browser/parts/panel/panelPart.i18n.json index fef18de443..7a9e551834 100644 --- a/i18n/kor/src/vs/workbench/browser/parts/panel/panelPart.i18n.json +++ b/i18n/kor/src/vs/workbench/browser/parts/panel/panelPart.i18n.json @@ -1,8 +1,10 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the Source EULA. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ -// Do not edit this file. It is machine generated. { - "panelSwitcherBarAriaLabel": "활성 패널 전환기" + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "hidePanel": "패널 숨기기" } \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/browser/parts/quickopen/quickOpenController.i18n.json b/i18n/kor/src/vs/workbench/browser/parts/quickopen/quickOpenController.i18n.json index 278ef1ca46..b3dcd91b36 100644 --- a/i18n/kor/src/vs/workbench/browser/parts/quickopen/quickOpenController.i18n.json +++ b/i18n/kor/src/vs/workbench/browser/parts/quickopen/quickOpenController.i18n.json @@ -6,8 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "inputModeEntryDescription": "{0}(확인하려면 'Enter' 키를 누르고, 취소하려면 'Escape' 키를 누름)", - "inputModeEntry": "입력을 확인하려면 'Enter' 키를 누르고, 취소하려면 'Esc' 키를 누르세요.", "emptyPicks": "선택할 항목이 없습니다.", "quickOpenInput": "'?'를 입력하면 여기에서 수행할 수 있는 작업에 대한 도움말을 확인할 수 있습니다.", "historyMatches": "최근에 사용한 항목", diff --git a/i18n/kor/src/vs/workbench/browser/parts/views/viewsViewlet.i18n.json b/i18n/kor/src/vs/workbench/browser/parts/views/viewsViewlet.i18n.json index e19f0a8713..6ac97a0ad9 100644 --- a/i18n/kor/src/vs/workbench/browser/parts/views/viewsViewlet.i18n.json +++ b/i18n/kor/src/vs/workbench/browser/parts/views/viewsViewlet.i18n.json @@ -6,5 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "cannot toggle": "이 {0} 뷰에서 표시 여부를 전환할 수 없습니다.", + "cannot show": "이 {0} 뷰는 'when' 조건으로 숨겨져 있으므로 표시할 수 없습니다.", "hideView": "숨기기" } \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/common/theme.i18n.json b/i18n/kor/src/vs/workbench/common/theme.i18n.json index 14b59c36d3..bd9dac5f7e 100644 --- a/i18n/kor/src/vs/workbench/common/theme.i18n.json +++ b/i18n/kor/src/vs/workbench/common/theme.i18n.json @@ -11,8 +11,10 @@ "tabHoverBackground": "마우스 커서를 올려놓았을 때의 탭 배경색. 탭은 편집 영역에서 편집기를 감싸고 있습니다. 한 편집기 그룹에서 여러 탭을 열 수 있습니다. 편집기 그룹이 여러 개일 수 있습니다.", "tabUnfocusedHoverBackground": "마우스 커서를 올려놓았을 때 포커스를 받지 못한 탭 배경색. 탭은 편집 영역에서 편집기를 감싸고 있습니다. 한 편집기 그룹에서 여러 탭을 열 수 있습니다. 편집기 그룹이 여러 개일 수 있습니다.", "tabBorder": "탭을 서로 구분하기 위한 테두리입니다. 탭은 편집기 영역에서 편집기의 컨테이너입니다. 한 편집기 그룹에 여러 탭을 열 수 있습니다. 여러 편집기 그룹이 있을 수 있습니다.", - "tabActiveBorder": "활성 탭을 강조 표시하기 위한 테두리입니다. 탭은 편집기 영역에서 편집기의 컨테이너입니다. 한 편집기 그룹에 여러 탭을 열 수 있습니다. 여러 편집기 그룹이 있을 수 있습니다.", - "tabActiveUnfocusedBorder": "포커스가 없는 그룹에서 활성 탭을 강조 표시하기 위한 테두리입니다. 탭은 편집기 영역에서 편집기의 컨테이너입니다. 한 편집기 그룹에 여러 탭을 열 수 있습니다. 여러 편집기 그룹이 있을 수 있습니다.", + "tabActiveBorder": "활성 탭 맨 아래의 테두리입니다. 탭은 편집기 영역에서 편집기의 컨테이너입니다. 한 편집기 그룹에 여러 탭을 열 수 있습니다. 여러 편집기 그룹이 있을 수 있습니다.", + "tabActiveBorderTop": "활성 탭 맨 위의 위한 테두리입니다. 탭은 편집기 영역에서 편집기의 컨테이너입니다. 한 편집기 그룹에 여러 탭을 열 수 있습니다. 여러 편집기 그룹이 있을 수 있습니다.", + "tabActiveUnfocusedBorder": "포커스가 없는 그룹에서 활성 탭 맨 아래의 테두리입니다. 탭은 편집기 영역에서 편집기의 컨테이너입니다. 한 편집기 그룹에 여러 탭을 열 수 있습니다. 여러 편집기 그룹이 있을 수 있습니다.", + "tabActiveUnfocusedBorderTop": "포커스가 없는 그룹에서 활성 탭 맨 위의 테두리입니다. 탭은 편집기 영역에서 편집기의 컨테이너입니다. 한 편집기 그룹에 여러 탭을 열 수 있습니다. 여러 편집기 그룹이 있을 수 있습니다.", "tabHoverBorder": "마우스 커서를 올려놓았을 때 활성 탭의 테두리. 탭은 편집 영역에서 편집기를 감싸고 있습니다. 한 편집기 그룹에서 여러 탭을 열 수 있습니다. 편집기 그룹이 여러 개일 수 있습니다.", "tabUnfocusedHoverBorder": "마우스 커서를 올려놓았을 때 포커스를 받지 못한 그룹에서 활성 탭 테두리. 탭은 편집 영역에서 편집기를 감싸고 있습니다. 한 편집기 그룹에서 여러 탭을 열 수 있습니다. 편집기 그룹이 여러 개일 수 있습니다.", "tabActiveForeground": "활성 그룹의 활성 탭 전경색입니다. 탭은 편집기 영역에서 편집기의 컨테이너입니다. 한 편집기 그룹에서 여러 탭을 열 수 있습니다. 여러 편집기 그룹이 있을 수 있습니다.", diff --git a/i18n/kor/src/vs/workbench/parts/codeEditor/electron-browser/largeFileOptimizations.i18n.json b/i18n/kor/src/vs/workbench/parts/codeEditor/electron-browser/largeFileOptimizations.i18n.json new file mode 100644 index 0000000000..b3091669ff --- /dev/null +++ b/i18n/kor/src/vs/workbench/parts/codeEditor/electron-browser/largeFileOptimizations.i18n.json @@ -0,0 +1,13 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "largeFile": "{0}: 메모리 사용을 줄이고 멈춤 또는 작동 중단을 방지하기 위해 이 큰 파일에 대해 토큰화, 줄 바꿈 및 접기를 해제했습니다.", + "neverShowAgain": "다시 표시 안 함", + "removeOptimizations": "강제로 기능을 사용하도록 설정", + "reopenFilePrompt": "이 설정을 적용하려면 파일을 다시 여세요." +} \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/parts/debug/browser/debugActions.i18n.json b/i18n/kor/src/vs/workbench/parts/debug/browser/debugActions.i18n.json index a22249bbe4..14dae8c0d5 100644 --- a/i18n/kor/src/vs/workbench/parts/debug/browser/debugActions.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/debug/browser/debugActions.i18n.json @@ -41,7 +41,7 @@ "debugConsoleAction": "디버그 콘솔", "unreadOutput": "디버그 콘솔의 새 출력", "debugFocusConsole": "디버그 콘솔에 포커스", - "focusProcess": "프로세스에 포커스", + "focusSession": "세션에 포커스 설정", "stepBackDebug": "뒤로 이동", "reverseContinue": "반전" } \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/parts/debug/browser/debugCommands.i18n.json b/i18n/kor/src/vs/workbench/parts/debug/browser/debugCommands.i18n.json index ac4133d2b4..3189360bc8 100644 --- a/i18n/kor/src/vs/workbench/parts/debug/browser/debugCommands.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/debug/browser/debugCommands.i18n.json @@ -7,7 +7,7 @@ "Do not edit this file. It is machine generated." ], "noFolderDebugConfig": "고급 디버그 구성을 수행하려면 먼저 폴더를 여세요.", - "columnBreakpoint": "열 중단점", + "inlineBreakpoint": "인라인 중단점", "debug": "디버그", - "addColumnBreakpoint": "열 중단점 추가" + "addInlineBreakpoint": "인라인 중단점 추가" } \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/parts/debug/browser/debugEditorActions.i18n.json b/i18n/kor/src/vs/workbench/parts/debug/browser/debugEditorActions.i18n.json index 9b0460519f..6a3df39c24 100644 --- a/i18n/kor/src/vs/workbench/parts/debug/browser/debugEditorActions.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/debug/browser/debugEditorActions.i18n.json @@ -2,15 +2,17 @@ "": [ "--------------------------------------------------------------------------------------------", "Copyright (c) Microsoft Corporation. All rights reserved.", - "Licensed under the Source EULA. See License.txt in the project root for license information.", + "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], "toggleBreakpointAction": "디버그: 중단점 설정/해제", "conditionalBreakpointEditorAction": "디버그: 조건부 중단점 추가...", - "logPointEditorAction": "디버그: Logpoint 추가...", + "logPointEditorAction": "디버그 : Logpoint 추가...", "runToCursor": "커서까지 실행", "debugEvaluate": "디버그: 평가", "debugAddToWatch": "디버그: 조사식에 추가", - "showDebugHover": "디버그: 가리키기 표시" + "showDebugHover": "디버그: 가리키기 표시", + "goToNextBreakpoint": "디버그 : 다음 중단점으로 이동", + "goToPreviousBreakpoint": "디버그 : 이전 중단점으로 이동" } \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/parts/debug/browser/debugViewlet.i18n.json b/i18n/kor/src/vs/workbench/parts/debug/browser/debugViewlet.i18n.json index 1e9300e69f..5a37317ee8 100644 --- a/i18n/kor/src/vs/workbench/parts/debug/browser/debugViewlet.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/debug/browser/debugViewlet.i18n.json @@ -6,6 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "startAdditionalSession": "추가 세션 시작", "debugFocusVariablesView": "포커스 변수", "debugFocusWatchView": "포커스 조사식", "debugFocusCallStackView": "포커스 호출 스택", diff --git a/i18n/kor/src/vs/workbench/parts/debug/common/debugSchemas.i18n.json b/i18n/kor/src/vs/workbench/parts/debug/common/debugSchemas.i18n.json new file mode 100644 index 0000000000..4f7ea3cfac --- /dev/null +++ b/i18n/kor/src/vs/workbench/parts/debug/common/debugSchemas.i18n.json @@ -0,0 +1,38 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "vscode.extension.contributes.debuggers": "디버그 어댑터를 적용합니다.", + "vscode.extension.contributes.debuggers.type": "이 디버그 어댑터에 대한 고유한 식별자입니다.", + "vscode.extension.contributes.debuggers.label": "이 디버그 어댑터에 대한 이름을 표시합니다.", + "vscode.extension.contributes.debuggers.program": "디버그 어댑터 프로그램의 경로입니다. 절대 경로이거나 확장 폴더의 상대 경로입니다.", + "vscode.extension.contributes.debuggers.args": "어댑터에 전달할 선택적 인수입니다.", + "vscode.extension.contributes.debuggers.runtime": "프로그램 특성이 실행 파일이 아니지만 런타임이 필요한 경우의 선택적 런타임입니다.", + "vscode.extension.contributes.debuggers.runtimeArgs": "선택적 런타임 인수입니다.", + "vscode.extension.contributes.debuggers.variables": "`launch.json`의 대화형 변수(예: ${action.pickProcess})에서 명령으로의 매핑입니다.", + "vscode.extension.contributes.debuggers.initialConfigurations": "초기 'launch.json'을 생성하기 위한 구성입니다.", + "vscode.extension.contributes.debuggers.languages": "디버그 확장이 \"기본 디버거\"로 간주될 수 있는 언어 목록입니다.", + "vscode.extension.contributes.debuggers.adapterExecutableCommand": "지정하는 경우 VS Code에서 이 명령을 호출하여 디버그 어댑터의 실행 파일 경로 및 전달할 인수를 확인합니다.", + "vscode.extension.contributes.debuggers.configurationSnippets": "'launch.json'에 새 구성을 추가하는 코드 조각입니다.", + "vscode.extension.contributes.debuggers.configurationAttributes": "'launch.json'의 유효성 검사를 위한 JSON 스키마 구성입니다.", + "vscode.extension.contributes.debuggers.windows": "Windows 특정 설정", + "vscode.extension.contributes.debuggers.windows.runtime": "Windows에 사용되는 런타임입니다.", + "vscode.extension.contributes.debuggers.osx": "macOS 관련 설정입니다.", + "vscode.extension.contributes.debuggers.osx.runtime": "macOS에 사용되는 런타임입니다.", + "vscode.extension.contributes.debuggers.linux": "Linux 특정 설정", + "vscode.extension.contributes.debuggers.linux.runtime": "Linux에 사용되는 런타임입니다.", + "vscode.extension.contributes.breakpoints": "중단점을 적용합니다.", + "vscode.extension.contributes.breakpoints.language": "이 언어에 대해 중단점을 허용합니다.", + "app.launch.json.title": "시작", + "app.launch.json.version": "이 파일 형식의 버전입니다.", + "app.launch.json.configurations": "구성 목록입니다. IntelliSense를 사용하여 새 구성을 추가하거나 기존 구성을 편집합니다.", + "app.launch.json.compounds": "복합의 목록입니다. 각 복합은 함께 시작되는 여러 구성을 참조합니다.", + "app.launch.json.compound.name": "복합의 이름입니다. 구성 시작 드롭 다운 메뉴에 표시됩니다.", + "useUniqueNames": "고유한 구성 이름을 사용하세요.", + "app.launch.json.compound.folder": "복합형 항목이 있는 폴더의 이름입니다.", + "app.launch.json.compounds.configurations": "이 복합의 일부로 시작되는 구성의 이름입니다." +} \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/parts/debug/electron-browser/callStackView.i18n.json b/i18n/kor/src/vs/workbench/parts/debug/electron-browser/callStackView.i18n.json index 10416987a4..fe45f8d436 100644 --- a/i18n/kor/src/vs/workbench/parts/debug/electron-browser/callStackView.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/debug/electron-browser/callStackView.i18n.json @@ -9,7 +9,7 @@ "callstackSection": "호출 스택 섹션", "debugStopped": "{0}에서 일시 중지됨", "callStackAriaLabel": "호출 스택 디버그", - "process": "프로세스", + "session": "세션", "paused": "일시 중지됨", "running": "실행 중", "thread": "스레드", diff --git a/i18n/kor/src/vs/workbench/parts/debug/electron-browser/debug.contribution.i18n.json b/i18n/kor/src/vs/workbench/parts/debug/electron-browser/debug.contribution.i18n.json index cd95b0cf34..5487388626 100644 --- a/i18n/kor/src/vs/workbench/parts/debug/electron-browser/debug.contribution.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/debug/electron-browser/debug.contribution.i18n.json @@ -21,11 +21,12 @@ "allowBreakpointsEverywhere": "모든 파일에 대한 중단점을 설정할 수 있습니다.", "openExplorerOnEnd": "디버그 세션 끝에 탐색기 뷰를 자동으로 엽니다.", "inlineValues": "디버그하는 동안 편집기에서 변수 값을 인라인으로 표시합니다.", - "hideActionBar": "부동 디버그 작업 모음을 숨길지 여부를 제거합니다.", + "toolBarLocation": "디버그 도구 모음의 위치를 제어합니다. \"floating\"(모든 보기에서 부동 창으로 표시), \"docked\"(디버그 보기에 고정) 또는 \"hidden\"(숨김)입니다.", "never": "상태 표시줄에 디버그 표시 안 함", "always": "상태 표시줄에 디버그 항상 표시", "onFirstSessionStart": "디버그가 처음으로 시작된 후에만 상태 표시줄에 디버그 표시", "showInStatusBar": "디버그 상태 표시줄을 표시할 시기를 제어합니다.", "openDebug": "디버깅 세션 시작 시에 디버그 보기를 열지 여부를 제어합니다", + "enableAllHovers": "디버그할 때 디버그가 아닌 가리키기를 사용하도록 설정할지 여부를 제어합니다. True이면 가리키기를 제공하기 위해 가리키기 공급자를 호출합니다. 이 설정이 true인 경우에도 일반 가리키기는 표시되지 않습니다.", "launch": "전역 디버그 시작 구성입니다. 작업 영역에서 공유되는 \n 'launch.json'에 대한 대체로 사용되어야 합니다." } \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.i18n.json b/i18n/kor/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.i18n.json index cae66dae76..dc993a8c3d 100644 --- a/i18n/kor/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.i18n.json @@ -2,39 +2,10 @@ "": [ "--------------------------------------------------------------------------------------------", "Copyright (c) Microsoft Corporation. All rights reserved.", - "Licensed under the Source EULA. See License.txt in the project root for license information.", + "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "vscode.extension.contributes.debuggers": "디버그 어댑터를 적용합니다.", - "vscode.extension.contributes.debuggers.type": "이 디버그 어댑터에 대한 고유한 식별자입니다.", - "vscode.extension.contributes.debuggers.label": "이 디버그 어댑터에 대한 이름을 표시합니다.", - "vscode.extension.contributes.debuggers.program": "디버그 어댑터 프로그램의 경로입니다. 절대 경로이거나 확장 폴더의 상대 경로입니다.", - "vscode.extension.contributes.debuggers.args": "어댑터에 전달할 선택적 인수입니다.", - "vscode.extension.contributes.debuggers.runtime": "프로그램 특성이 실행 파일이 아니지만 런타임이 필요한 경우의 선택적 런타임입니다.", - "vscode.extension.contributes.debuggers.runtimeArgs": "선택적 런타임 인수입니다.", - "vscode.extension.contributes.debuggers.variables": "`launch.json`의 대화형 변수(예: ${action.pickProcess})에서 명령으로의 매핑입니다.", - "vscode.extension.contributes.debuggers.initialConfigurations": "초기 'launch.json'을 생성하기 위한 구성입니다.", - "vscode.extension.contributes.debuggers.languages": "디버그 확장이 \"기본 디버거\"로 간주될 수 있는 언어 목록입니다.", - "vscode.extension.contributes.debuggers.adapterExecutableCommand": "지정하는 경우 VS Code에서 이 명령을 호출하여 디버그 어댑터의 실행 파일 경로 및 전달할 인수를 확인합니다.", - "vscode.extension.contributes.debuggers.configurationSnippets": "'launch.json'에 새 구성을 추가하는 코드 조각입니다.", - "vscode.extension.contributes.debuggers.configurationAttributes": "'launch.json'의 유효성 검사를 위한 JSON 스키마 구성입니다.", - "vscode.extension.contributes.debuggers.windows": "Windows 특정 설정", - "vscode.extension.contributes.debuggers.windows.runtime": "Windows에 사용되는 런타임입니다.", - "vscode.extension.contributes.debuggers.osx": "macOS 관련 설정입니다.", - "vscode.extension.contributes.debuggers.osx.runtime": "macOS에 사용되는 런타임입니다.", - "vscode.extension.contributes.debuggers.linux": "Linux 특정 설정", - "vscode.extension.contributes.debuggers.linux.runtime": "Linux에 사용되는 런타임입니다.", - "vscode.extension.contributes.breakpoints": "중단점을 적용합니다.", - "vscode.extension.contributes.breakpoints.language": "이 언어에 대해 중단점을 허용합니다.", - "app.launch.json.title": "시작", - "app.launch.json.version": "이 파일 형식의 버전입니다.", - "app.launch.json.configurations": "구성 목록입니다. IntelliSense를 사용하여 새 구성을 추가하거나 기존 구성을 편집합니다.", - "app.launch.json.compounds": "복합의 목록입니다. 각 복합은 함께 시작되는 여러 구성을 참조합니다.", - "app.launch.json.compound.name": "복합의 이름입니다. 구성 시작 드롭 다운 메뉴에 표시됩니다.", - "useUniqueNames": "고유한 구성 이름을 사용하세요.", - "app.launch.json.compound.folder": "복합형 항목이 있는 폴더의 이름입니다.", - "app.launch.json.compounds.configurations": "이 복합의 일부로 시작되는 구성의 이름입니다.", "debugNoType": "디버거 '형식'은 생략할 수 없으며 '문자열' 형식이어야 합니다.", "selectDebug": "환경 선택", "DebugConfig.failed": "'.vscode' 폴더({0}) 내에 'launch.json' 파일을 만들 수 없습니다.", diff --git a/i18n/kor/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json b/i18n/kor/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json index e34b8e0458..e665f02c02 100644 --- a/i18n/kor/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json @@ -13,15 +13,15 @@ "disableBreakpoint": "{0} 사용 안 함", "enableBreakpoint": "{0} 사용", "removeBreakpoints": "중단점 제거", - "removeBreakpointOnColumn": "{0} 열에서 중단점 제거", + "removeInlineBreakpointOnColumn": "{0} 열에서 인라인 중단점 제거", "removeLineBreakpoint": "줄 중단점 제거", "editBreakpoints": "중단점 편집", - "editBreakpointOnColumn": "{0} 열에서 중단점 편집", + "editInlineBreakpointOnColumn": "{0} 열에서 인라인 중단점 편집", "editLineBrekapoint": "줄 중단점 편집", "enableDisableBreakpoints": "중단점 사용/사용 안 함", - "disableColumnBreakpoint": "{0} 열에서 중단점 사용 안 함", + "disableInlineColumnBreakpoint": "{0} 열에서 인라인 중단점 사용 안 함", "disableBreakpointOnLine": "줄 중단점 사용 안 함", - "enableBreakpoints": "{0} 열에서 중단점 사용", + "enableBreakpoints": "{0} 열에서 인라인 중단점 사용", "enableBreakpointOnLine": "줄 중단점 사용", "addBreakpoint": "중단점 추가", "addConditionalBreakpoint": "조건부 중단점 추가...", diff --git a/i18n/kor/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.i18n.json b/i18n/kor/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.i18n.json index ac0d427930..0ba9ae100f 100644 --- a/i18n/kor/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.i18n.json @@ -16,9 +16,13 @@ "repository": "리포지토리", "license": "라이선스", "details": "세부 정보", + "detailstooltip": "확장의 'README.md' 파일에서 렌더링된 확장 세부 정보", "contributions": "기여", + "contributionstooltip": "이 확장의 VS Code에 대한 기여 나열", "changelog": "변경 로그", + "changelogtooltip": "확장의 'CHANGELOG.md' 파일에서 렌더링된 확장 업데이트 기록", "dependencies": "종속성", + "dependenciestooltip": "이 확장이 종속된 확장 나열", "noReadme": "사용 가능한 추가 정보가 없습니다.", "noChangelog": "CHANGELOG를 사용할 수 없습니다.", "noContributions": "참여 없음", @@ -30,6 +34,10 @@ "debuggers": "디버거({0})", "debugger name": "이름", "debugger type": "유형", + "viewContainers": "컨테이너 보기({0})", + "view container id": "ID", + "view container title": "제목", + "view container location": "위치", "views": "뷰({0})", "view id": "ID", "view name": "이름", diff --git a/i18n/kor/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json b/i18n/kor/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json index 68ce51ca22..c0be09bc8e 100644 --- a/i18n/kor/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json @@ -8,7 +8,6 @@ ], "neverShowAgain": "다시 표시 안 함", "searchMarketplace": "Marketplace 검색", - "showLanguagePackExtensions": "Marketplace에 VS Code를 '{0}' 로캘로 지역화하는 데 유용한 확장이 있습니다.", "dynamicWorkspaceRecommendation": "이 확장은 {0} 리포지토리의 사용자들에게 인기가 있으므로 관심을 가질 만합니다.", "exeBasedRecommendation": "{0}이(가) 설치되어 있으므로 이 확장을 권장합니다.", "fileBasedRecommendation": "최근에 연 파일을 기반으로 확장이 권장됩니다.", diff --git a/i18n/kor/src/vs/workbench/parts/extensions/node/extensionsWorkbenchService.i18n.json b/i18n/kor/src/vs/workbench/parts/extensions/node/extensionsWorkbenchService.i18n.json index faa804b8f0..aa84fcc7e6 100644 --- a/i18n/kor/src/vs/workbench/parts/extensions/node/extensionsWorkbenchService.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/extensions/node/extensionsWorkbenchService.i18n.json @@ -10,12 +10,12 @@ "malicious": "이 확장은 문제가 있다고 보고되었습니다.", "installingMarketPlaceExtension": "Marketplace에서 확장을 설치하는 중...", "uninstallingExtension": "확장을 제거하는 중....", - "enableDependeciesConfirmation": "'{0}'을(를) 사용하도록 설정하면 종속성도 사용하도록 설정됩니다. 계속하시겠습니까?", + "enableDependeciesConfirmation": "확장을 사용하도록 설정하면 종속성도 사용하도록 설정됩니다. 계속하시겠습니까?", "enable": "예", "doNotEnable": "아니요", - "disableDependeciesConfirmation": "'{0}'만 사용하지 않도록 설정하시겠습니까, 아니면 종속성도 사용하지 않도록 설정하시겠습니까?", - "disableOnly": "만", - "disableAll": "모두", + "disableDependeciesConfirmation": "확장의 종속성도 사용하지 않도록 설정하시겠습니까?", + "yes": "예", + "no": "아니요", "cancel": "취소", "singleDependentError": "확장 '{0}'을(를) 사용하지 않도록 설정할 수 없습니다. 확장 '{1}'이(가) 이 확장에 종속됩니다.", "twoDependentsError": "확장 '{0}'을(를) 사용하지 않도록 설정할 수 없습니다. 확장 '{1}' 및 '{2}'이(가) 이 확장에 종속됩니다.", diff --git a/i18n/kor/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.i18n.json b/i18n/kor/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.i18n.json index 511e22e0dd..66ced1818f 100644 --- a/i18n/kor/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.i18n.json @@ -7,6 +7,7 @@ "Do not edit this file. It is machine generated." ], "updateLocale": "VS Code의 UI 언어를 {0}(으)로 변경하고 다시 시작하시겠습니까?", + "activateLanguagePack": "방금 설치한 언어 팩을 활성화하기 위해 VS Code를 다시 시작하시겠습니까?", "yes": "예", "no": "아니요", "neverAgain": "다시 표시 안 함", diff --git a/i18n/kor/src/vs/workbench/parts/localizations/electron-browser/localizationsActions.i18n.json b/i18n/kor/src/vs/workbench/parts/localizations/electron-browser/localizationsActions.i18n.json index e8656093b5..d312034e6c 100644 --- a/i18n/kor/src/vs/workbench/parts/localizations/electron-browser/localizationsActions.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/localizations/electron-browser/localizationsActions.i18n.json @@ -6,7 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "configureLocale": "언어 구성", + "configureLocale": "표시 언어 구성", "displayLanguage": "VSCode의 표시 언어를 정의합니다.", "doc": "지원되는 언어 목록은 {0} 을(를) 참조하세요.", "restart": "값을 변경하려면 VSCode를 다시 시작해야 합니다.", diff --git a/i18n/kor/src/vs/workbench/parts/outline/electron-browser/outline.contribution.i18n.json b/i18n/kor/src/vs/workbench/parts/outline/electron-browser/outline.contribution.i18n.json new file mode 100644 index 0000000000..06b0fe6877 --- /dev/null +++ b/i18n/kor/src/vs/workbench/parts/outline/electron-browser/outline.contribution.i18n.json @@ -0,0 +1,12 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "name": "개요", + "category.focus": "파일", + "label.focus": "윤곽에 포커스 설정" +} \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/parts/outline/electron-browser/outlinePanel.i18n.json b/i18n/kor/src/vs/workbench/parts/outline/electron-browser/outlinePanel.i18n.json new file mode 100644 index 0000000000..d8be418ac1 --- /dev/null +++ b/i18n/kor/src/vs/workbench/parts/outline/electron-browser/outlinePanel.i18n.json @@ -0,0 +1,17 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "filter": "필터", + "collapse": "모두 축소", + "sortByPosition": "정렬 기준: 위치", + "sortByName": "정렬 기준: 이름", + "sortByKind": "정렬 기준: 유형", + "live": "커서 따르기", + "no-editor": "윤곽 정보를 제공할 수 있는 편집기가 열려 있지 않습니다.", + "too-many-symbols": "죄송하지만 이 파일이 너무 커서 윤곽을 표시할 수 없습니다." +} \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/parts/outline/electron-browser/outlineTree.i18n.json b/i18n/kor/src/vs/workbench/parts/outline/electron-browser/outlineTree.i18n.json new file mode 100644 index 0000000000..00fc36426e --- /dev/null +++ b/i18n/kor/src/vs/workbench/parts/outline/electron-browser/outlineTree.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "outline.title": "{1}의 줄 {0}" +} \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/parts/output/browser/outputPanel.i18n.json b/i18n/kor/src/vs/workbench/parts/output/browser/outputPanel.i18n.json index 154beffb8d..f0a0ea8cbe 100644 --- a/i18n/kor/src/vs/workbench/parts/output/browser/outputPanel.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/output/browser/outputPanel.i18n.json @@ -6,6 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "output": "출력", "outputPanelWithInputAriaLabel": "{0}, 출력 패널", "outputPanelAriaLabel": "출력 패널" } \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/parts/preferences/browser/keybindingWidgets.i18n.json b/i18n/kor/src/vs/workbench/parts/preferences/browser/keybindingWidgets.i18n.json index ab44775b96..705fa0a77e 100644 --- a/i18n/kor/src/vs/workbench/parts/preferences/browser/keybindingWidgets.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/preferences/browser/keybindingWidgets.i18n.json @@ -6,6 +6,8 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "defineKeybinding.oneExists": "1개의 기존 명령에 이 키 바인딩이 있습니다.", + "defineKeybinding.existing": "{0}개의 기존 명령에 이 키 바인딩이 있습니다.", "defineKeybinding.initial": "원하는 키 조합을 누르고 키를 누르세요.", "defineKeybinding.chordsTo": "현" } \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json b/i18n/kor/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json index b7c089a52d..7c2a6b8b57 100644 --- a/i18n/kor/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json @@ -7,6 +7,7 @@ "Do not edit this file. It is machine generated." ], "openRawDefaultSettings": "원시 기본 설정 열기", + "openSettings2": "설정 열기(미리 보기)", "openSettings": "설정 열기", "openGlobalSettings": "사용자 설정 열기", "openGlobalKeybindings": "바로 가기 키 열기", diff --git a/i18n/kor/src/vs/workbench/parts/preferences/browser/settingsEditor2.i18n.json b/i18n/kor/src/vs/workbench/parts/preferences/browser/settingsEditor2.i18n.json new file mode 100644 index 0000000000..20795088f9 --- /dev/null +++ b/i18n/kor/src/vs/workbench/parts/preferences/browser/settingsEditor2.i18n.json @@ -0,0 +1,18 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "previewWarning": "미리 보기", + "previewLabel": "새 설정 편집기의 미리 보기입니다.", + "SearchSettings.AriaLabel": "설정 검색", + "SearchSettings.Placeholder": "설정 검색", + "advancedCustomizationLabel": "고급 사용자 지정의 경우 다음 파일을 열고 편집하세요.", + "openSettingsLabel": "settings.json", + "showOverriddenOnly": "수정된 내용만 표시", + "treeAriaLabel": "설정", + "feedbackButtonLabel": "피드백 제공" +} \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/parts/preferences/browser/settingsTree.i18n.json b/i18n/kor/src/vs/workbench/parts/preferences/browser/settingsTree.i18n.json new file mode 100644 index 0000000000..db30cb9c73 --- /dev/null +++ b/i18n/kor/src/vs/workbench/parts/preferences/browser/settingsTree.i18n.json @@ -0,0 +1,19 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "modifiedItemForeground": "수정된 설정의 전경색입니다.", + "workspace": "작업 영역", + "user": "사용자", + "resetButtonTitle": "다시 설정", + "configured": "수정됨", + "alsoConfiguredIn": "다음에서도 수정됨", + "configuredIn": "다음에서 수정됨", + "editInSettingsJson": "settings.json에서 편집", + "settingRowAriaLabel": "{0} {1}, 설정", + "groupRowAriaLabel": "{0}, 그룹" +} \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/parts/preferences/electron-browser/preferences.contribution.i18n.json b/i18n/kor/src/vs/workbench/parts/preferences/electron-browser/preferences.contribution.i18n.json index 3306ffe78d..9fe63924cb 100644 --- a/i18n/kor/src/vs/workbench/parts/preferences/electron-browser/preferences.contribution.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/preferences/electron-browser/preferences.contribution.i18n.json @@ -7,6 +7,7 @@ "Do not edit this file. It is machine generated." ], "defaultPreferencesEditor": "기본 설정 편집기", + "settingsEditor2": "설정 편집기 2", "keybindingsEditor": "키 바인딩 편집기", "preferences": "기본 설정" } \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/parts/search/browser/searchActions.i18n.json b/i18n/kor/src/vs/workbench/parts/search/browser/searchActions.i18n.json index 6fd284ba72..93644ff74b 100644 --- a/i18n/kor/src/vs/workbench/parts/search/browser/searchActions.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/search/browser/searchActions.i18n.json @@ -12,6 +12,8 @@ "previousSearchExcludePattern": "이전 검색 제외 패턴 표시", "nextSearchTerm": "다음 검색어 표시", "previousSearchTerm": "이전 검색어 표시", + "nextReplaceTerm": "다음 검색 대체어 표시", + "previousReplaceTerm": "이전 검색 대체어 표시", "findInFiles": "파일에서 찾기", "replaceInFiles": "파일에서 바꾸기", "RefreshAction.label": "새로 고침", diff --git a/i18n/kor/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json b/i18n/kor/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json index 2d6e06f549..b8f4fa84a2 100644 --- a/i18n/kor/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json @@ -31,5 +31,5 @@ "search.followSymlinks": "검색하는 동안 symlink를 누를지 여부를 제어합니다.", "search.smartCase": "패턴이 모두 소문자인 경우 대/소문자를 구분하지 않고 검색하고, 그렇지 않으면 대/소문자를 구분하여 검색합니다.", "search.globalFindClipboard": "macOS에서 검색 보기가 공유 클립보드 찾기를 읽거나 수정해야 할지를 제어합니다.", - "search.location": "검색을 사이드바의 보기로 표시할지 또는 가로 간격을 늘리기 위해 패널 영역의 패널로 표시할지를 제어합니다. 다음 릴리스의 패널에서의 검색은 가로 레이아웃이 개선되며 더 이상 미리 보기가 아닙니다." + "search.location": "검색을 사이드바의 보기로 표시할지 또는 가로 간격을 늘리기 위해 패널 영역의 패널로 표시할지를 제어합니다." } \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/parts/tasks/electron-browser/jsonSchema_v2.i18n.json b/i18n/kor/src/vs/workbench/parts/tasks/electron-browser/jsonSchema_v2.i18n.json index 7f3fc4d619..4ba62bf77f 100644 --- a/i18n/kor/src/vs/workbench/parts/tasks/electron-browser/jsonSchema_v2.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/tasks/electron-browser/jsonSchema_v2.i18n.json @@ -28,6 +28,7 @@ "JsonSchema.tasks.group.none": "작업을 그룹에 할당 안 함", "JsonSchema.tasks.group": "이 작업을 할당할 실행 그룹을 정의합니다. 빌드 그룹에 추가를 위한 \"build'와 테스트 그룹에 추가를 위한 \"test\"를 지원합니다.", "JsonSchema.tasks.type": "작업이 프로세스로 실행되는지 또는 셸 내의 명령으로 실행되는지를 제어합니다.", + "JsonSchema.commandArray": "실행할 셸 명령입니다. 배열 항목은 공백 문자를 사용하여 연결됩니다.", "JsonSchema.command.quotedString.value": "실제 명령 값", "JsonSchema.tasks.quoting.escape": "셸의 이스케이프 문자를 사용하여 문자를 이스케이프합니다(예: ` under PowerShell 및 \\ under bash).", "JsonSchema.tasks.quoting.strong": "셸의 강력한 따옴표 문자를 사용하여 인수를 따옴표 처리합니다(예: \" under PowerShell and bash).", diff --git a/i18n/kor/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.i18n.json b/i18n/kor/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.i18n.json index 15637141d7..5a8b3d759d 100644 --- a/i18n/kor/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.i18n.json @@ -19,6 +19,7 @@ "terminal.integrated.copyOnSelection": "설정된 경우, 터미널에서 선택된 텍스트가 클립보드로 복사됩니다.", "terminal.integrated.fontFamily": "터미널의 글꼴 패밀리를 제어하며, 기본값은 editor.fontFamily의 값입니다.", "terminal.integrated.fontSize": "터미널의 글꼴 크기(픽셀)를 제어합니다.", + "terminal.integrated.letterSpacing": "터미널의 문자 간격을 제어하며, 문자 사이에 추가할 픽셀의 양을 나타내는 정수 값입니다.", "terminal.integrated.lineHeight": "터미널의 줄 높이를 제어합니다. 이 숫자에 터미널 글꼴 크기를 곱해 실제 줄 높이(픽셀)를 얻습니다.", "terminal.integrated.fontWeight": "터미널 내에서 굵은 글꼴이 아닌 텍스트에 사용할 글꼴 두께입니다.", "terminal.integrated.fontWeightBold": "터미널 내에서 굵은 글꼴 텍스트에 사용할 글꼴 두께입니다.", @@ -26,6 +27,7 @@ "terminal.integrated.cursorStyle": "터미널 커서의 스타일을 제어합니다.", "terminal.integrated.scrollback": "터미널에서 버퍼에 유지하는 최대 줄 수를 제어합니다.", "terminal.integrated.setLocaleVariables": "로캘 변수가 터미널 시작 시 설정되는지 여부를 제어하며, 기본값은 OS X에서 true이고 기타 플랫폼에서 false입니다.", + "terminal.integrated.rendererType": "터미널이 렌더링되는 방식을 제어하며, 옵션은 \"canvas\"(표준(고속) 캔버스 렌더러, \"dom\"(대체 (fallback) DOM 기반 렌더러) 또는 \"auto\"(VS Code에서 어떤 렌더러가 가장 적절할지 추축하도록 허용)입니다. 이 설정을 적용하려면 VS Code를 다시 로드해야 합니다.", "terminal.integrated.rightClickBehavior": "터미널이 마우스 오른쪽 단추 클릭에 대응하는 방식을 제어합니다. 가능한 값은 'default', 'copyPaste' 및 'selectWord'입니다. 'default'는 상황에 맞는 메뉴를 표시하고, 'copyPaste'는 선택 항목이 있으면 복사하고 없으면 붙여 넣으며, 'selectWord'는 커서 아래의 단어를 선택하고 상황에 맞는 메뉴를 표시합니다.", "terminal.integrated.cwd": "터미널이 시작될 명시적 시작 경로입니다. 셸 프로세스의 현재 작업 디렉터리(cwd)로 사용됩니다. 루트 디렉터리가 편리한 cwd가 아닌 경우 작업 영역 설정에서 특히 유용하게 사용할 수 있습니다.", "terminal.integrated.confirmOnExit": "끝낼 때 활성 터미널 세션이 있는지 확인할지 여부입니다.", diff --git a/i18n/kor/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json b/i18n/kor/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json index 3446947ad0..0c53998d6e 100644 --- a/i18n/kor/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json @@ -57,5 +57,7 @@ "workbench.action.terminal.scrollToPreviousCommand": "이전 명령으로 스크롤", "workbench.action.terminal.scrollToNextCommand": "다음 명령으로 스크롤", "workbench.action.terminal.selectToPreviousCommand": "이전 명령까지 선택", - "workbench.action.terminal.selectToNextCommand": "다음 명령까지 선택" + "workbench.action.terminal.selectToNextCommand": "다음 명령까지 선택", + "workbench.action.terminal.selectToPreviousLine": "이전 줄까지 선택", + "workbench.action.terminal.selectToNextLine": "다음 줄까지 선택" } \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.i18n.json b/i18n/kor/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.i18n.json index 5200a408de..260b52f5f8 100644 --- a/i18n/kor/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.i18n.json @@ -9,6 +9,11 @@ "terminal.integrated.a11yBlankLine": "빈 줄", "terminal.integrated.a11yPromptLabel": "터미널 입력", "terminal.integrated.a11yTooMuchOutput": "발표할 출력이 너무 많음, 읽을 행으로 수동 이동", + "yes": "예", + "terminal.rendererInAllNewTerminals": "새로 만든 터미널은 모두 비 GPU 렌더러를 사용합니다.", + "no": "아니요", + "dontShowAgain": "다시 표시 안 함", + "terminal.slowRendering": "통합 터미널의 표준 렌더러가 컴퓨터에서 느린 것 같습니다. 성능을 향상할 수 있는 대체 DOM 기반 렌더러로 전환하시겠습니까? [터미널 설정에 대한 자세한 정보](https://code.visualstudio.com/docs/editor/integrated-terminal#_changing-how-the-terminal-is-rendered)", "terminal.integrated.copySelection.noSelection": "터미널에 복사할 선택 항목이 없음", "terminal.integrated.exitedWithCode": "터미널 프로세스가 종료 코드 {0}(으)로 종료되었습니다.", "terminal.integrated.waitOnExit": "터미널을 닫으려면 아무 키나 누르세요.", diff --git a/i18n/kor/src/vs/workbench/parts/terminal/electron-browser/terminalPanel.i18n.json b/i18n/kor/src/vs/workbench/parts/terminal/electron-browser/terminalPanel.i18n.json index 4a7107c09c..e340cbf8ce 100644 --- a/i18n/kor/src/vs/workbench/parts/terminal/electron-browser/terminalPanel.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/terminal/electron-browser/terminalPanel.i18n.json @@ -6,6 +6,8 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "terminal.useMonospace": "'고정 폭' 사용", + "terminal.monospaceOnly": "터미널은 고정 폭 글꼴만 지원합니다.", "copy": "복사", "split": "분할", "paste": "붙여넣기", diff --git a/i18n/kor/src/vs/workbench/parts/trust/electron-browser/unsupportedWorkspaceSettings.contribution.i18n.json b/i18n/kor/src/vs/workbench/parts/trust/electron-browser/unsupportedWorkspaceSettings.contribution.i18n.json index bd4153193e..0e9f47c7b1 100644 --- a/i18n/kor/src/vs/workbench/parts/trust/electron-browser/unsupportedWorkspaceSettings.contribution.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/trust/electron-browser/unsupportedWorkspaceSettings.contribution.i18n.json @@ -6,7 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "unsupportedWorkspaceSettings": "이 작업 영역에는 사용자 설정({0})에서만 지정할 수 있는 설정이 포함되어 있습니다. 자세히 알아보려면 [여기]({1})를 클릭하세요.", "openWorkspaceSettings": "작업 영역 설정 열기", "dontShowAgain": "다시 표시 안 함", "unsupportedWorkspaceSettings": "이 작업 영역에는 사용자 설정({0})에서만 지정할 수 있는 설정이 포함되어 있습니다. 자세히 알아보려면 [여기]({1})를 클릭하세요." diff --git a/i18n/kor/src/vs/workbench/parts/update/electron-browser/update.i18n.json b/i18n/kor/src/vs/workbench/parts/update/electron-browser/update.i18n.json index 766dc7e7a2..46a0013cd0 100644 --- a/i18n/kor/src/vs/workbench/parts/update/electron-browser/update.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/update/electron-browser/update.i18n.json @@ -20,7 +20,7 @@ "later": "나중에", "updateAvailable": "사용 가능한 업데이트가 있습니다. {0} {1}", "installUpdate": "업데이트 설치", - "updateInstalling": "{0} {1}이(가) 백그라운드로 설치되고 있습니다. 완료되면 알려드리겠습니다.", + "updateInstalling": "{0} {1}이(가) 백그라운드에서 설치되고 있습니다. 설치가 끝나면 알려드리겠습니다.", "updateAvailableAfterRestart": "최신 업데이트를 적용하려면 {0}을(를) 다시 시작하세요.", "updateNow": "지금 업데이트", "commandPalette": "명령 팔레트...", diff --git a/i18n/kor/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThrough.contribution.i18n.json b/i18n/kor/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThrough.contribution.i18n.json index f1bbeff220..1998233704 100644 --- a/i18n/kor/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThrough.contribution.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThrough.contribution.i18n.json @@ -7,6 +7,5 @@ "Do not edit this file. It is machine generated." ], "walkThrough.editor.label": "대화형 실습", - "help": "도움말", - "interactivePlayground": "대화형 실습" + "help": "도움말" } \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/services/bulkEdit/electron-browser/bulkEditService.i18n.json b/i18n/kor/src/vs/workbench/services/bulkEdit/electron-browser/bulkEditService.i18n.json new file mode 100644 index 0000000000..1b092993f5 --- /dev/null +++ b/i18n/kor/src/vs/workbench/services/bulkEdit/electron-browser/bulkEditService.i18n.json @@ -0,0 +1,13 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "summary.0": "편집하지 않음", + "summary.nm": "{1}개 파일에서 {0}개 텍스트 편집을 수행함", + "summary.n0": "1개 파일에서 {0}개 텍스트 편집을 수행함", + "conflict": "이러한 파일이 동시에 변경되었습니다. {0}" +} \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/services/configuration/common/configurationExtensionPoint.i18n.json b/i18n/kor/src/vs/workbench/services/configuration/common/configurationExtensionPoint.i18n.json index 9e248eddb0..36c4cf82b9 100644 --- a/i18n/kor/src/vs/workbench/services/configuration/common/configurationExtensionPoint.i18n.json +++ b/i18n/kor/src/vs/workbench/services/configuration/common/configurationExtensionPoint.i18n.json @@ -16,6 +16,7 @@ "vscode.extension.contributes.configuration": "구성 설정을 적용합니다.", "invalid.title": "'configuration.title'은 문자열이어야 합니다.", "invalid.properties": "'configuration.properties'는 개체여야 합니다.", + "invalid.property": "'configuration.properties'는 개체여야 합니다.", "invalid.allOf": "'configuration.allOf'는 사용되지 않으며 더 이상 사용해서는 안됩니다. 대신 여러 구성 섹션을 배열로 'configuration' 기여 지점에 전달하세요.", "workspaceConfig.folders.description": "작업 영역에 로드되는 폴더 목록입니다.", "workspaceConfig.path.description": "파일 경로입니다. 예: `/root/folderA` 또는 `./folderA`(작업 영역 파일의 위치를 기준으로 확인할 상대 경로인 경우)", diff --git a/i18n/kor/src/vs/workbench/services/configurationResolver/electron-browser/configurationResolverService.i18n.json b/i18n/kor/src/vs/workbench/services/configurationResolver/electron-browser/configurationResolverService.i18n.json index 35229bd669..c8a335099e 100644 --- a/i18n/kor/src/vs/workbench/services/configurationResolver/electron-browser/configurationResolverService.i18n.json +++ b/i18n/kor/src/vs/workbench/services/configurationResolver/electron-browser/configurationResolverService.i18n.json @@ -5,5 +5,6 @@ "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." - ] + ], + "stringsOnlySupported": "{0} 명령이 문자열 결과를 반환하지 않았습니다. 변수 대신 사용한 명령의 결과로는 문자열만 지원됩니다." } \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/services/files/electron-browser/remoteFileService.i18n.json b/i18n/kor/src/vs/workbench/services/files/electron-browser/remoteFileService.i18n.json index b7aef6c171..0f4add7b13 100644 --- a/i18n/kor/src/vs/workbench/services/files/electron-browser/remoteFileService.i18n.json +++ b/i18n/kor/src/vs/workbench/services/files/electron-browser/remoteFileService.i18n.json @@ -6,6 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "invalidPath": "'{0}' 리소스의 경로는 절대 경로여야 합니다.", "fileNotFoundError": "파일을 찾을 수 없습니다({0}).", "fileIsDirectoryError": "파일이 디렉터리입니다.", "fileNotModifiedError": "파일 수정 안 됨", diff --git a/i18n/ptb/extensions/configuration-editing/out/extension.i18n.json b/i18n/ptb/extensions/configuration-editing/out/extension.i18n.json index 64d36e4800..42206ebca3 100644 --- a/i18n/ptb/extensions/configuration-editing/out/extension.i18n.json +++ b/i18n/ptb/extensions/configuration-editing/out/extension.i18n.json @@ -6,5 +6,9 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "workspaceFolder": "O caminho da pasta aberta no VS Code", + "workspaceFolderBasename": "O nome da pasta aberta no VS Code sem barras (/)", + "relativeFile": "[teste]", + "file": "O arquivo aberto atual", "exampleExtension": "Exemplo" } \ No newline at end of file diff --git a/i18n/ptb/extensions/git/out/commands.i18n.json b/i18n/ptb/extensions/git/out/commands.i18n.json index cfaa264b8b..614b7d0fe2 100644 --- a/i18n/ptb/extensions/git/out/commands.i18n.json +++ b/i18n/ptb/extensions/git/out/commands.i18n.json @@ -2,7 +2,7 @@ "": [ "--------------------------------------------------------------------------------------------", "Copyright (c) Microsoft Corporation. All rights reserved.", - "Licensed under the Source EULA. See License.txt in the project root for license information.", + "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], @@ -10,9 +10,9 @@ "remote branch at": "Ramo remoto em {0}", "create branch": "$(plus) criar nova ramificação", "repourl": "URL do repositório", - "parent": "Diretório pai", - "openrepo": "Abrir Repositório", + "cloning": "Clonando repositório git '{0}'...", "proposeopen": "Gostaria de abrir o repositório clonado?", + "openrepo": "Abrir Repositório", "init": "Escolher a pasta de trabalho para inicializar o git repo", "init repo": "Inicializar Repositório", "create repo": "Inicializar Repositório", diff --git a/i18n/ptb/extensions/npm/out/npmView.i18n.json b/i18n/ptb/extensions/npm/out/npmView.i18n.json index 35229bd669..512bbc8790 100644 --- a/i18n/ptb/extensions/npm/out/npmView.i18n.json +++ b/i18n/ptb/extensions/npm/out/npmView.i18n.json @@ -5,5 +5,10 @@ "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." - ] + ], + "noScripts": "Scripts não encontrados.", + "noDebugOptions": "Não foi possível iniciar '{0}' para depuração porque os scripts não possuem uma opção de depuração para node, por exemplo \"--inspect-brk\".", + "learnMore": "Saiba Mais", + "ok": "OK", + "scriptInvalid": "Não foi possível encontrar o script \"{0}\". Tente atualizar a visualização." } \ No newline at end of file diff --git a/i18n/ptb/extensions/npm/out/tasks.i18n.json b/i18n/ptb/extensions/npm/out/tasks.i18n.json index 35229bd669..cbb92a8573 100644 --- a/i18n/ptb/extensions/npm/out/tasks.i18n.json +++ b/i18n/ptb/extensions/npm/out/tasks.i18n.json @@ -5,5 +5,6 @@ "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." - ] + ], + "npm.parseError": "Detecção de tarefa do npm: falha ao analisar o arquivo {0}" } \ No newline at end of file diff --git a/i18n/ptb/extensions/npm/package.i18n.json b/i18n/ptb/extensions/npm/package.i18n.json index 1e4935decb..8efb19208f 100644 --- a/i18n/ptb/extensions/npm/package.i18n.json +++ b/i18n/ptb/extensions/npm/package.i18n.json @@ -12,9 +12,10 @@ "config.npm.runSilent": "Executar comandos npm com a opção '--silent'.", "config.npm.packageManager": "O Gerenciador de pacotes usado para executar scripts.", "config.npm.exclude": "Configure padrões glob para pastas que devem ser excluídos da detecção automática de script.", + "config.npm.enableScriptExplorer": "Ativar uma visualização do explorador para scripts npm.", "npm.parseError": "Deteção de tarefa NPM: falha ao analisar o arquivo {0}", "taskdef.script": "O script npm para personalizar.", - "taskdef.path": "O caminho para a pasta do arquivo package.json que fornece o script. Pode ser omitido.", + "view.name": "Scripts do npm", "command.refresh": "Atualizar", "command.run": "Executar", "command.debug": "Depurar", diff --git a/i18n/ptb/extensions/php/package.i18n.json b/i18n/ptb/extensions/php/package.i18n.json index 5ebf52a77a..66c4ab05ee 100644 --- a/i18n/ptb/extensions/php/package.i18n.json +++ b/i18n/ptb/extensions/php/package.i18n.json @@ -6,6 +6,5 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "displayName": "Noções básicas de linguagem PHP", "description": "Fornece realce de sintaxe e suporte a correspondência de colchetes para arquivos PHP." } \ No newline at end of file diff --git a/i18n/ptb/extensions/search-rg/package.i18n.json b/i18n/ptb/extensions/search-rg/package.i18n.json new file mode 100644 index 0000000000..35229bd669 --- /dev/null +++ b/i18n/ptb/extensions/search-rg/package.i18n.json @@ -0,0 +1,9 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ] +} \ No newline at end of file diff --git a/i18n/ptb/extensions/typescript-language-features/out/features/organizeImports.i18n.json b/i18n/ptb/extensions/typescript-language-features/out/features/organizeImports.i18n.json index a0dd22d5e1..32426c09a5 100644 --- a/i18n/ptb/extensions/typescript-language-features/out/features/organizeImports.i18n.json +++ b/i18n/ptb/extensions/typescript-language-features/out/features/organizeImports.i18n.json @@ -6,5 +6,5 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "oraganizeImportsAction.title": "Organizar as importações" + "oraganizeImportsAction.title": "Organizar Imports" } \ No newline at end of file diff --git a/i18n/ptb/extensions/typescript-language-features/out/features/updatePathsOnRename.i18n.json b/i18n/ptb/extensions/typescript-language-features/out/features/updatePathsOnRename.i18n.json new file mode 100644 index 0000000000..2dcbb65756 --- /dev/null +++ b/i18n/ptb/extensions/typescript-language-features/out/features/updatePathsOnRename.i18n.json @@ -0,0 +1,11 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "reject.title": "Não", + "accept.title": "Sim" +} \ No newline at end of file diff --git a/i18n/ptb/extensions/typescript-language-features/package.i18n.json b/i18n/ptb/extensions/typescript-language-features/package.i18n.json index fbb3ef5c00..57021d26fd 100644 --- a/i18n/ptb/extensions/typescript-language-features/package.i18n.json +++ b/i18n/ptb/extensions/typescript-language-features/package.i18n.json @@ -8,8 +8,7 @@ ], "displayName": "Recursos da Linguagem TypeScript e JavaScript", "description": "Fornece suporte à linguagem rica pra JavaScript e TypeScript.", - "typescript.reloadProjects.title": "Recarregar Projeto", - "javascript.reloadProjects.title": "Recarregar Projeto", + "reloadProjects.title": "Recarregar Projeto", "configuration.typescript": "TypeScript", "typescript.useCodeSnippetsOnMethodSuggest.dec": "Funções completas com a assinatura do parâmetro.", "typescript.tsdk.desc": "Especifica o caminho da pasta que contém os arquivos tsserver e lib*.d.ts para usar.", @@ -37,8 +36,7 @@ "format.placeOpenBraceOnNewLineForFunctions": "Define-se uma chave de abertura é colocada em uma nova linha para funções ou não.", "format.placeOpenBraceOnNewLineForControlBlocks": "Define-se uma chave de abertura é colocada em uma nova linha para blocos de controle ou não.", "javascript.validate.enable": "Habilitar/Desabilitar validação JavaScript.", - "typescript.goToProjectConfig.title": "Ir para a Configuração do Projeto", - "javascript.goToProjectConfig.title": "Ir para a Configuração do Projeto", + "goToProjectConfig.title": "Ir para a Configuração do Projeto", "javascript.referencesCodeLens.enabled": "Habilitar/desabilitar referências CodeLens em arquivos JavaScript.", "typescript.referencesCodeLens.enabled": "Habilitar/desabilitar referências CodeLens em arquivos TypeScript. Requer TypeScript > = 2.0.6.", "typescript.implementationsCodeLens.enabled": "Habilitar/desabilitar implementações CodeLens. Requer TypeScript > = 2.0.6.", @@ -47,7 +45,6 @@ "typescript.selectTypeScriptVersion.title": "Selecionar a versão do JavaScript", "typescript.reportStyleChecksAsWarnings": "Reportar verificações de estilo como avisos", "jsDocCompletion.enabled": "Habilitar/Desabilitar comentários JSDoc automáticos.", - "javascript.implicitProjectConfig.checkJs": "Habilitar/desabilitar verificação semântica de arquivos JavaScript. Os arquivos existentes jsconfig.json ou tsconfig.json substituem essa configuração. Requer TypeScript > = 2.3.1.", "typescript.npm": "Especifica o caminho para o executável do NPM usado para Aquisição de Tipo Automático. Requer TypeScript > = 2.3.4.", "typescript.check.npmIsInstalled": "Verificar se o NPM está instalado para aquisição automática de tipo.", "javascript.nameSuggestions": "Habilitar/desabilitar incluindo nomes exclusivos do arquivo nas listas de sugestão de JavaScript.", @@ -55,11 +52,7 @@ "typescript.problemMatchers.tsc.label": "Problemas TypeScript", "typescript.problemMatchers.tscWatch.label": "Problemas TypeScript (modo observação)", "typescript.quickSuggestionsForPaths": "Ativar/desativar sugestões rápidas quando estiver digitando um caminho de importação.", - "typescript.locale": "Define a localidade usada para relatar erros TypeScript. Requer TypeScript > = 2.6.0. Padrão 'null' usa a localidade do VS Code para erros TypeScript.", - "javascript.implicitProjectConfig.experimentalDecorators": "Ativar/desativar 'experimentalDecorators' para arquivos JavaScript que não fazem parte de um projeto. Os arquivos existentes de jsconfig.json ou tsconfig.json substituem essa configuração. Requer TypeScript >= 2.3.1.", - "typescript.autoImportSuggestions.enabled": "Ativar/desativar sugestões de importação automática. Requer TypeScript >= 2.6.1", "typescript.experimental.syntaxFolding": "Habilita/Desabilita a sintaxe dos marcadores de pastas ativas.", "taskDefinition.tsconfig.description": "O arquivo tsconfig que define a compilação do TS.", - "javascript.suggestionActions.enabled": "Ativar/desativar o diagnóstico de sugestões para arquivos JavaScript no editor. Requer TypeScript > = 2.8", - "typescript.suggestionActions.enabled": "Ativar/desativar o diagnóstico de sugestões para arquivos TypeScript no editor. Requer TypeScript > = 2.8." + "javascript.suggestionActions.enabled": "Ativar/desativar o diagnóstico de sugestões para arquivos JavaScript no editor. Requer TypeScript > = 2.8" } \ No newline at end of file diff --git a/i18n/ptb/src/vs/base/node/processes.i18n.json b/i18n/ptb/src/vs/base/node/processes.i18n.json index 8fe92abaf2..c7429230ef 100644 --- a/i18n/ptb/src/vs/base/node/processes.i18n.json +++ b/i18n/ptb/src/vs/base/node/processes.i18n.json @@ -5,6 +5,5 @@ "Licensed under the Source EULA. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." - ], - "TaskRunner.UNC": "Não é possível executar um comando shell em uma unidade UNC." + ] } \ No newline at end of file diff --git a/i18n/ptb/src/vs/base/node/zip.i18n.json b/i18n/ptb/src/vs/base/node/zip.i18n.json index 583cfd913f..7ff9b354d1 100644 --- a/i18n/ptb/src/vs/base/node/zip.i18n.json +++ b/i18n/ptb/src/vs/base/node/zip.i18n.json @@ -6,6 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "incompleteExtract": "Incompleto. Extraído {0} de {1} entradas", + "incompleteExtract": "Incompleto. Encontradas {0} de {1} entradas", "notFound": "{0} não encontrado dentro do zip." } \ No newline at end of file diff --git a/i18n/ptb/src/vs/code/electron-browser/issue/issueReporterPage.i18n.json b/i18n/ptb/src/vs/code/electron-browser/issue/issueReporterPage.i18n.json index c780dda977..387a8a30bd 100644 --- a/i18n/ptb/src/vs/code/electron-browser/issue/issueReporterPage.i18n.json +++ b/i18n/ptb/src/vs/code/electron-browser/issue/issueReporterPage.i18n.json @@ -17,13 +17,5 @@ "issueTitleLabel": "Título", "issueTitleRequired": "Por favor, digite um título.", "titleLengthValidation": "O título é muito longo.", - "systemInfo": "Minhas Informações do Sistema", - "sendData": "Enviar meus dados", - "processes": "Processos Atualmente em Execução", - "workspaceStats": "Minhas Estatísticas do Espaço de Trabalho", - "extensions": "Minhas extensões", - "searchedExtensions": "Extensões Pesquisadas", - "settingsSearchDetails": "Detalhes da Pesquisa de Configurações", - "details": "Por favor informe detalhes.", - "loadingData": "Carregando dados..." + "details": "Por favor informe detalhes." } \ No newline at end of file diff --git a/i18n/ptb/src/vs/code/electron-browser/processExplorer/processExplorerMain.i18n.json b/i18n/ptb/src/vs/code/electron-browser/processExplorer/processExplorerMain.i18n.json index 8f468bf0ef..cb137ddea5 100644 --- a/i18n/ptb/src/vs/code/electron-browser/processExplorer/processExplorerMain.i18n.json +++ b/i18n/ptb/src/vs/code/electron-browser/processExplorer/processExplorerMain.i18n.json @@ -6,10 +6,8 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "cpu": "% DE CPU", - "memory": "Memória (MB)", - "pid": "PID", "name": "Nome", - "killProcess": "Matar processo", - "forceKillProcess": "Matar processo a força" + "forceKillProcess": "Matar processo a força", + "copy": "Copiar", + "copyAll": "Copiar todos" } \ No newline at end of file diff --git a/i18n/ptb/src/vs/code/electron-main/menus.i18n.json b/i18n/ptb/src/vs/code/electron-main/menus.i18n.json index 84ea5b779e..d3639096ef 100644 --- a/i18n/ptb/src/vs/code/electron-main/menus.i18n.json +++ b/i18n/ptb/src/vs/code/electron-main/menus.i18n.json @@ -88,7 +88,6 @@ "miToggleDebugConsole": "Con&&sole de Depuração", "miToggleIntegratedTerminal": "Terminal &&Integrado", "miMarker": "&&Problemas", - "miAdditionalViews": "&&Visualizações Adicionais", "miCommandPalette": "&&Paleta de comando", "miOpenView": "&&Abrir Visualização...", "miToggleFullScreen": "Alternar &&Tela Inteira", @@ -144,7 +143,6 @@ "miContinue": "&&Continuar", "miToggleBreakpoint": "Alternar &&Ponto de Parada", "miConditionalBreakpoint": "Ponto de Parada &&Condicional...", - "miColumnBreakpoint": "Ponto de Parada de C&&oluna", "miFunctionBreakpoint": "Ponto de Parada de &&Função...", "miNewBreakpoint": "&&Novo Ponto de Parada", "miEnableAllBreakpoints": "Habilitar Todos os Pontos de Parada", diff --git a/i18n/ptb/src/vs/editor/browser/widget/codeEditorWidget.i18n.json b/i18n/ptb/src/vs/editor/browser/widget/codeEditorWidget.i18n.json new file mode 100644 index 0000000000..ddb215a585 --- /dev/null +++ b/i18n/ptb/src/vs/editor/browser/widget/codeEditorWidget.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "cursors.maximum": "O número de cursores foi limitado a {0}." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/browser/widget/diffReview.i18n.json b/i18n/ptb/src/vs/editor/browser/widget/diffReview.i18n.json index d8178db811..668d87c916 100644 --- a/i18n/ptb/src/vs/editor/browser/widget/diffReview.i18n.json +++ b/i18n/ptb/src/vs/editor/browser/widget/diffReview.i18n.json @@ -7,8 +7,7 @@ "Do not edit this file. It is machine generated." ], "label.close": "Fechar", - "no_lines": "sem linhas", - "one_line": "1 linha", + "more_lines": "{0} linhas", "blankLine": "branco", "equalLine": "original {0}, modificados {1}: {2}", "insertLine": "+ modificado {0}: {1}", diff --git a/i18n/ptb/src/vs/editor/common/config/commonEditorConfig.i18n.json b/i18n/ptb/src/vs/editor/common/config/commonEditorConfig.i18n.json index 1f4dffee76..6c41dd22a5 100644 --- a/i18n/ptb/src/vs/editor/common/config/commonEditorConfig.i18n.json +++ b/i18n/ptb/src/vs/editor/common/config/commonEditorConfig.i18n.json @@ -2,7 +2,7 @@ "": [ "--------------------------------------------------------------------------------------------", "Copyright (c) Microsoft Corporation. All rights reserved.", - "Licensed under the Source EULA. See License.txt in the project root for license information.", + "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], @@ -27,6 +27,7 @@ "scrollBeyondLastLine": "Controla se o editor rolará além da última linha", "smoothScrolling": "Controla se o editor irá rolar usando uma animação", "minimap.enabled": "Controla se o mini mapa é exibido", + "minimap.side": "Controla o lado onde renderizar o minimapa.", "minimap.showSlider": "Controla se o controle deslizante minimap é oculto automaticamente.", "minimap.renderCharacters": "Renderizar os caracteres em uma linha (em oposição a blocos de caracteres)", "minimap.maxColumn": "Limitar o tamanho de um mini-mapa para renderizar no máximo um número determinado de colunas", @@ -39,7 +40,6 @@ "wordWrap.bounded": "As linhas serão quebradas no mínimo entre a largura de visualização e `editor.wordWrapColumn`.", "wordWrap": "Controla como as linhas devem ser quebradas automaticamente. Pode ser:\n- 'off' (quebra automática de linha desabilitada)\n- 'on' (quebra automática de linha na largura da janela)\n- 'wordWrapColumn' (quebra automática no numero de colunas definido em `editor.wordWrapColumn`) ou\n- 'bounded' (quebra automática em uma dimensão minima da janela e na largura configurada)", "wordWrapColumn": "Controla a coluna de quebra de linha do editor quando editor.wordWrap` é 'wordWrapColumn' ou 'bounded'.", - "wrappingIndent": "Controla o recuo de linhas quebradas. Pode ser \"none\", \"same\" ou \"indent\".", "mouseWheelScrollSensitivity": "Um multiplicador a ser usado em \"deltaX\" e \"deltaY\" dos eventos de rolagem do botão de rolagem do mouse", "multiCursorModifier.ctrlCmd": "Mapeia para 'Control' no Windows e Linux e para 'Command' no macOS.", "multiCursorModifier.alt": "Mapeia para 'Alt' em Windows e Linux e para 'Option' em macOS.", @@ -75,6 +75,7 @@ "occurrencesHighlight": "Controla se o editor deve realçar ocorrências de símbolos semânticos.", "overviewRulerLanes": "Controla o número de decorações que podem ser exibidas na mesma posição na régua de visão geral", "overviewRulerBorder": "Controla se deve desenhar uma borda ao redor da régua de visão geral.", + "cursorBlinking": "Controla o estilo de animação do cursor.", "mouseWheelZoom": "Alterar o zoom da fonte editor quando utilizada a roda do mouse e pressionando Ctrl", "cursorStyle": "Controla o estilo do cursor, os valores aceitos são 'block', 'block-outline', 'line', 'line-thin', 'underline' e 'underline-thin'", "cursorWidth": "Controla a largura do cursor quando editor.cursorStyle está definido como 'line'", @@ -84,6 +85,7 @@ "renderControlCharacters": "Controla se o editor deve renderizar caracteres de controle", "renderIndentGuides": "Controla se o editor deve renderizar guias de identação", "renderLineHighlight": "Controla como o editor deve renderizar a linha atual, as possibilidades são 'none', 'gutter', 'line' e 'all'.", + "codeLens": "Controla se o editor mostra CodeLens", "folding": "Controla se o editor tem codigo colapsível hablitado", "foldingStrategyAuto": "Se disponível, use uma estratégia de dobramento específica de idioma, caso contrário, recua para a estratégia baseada na indentação.", "foldingStrategyIndentation": "Sempre use a estratégia de dobragem baseada no indentação ", @@ -102,8 +104,12 @@ "links": "Controla se o editor deve detectar links e torná-los clicáveis", "colorDecorators": "Controla se o editor deve processar os decoradores de cor inline e o seletor de cores.", "codeActions": "Habilita a ação de código lightbulb", + "codeActionsOnSave.organizeImports": "Executar organização de imports ao salvar?", + "codeActionsOnSave": "Tipos de ação de código a serem executadas ao salvar.", + "codeActionsOnSaveTimeout": "Tempo limite para ações de código executadas ao salvar.", "selectionClipboard": "Controla se a área primária de transferência Linux deve ser suportada.", "sideBySide": "Controla se o editor de diff mostra as diff lado a lado ou inline.", "ignoreTrimWhitespace": "Controla se o editor de diff mostra alterações nos espaços iniciais ou finais como diferenças", + "largeFileOptimizations": "Tratamento especial para arquivos grandes para desabilitar determinados recursos que fazem uso intensivo de memória.", "renderIndicators": "Controla se o editor de diff mostra indicadores +/- para alterações adicionadas/removidas" } \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/common/view/editorColorRegistry.i18n.json b/i18n/ptb/src/vs/editor/common/view/editorColorRegistry.i18n.json index 4610e65c95..27569ce644 100644 --- a/i18n/ptb/src/vs/editor/common/view/editorColorRegistry.i18n.json +++ b/i18n/ptb/src/vs/editor/common/view/editorColorRegistry.i18n.json @@ -14,6 +14,7 @@ "editorCursorBackground": "A cor de fundo do cursor do editor. Permite customizar a cor de um caractere sobreposto pelo bloco do cursor.", "editorWhitespaces": "Cor dos caracteres em branco no editor", "editorIndentGuides": "Cor das guias de indentação do editor.", + "editorActiveIndentGuide": "Cor das guias de indentação do editor ativo.", "editorLineNumbers": "Cor dos números de linha do editor.", "editorActiveLineNumber": "Cor dos números de linhas do editor", "deprecatedEditorActiveLineNumber": "Identificação foi descontinuado. Use 'editorLineNumber.activeForeground' em vez disso.", @@ -31,6 +32,7 @@ "infoBorder": "Cor da borda das linhas de informação no editor.", "hintForeground": "Cor de primeiro plano de linhas onduladas de dica no editor.", "hintBorder": "Cor da borda de linhas onduladas de dica no editor.", + "unnecessaryForeground": "Cor de primeiro plano de código desnecessário no editor.", "overviewRulerRangeHighlight": "Visão geral da cor do marcador da régua para destaques do intervalo. A cor não deve ser opaca para não esconder decorações subjacentes.", "overviewRuleError": "Visão geral da cor do marcador da régua para erros.", "overviewRuleWarning": "Visão geral da cor do marcador da régua para avisos.", diff --git a/i18n/ptb/src/vs/editor/contrib/codeAction/codeActionCommands.i18n.json b/i18n/ptb/src/vs/editor/contrib/codeAction/codeActionCommands.i18n.json index 11ddcaff63..55678d3bef 100644 --- a/i18n/ptb/src/vs/editor/contrib/codeAction/codeActionCommands.i18n.json +++ b/i18n/ptb/src/vs/editor/contrib/codeAction/codeActionCommands.i18n.json @@ -7,5 +7,11 @@ "Do not edit this file. It is machine generated." ], "quickFixWithKb": "Mostrar correções ({0})", - "quickFix": "Mostrar correções" + "quickFix": "Mostrar correções", + "quickfix.trigger.label": "Correção Rápida...", + "refactor.label": "Refatorar...", + "source.label": "Ação de Origem...", + "editor.action.source.noneMessage": "Não há ações de origem disponíveis", + "organizeImports.label": "Organizar Imports", + "editor.action.organize.noneMessage": "Nenhuma ação de organização de imports disponível" } \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/contrib/find/findController.i18n.json b/i18n/ptb/src/vs/editor/contrib/find/findController.i18n.json index a1b0119333..043a385f3b 100644 --- a/i18n/ptb/src/vs/editor/contrib/find/findController.i18n.json +++ b/i18n/ptb/src/vs/editor/contrib/find/findController.i18n.json @@ -7,6 +7,7 @@ "Do not edit this file. It is machine generated." ], "startFindAction": "Localizar", + "startFindWithSelectionAction": "Procurar Com a Seleção", "findNextMatchAction": "Localizar Próximo", "findPreviousMatchAction": "Localizar anterior", "nextSelectionMatchFindAction": "Localizar Próxima Seleção", diff --git a/i18n/ptb/src/vs/editor/contrib/fontZoom/fontZoom.i18n.json b/i18n/ptb/src/vs/editor/contrib/fontZoom/fontZoom.i18n.json new file mode 100644 index 0000000000..ec9ba531e4 --- /dev/null +++ b/i18n/ptb/src/vs/editor/contrib/fontZoom/fontZoom.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "EditorFontZoomOut.label": "Editor de fonte ' menos Zoom '" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/contrib/goToDefinition/goToDefinitionCommands.i18n.json b/i18n/ptb/src/vs/editor/contrib/goToDefinition/goToDefinitionCommands.i18n.json new file mode 100644 index 0000000000..de30b404b3 --- /dev/null +++ b/i18n/ptb/src/vs/editor/contrib/goToDefinition/goToDefinitionCommands.i18n.json @@ -0,0 +1,25 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "noResultWord": "Não foi encontrada definição para '{0}'", + "generic.noResults": "Nenhuma definição encontrada", + "meta.title": "- {0} definições", + "actions.goToDecl.label": "Ir para Definição", + "actions.goToDeclToSide.label": "Abrir definição ao lado", + "actions.previewDecl.label": "Inspecionar definição", + "goToImplementation.noResultWord": "Nenhuma implementação encontrada para '{0}'", + "goToImplementation.generic.noResults": "Nenhuma implementação encontrada", + "meta.implementations.title": "– {0} implementações", + "actions.goToImplementation.label": "Ir para a implementação", + "actions.peekImplementation.label": "Inspecionar implementação", + "goToTypeDefinition.noResultWord": "Nenhuma definição encontrada para '{0}'", + "goToTypeDefinition.generic.noResults": "Nenhuma definição de tipo encontrada", + "meta.typeDefinitions.title": "– {0} definições de tipos", + "actions.goToTypeDefinition.label": "Ir para a definição de tipo", + "actions.peekTypeDefinition.label": "Inspecionar definição de tipo" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/contrib/goToDefinition/goToDefinitionMouse.i18n.json b/i18n/ptb/src/vs/editor/contrib/goToDefinition/goToDefinitionMouse.i18n.json new file mode 100644 index 0000000000..67e0c676b7 --- /dev/null +++ b/i18n/ptb/src/vs/editor/contrib/goToDefinition/goToDefinitionMouse.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "multipleResults": "Clique para mostrar {0} definições." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/contrib/gotoError/gotoError.i18n.json b/i18n/ptb/src/vs/editor/contrib/gotoError/gotoError.i18n.json index cfb10fe44e..5ad199ac68 100644 --- a/i18n/ptb/src/vs/editor/contrib/gotoError/gotoError.i18n.json +++ b/i18n/ptb/src/vs/editor/contrib/gotoError/gotoError.i18n.json @@ -7,5 +7,6 @@ "Do not edit this file. It is machine generated." ], "markerAction.next.label": "Ir para o Próximo Problema (Erro, Aviso, Informação)", - "markerAction.previous.label": "Ir para o Problema Anterior (Erro, Aviso, Informação)" + "markerAction.previous.label": "Ir para o Problema Anterior (Erro, Aviso, Informação)", + "markerAction.nextInFiles.label": "Ir para Próximo Problema nos Aquivos (Erro, Aviso, Info)" } \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/contrib/links/links.i18n.json b/i18n/ptb/src/vs/editor/contrib/links/links.i18n.json index 9a311b8a86..33422917f7 100644 --- a/i18n/ptb/src/vs/editor/contrib/links/links.i18n.json +++ b/i18n/ptb/src/vs/editor/contrib/links/links.i18n.json @@ -10,7 +10,9 @@ "links.navigate": "Ctrl + clique para seguir o link", "links.command.mac": "Cmd + clique para executar o comando", "links.command": "Ctrl + clique para executar o comando", + "links.navigate.al.mac": "Option + clique para seguir o link", "links.navigate.al": "Alt + clique para seguir o link", + "links.command.al.mac": "Option + clique para executar o comando", "links.command.al": "Alt + clique para executar o comando", "invalid.url": "Falha ao abrir este link porque ele não está bem formatado: {0}", "missing.url": "Falha ao abrir este link porque seu destino está faltando.", diff --git a/i18n/ptb/src/vs/editor/contrib/message/messageController.i18n.json b/i18n/ptb/src/vs/editor/contrib/message/messageController.i18n.json index 35229bd669..4e67dd40a4 100644 --- a/i18n/ptb/src/vs/editor/contrib/message/messageController.i18n.json +++ b/i18n/ptb/src/vs/editor/contrib/message/messageController.i18n.json @@ -5,5 +5,6 @@ "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." - ] + ], + "editor.readonly": "Não é possível editar no editor somente leitura" } \ No newline at end of file diff --git a/i18n/ptb/src/vs/platform/environment/node/argv.i18n.json b/i18n/ptb/src/vs/platform/environment/node/argv.i18n.json index fa678991d3..3be3a602dd 100644 --- a/i18n/ptb/src/vs/platform/environment/node/argv.i18n.json +++ b/i18n/ptb/src/vs/platform/environment/node/argv.i18n.json @@ -22,12 +22,15 @@ "showVersions": "Exibir versões de extensões instaladas, quando estiver usando --list-extension", "installExtension": "Instala uma extensão.", "uninstallExtension": "Desinstala uma extensão.", + "experimentalApis": "Habilita recursos propostos a API para uma extensão.", "verbose": "Imprimir a saída detalhada (Implica -- esperar).", "log": "Nível de log a ser utilizado. O padrão é 'info'. Os valores permitidos são 'critical', 'error', 'warn', 'info', 'debug', 'trace', 'off'.", "status": "Utilização do processo de impressão e informações de diagnóstico.", "performance": "Comece com o 'Desenvolvedor: Desempenho de inicialização' comando habilitado.", "prof-startup": "Rodar o CPU profiler durante a inicialização", "disableExtensions": "Desabilita todas as extensões instaladas.", + "inspect-extensions": "Permite a depuração e profiling de extensões. Verifique as ferramentas de desenvolvedor para obter o URI da conexão.", + "inspect-brk-extensions": "Permite a depuração e profiling de extensões com o host de extensão sendo pausado após o início. Verifique as ferramentas de desenvolvedor para obter o URI da conexão.", "disableGPU": "Desabilita aceleração de hardware via GPU.", "uploadLogs": "Envia os registros de atividade da sessão atual para um destino seguro.", "maxMemory": "Tamanho máximo de memória para uma janela (em Mbytes).", diff --git a/i18n/ptb/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json b/i18n/ptb/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json index 6bd9ed493b..69dfaa48d2 100644 --- a/i18n/ptb/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json +++ b/i18n/ptb/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json @@ -7,6 +7,7 @@ "Do not edit this file. It is machine generated." ], "invalidManifest": "Extensão inválida: pacote.json nao é um arquivo JSON válido", + "incompatible": "Não é possível instalar a Extensão '{0}' que não é compatível com o Code '{1}'.", "restartCode": "Por favor reinicie Code antes de reinstalar {0}.", "installingOutdatedExtension": "Uma nova versão desta extensão já está instalada. Você deseja sobrescrever esta instalação com a versão mais antiga?", "override": "Sobrescrever", @@ -20,11 +21,10 @@ "notFoundCompatibleDependency": "Não foi possível instalar porque a extensão dependente '{0}' compatível com a versão atual '{1}' do VS Code não foi encontrada.", "quitCode": "Não foi possível instalar a extensão. Por favor, saia e reinicie o VS Code antes de reinstalar.", "exitCode": "Não foi possível instalar a extensão. Por favor, saia e reinicie o VS Code antes de reinstalar.", + "renameError": "Erro desconhecido ao renomear {0} para {1}", "uninstallDependeciesConfirmation": "Gostaria de desinstalar '{0}' somente, ou suas dependências também?", "uninstallOnly": "Somente Extensão", "uninstallAll": "Desinstalar Tudo", - "uninstallConfirmation": "Tem certeza que deseja desinstalar '{0}'?", - "ok": "OK", "singleDependentError": "Não foi possível desinstalar a extensão '{0}'. A extensão '{1}' depende dela.", "twoDependentsError": "Não foi possível desinstalar a extensão '{0}'. As extensões '{1}' e '{2}' dependem dela.", "multipleDependentsError": "Não foi possível desinstalar a extensão '{0}'. As extensões '{1}' e '{2}' e outras dependem dela.", diff --git a/i18n/ptb/src/vs/platform/extensions/node/extensionValidator.i18n.json b/i18n/ptb/src/vs/platform/extensions/node/extensionValidator.i18n.json index 94e508a0cc..333c38ab26 100644 --- a/i18n/ptb/src/vs/platform/extensions/node/extensionValidator.i18n.json +++ b/i18n/ptb/src/vs/platform/extensions/node/extensionValidator.i18n.json @@ -6,6 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "versionSyntax": "Não foi possível analisar o valor {0} de `engines.vscode`. Por favor, utilize por exemplo: ^1.22.0, ^1.22.x, etc.", "versionSpecificity1": "Versão especificada em 'engines.vscode' ({0}) não é específica o suficiente. Para versões do vscode anteriores a 1.0.0, por favor defina no mínimo a versão principal e secundária desejada. Por exemplo, ^ 0.10.0, 0.10.x, 0.11.0, etc.", "versionSpecificity2": "Versão especificada em 'engines.vscode' ({0}) não é específica o suficiente. Para as versões do vscode posteriores a 1.0.0, por favor defina no mínimo a versão principal do desejado. Por exemplo, ^ 1.10.0, 1.10.x 1. XX, 2.x.x, etc.", "versionMismatch": "Extensão não é compatível com Code {0}. A extensão requer: {1}." diff --git a/i18n/ptb/src/vs/platform/issue/electron-main/issueService.i18n.json b/i18n/ptb/src/vs/platform/issue/electron-main/issueService.i18n.json index 820a50f4f0..a25d4e5253 100644 --- a/i18n/ptb/src/vs/platform/issue/electron-main/issueService.i18n.json +++ b/i18n/ptb/src/vs/platform/issue/electron-main/issueService.i18n.json @@ -6,5 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "issueReporter": "Notificador de Problemas" + "issueReporter": "Notificador de Problemas", + "processExplorer": "Explorador de Processos" } \ No newline at end of file diff --git a/i18n/ptb/src/vs/platform/node/minimalTranslations.i18n.json b/i18n/ptb/src/vs/platform/node/minimalTranslations.i18n.json new file mode 100644 index 0000000000..65ddd57ca5 --- /dev/null +++ b/i18n/ptb/src/vs/platform/node/minimalTranslations.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "searchMarketplace": "Pesquisar na Loja" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/platform/theme/common/colorRegistry.i18n.json b/i18n/ptb/src/vs/platform/theme/common/colorRegistry.i18n.json index faab052a8a..d5c7c3a884 100644 --- a/i18n/ptb/src/vs/platform/theme/common/colorRegistry.i18n.json +++ b/i18n/ptb/src/vs/platform/theme/common/colorRegistry.i18n.json @@ -16,7 +16,6 @@ "selectionBackground": "A cor de fundo das seleções de texto na área de trabalho (por exemplo, para campos de entrada ou áreas de texto). Note que isto não se aplica a seleções dentro do editor.", "textSeparatorForeground": "Cor para separadores de texto.", "textLinkForeground": "Cor de primeiro plano para links no texto.", - "textLinkActiveForeground": "Cor de primeiro plano para links ativos no texto.", "textPreformatForeground": "Cor de primeiro plano para segmentos de texto pré-formatados.", "textBlockQuoteBackground": "Cor de fundo para blocos de citações no texto.", "textBlockQuoteBorder": "Cor da borda para blocos de citações no texto.", @@ -57,7 +56,6 @@ "scrollbarShadow": "Sombra da barra de rolagem para indicar que a visualização está sendo rolada.", "scrollbarSliderBackground": "Cor de fundo da barra de rolagem.", "scrollbarSliderHoverBackground": "Cor de fundo da barra de rolagem quando o cursor do mouse estiver sobre ela.", - "scrollbarSliderActiveBackground": "Cor de fundo da barra de rolagem quando ativa.", "progressBarBackground": "Cor de fundo da barra de progresso que pode ser mostrada em operações de execução demorada.", "editorBackground": "Cor de plano de fundo do editor.", "editorForeground": "Cor de primeiro plano padrão do editor.", @@ -72,6 +70,7 @@ "findMatchHighlight": "Cor dos outros termos que correspondem ao da pesquisa. A cor não deve ser opaca para não esconder as decorações subjacentes.", "editorFindMatchBorder": "Cor da borda da correspondência de pesquisa atual.", "findMatchHighlightBorder": "Cor da borda dos outros resultados de pesquisa.", + "findRangeHighlightBorder": "Cor da borda da faixa limitando a pesquisa. A cor não deve ser opaca para não esconder decorações subjacentes.", "hoverHighlight": "Destaque abaixo da palavra para qual um flutuador é mostrado. A cor não deve ser opaca para não esconder decorações subjacentes.", "hoverBackground": "Cor de fundo para o item flutuante do editor", "hoverBorder": "Cor da borda para o item flutuante do editor.", diff --git a/i18n/ptb/src/vs/workbench/browser/actions/workspaceActions.i18n.json b/i18n/ptb/src/vs/workbench/browser/actions/workspaceActions.i18n.json index 9bc3c39e33..ca43668457 100644 --- a/i18n/ptb/src/vs/workbench/browser/actions/workspaceActions.i18n.json +++ b/i18n/ptb/src/vs/workbench/browser/actions/workspaceActions.i18n.json @@ -14,6 +14,5 @@ "save": "&&Salvar", "saveWorkspace": "Salvar o espaço de trabalho", "openWorkspaceAction": "Abrir o Espaço de Trabalho...", - "openWorkspaceConfigFile": "Abrir o Arquivo de Configuração do Espaço de Trabalho", - "openFolderAsWorkspaceInNewWindow": "Abrir a pasta como espaço de trabalho em nova janela" + "openWorkspaceConfigFile": "Abrir o Arquivo de Configuração do Espaço de Trabalho" } \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/browser/parts/panel/panelPart.i18n.json b/i18n/ptb/src/vs/workbench/browser/parts/panel/panelPart.i18n.json index 5d007e06d6..35229bd669 100644 --- a/i18n/ptb/src/vs/workbench/browser/parts/panel/panelPart.i18n.json +++ b/i18n/ptb/src/vs/workbench/browser/parts/panel/panelPart.i18n.json @@ -1,8 +1,9 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the Source EULA. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ -// Do not edit this file. It is machine generated. { - "panelSwitcherBarAriaLabel": "Chave do Painel Ativo" + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ] } \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/browser/parts/quickinput/quickInput.i18n.json b/i18n/ptb/src/vs/workbench/browser/parts/quickinput/quickInput.i18n.json index 9d17b283ca..8029abcb9f 100644 --- a/i18n/ptb/src/vs/workbench/browser/parts/quickinput/quickInput.i18n.json +++ b/i18n/ptb/src/vs/workbench/browser/parts/quickinput/quickInput.i18n.json @@ -8,5 +8,6 @@ ], "inputModeEntryDescription": "{0} (Pressione 'Enter' para confirmar ou 'Esc' para cancelar)", "inputModeEntry": "Pressione 'Enter' para confirmar o texto digitado ou 'Esc' para cancelar", + "quickInput.countSelected": "{0} Selecionado", "ok": "OK" } \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/browser/parts/quickopen/quickOpenController.i18n.json b/i18n/ptb/src/vs/workbench/browser/parts/quickopen/quickOpenController.i18n.json index 2cef3e0579..09c68361bc 100644 --- a/i18n/ptb/src/vs/workbench/browser/parts/quickopen/quickOpenController.i18n.json +++ b/i18n/ptb/src/vs/workbench/browser/parts/quickopen/quickOpenController.i18n.json @@ -6,8 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "inputModeEntryDescription": "{0} (Pressione 'Enter' para confirmar ou 'Esc' para cancelar)", - "inputModeEntry": "Pressione 'Enter' para confirmar o texto digitado ou 'Esc' para cancelar", "emptyPicks": "Não há entradas a serem escolhidas", "quickOpenInput": "Digite '?' para obter ajuda sobre as ações que você pode realizar a partir daqui", "historyMatches": "aberto recentemente", diff --git a/i18n/ptb/src/vs/workbench/common/theme.i18n.json b/i18n/ptb/src/vs/workbench/common/theme.i18n.json index 085b025ca1..f4257a6338 100644 --- a/i18n/ptb/src/vs/workbench/common/theme.i18n.json +++ b/i18n/ptb/src/vs/workbench/common/theme.i18n.json @@ -11,8 +11,6 @@ "tabHoverBackground": "Cor de fundo da guia ao passar o mouse. As guias são os contêineres para editores na área do editor. Várias guias podem ser abertas em um grupo de editor. Podem existir vários grupos de editor.", "tabUnfocusedHoverBackground": "Cor de fundo da guia em um grupo fora de foco ao passar o mouse. As guias são os contêineres para editores na área do editor. Várias guias podem ser abertas em um grupo de editor. Podem existir vários grupos de editor.", "tabBorder": "Borda para separar uma guia das outras. As guias são os recipientes para editores na área do editor. Várias guias podem ser abertas em um grupo de editores. Podem haver vários grupos de editor.", - "tabActiveBorder": "Borda para destacar guias ativas. As guias são os recipientes para editores na área do editor. Várias guias podem ser abertas em um grupo de editores. Podem haver vários grupos de editores.", - "tabActiveUnfocusedBorder": "Borda para destacar guias ativas em um grupo fora de foco. As guias são os recipientes para editores na área do editor. Várias guias podem ser abertas em um grupo de editores. Podem haver vários grupos de editores.", "tabHoverBorder": "Borda para destacar guias ao passar o mouse. As guias são os contêineres para editores na área do editor. Várias guias podem ser abertas em um grupo de editor. Podem existir vários grupos de editor.", "tabUnfocusedHoverBorder": "Borda para destacar guias em um grupo fora de foco ao passar o mouse. As guias são os contêineres para editores na área do editor. Várias guias podem ser abertas em um grupo de editor. Podem existir vários grupos de editor.", "tabActiveForeground": "Cor de primeiro plano da guia ativa em um grupo ativo. As guias são os recipientes para editores na área do editor. Várias guias podem ser abertas em um grupo de editores. Podem haver vários grupos de editor.", diff --git a/i18n/ptb/src/vs/workbench/electron-browser/actions.i18n.json b/i18n/ptb/src/vs/workbench/electron-browser/actions.i18n.json index 6fc9a994b2..ee2b9919bf 100644 --- a/i18n/ptb/src/vs/workbench/electron-browser/actions.i18n.json +++ b/i18n/ptb/src/vs/workbench/electron-browser/actions.i18n.json @@ -32,6 +32,7 @@ "openRecent": "Abrir Recente...", "quickOpenRecent": "Abertura Rápida de Recente...", "reportIssueInEnglish": "Reportar Problema", + "openProcessExplorer": "Abrir Explorador de Processos", "reportPerformanceIssue": "Reportar Problema de Desempenho", "keybindingsReference": "Referência de Atalhos de Teclado", "openDocumentationUrl": "Documentação", diff --git a/i18n/ptb/src/vs/workbench/parts/codeEditor/electron-browser/largeFileOptimizations.i18n.json b/i18n/ptb/src/vs/workbench/parts/codeEditor/electron-browser/largeFileOptimizations.i18n.json new file mode 100644 index 0000000000..35229bd669 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/codeEditor/electron-browser/largeFileOptimizations.i18n.json @@ -0,0 +1,9 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ] +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/debug/browser/breakpointsView.i18n.json b/i18n/ptb/src/vs/workbench/parts/debug/browser/breakpointsView.i18n.json index 1b1684e0d8..4c94ccc38f 100644 --- a/i18n/ptb/src/vs/workbench/parts/debug/browser/breakpointsView.i18n.json +++ b/i18n/ptb/src/vs/workbench/parts/debug/browser/breakpointsView.i18n.json @@ -2,13 +2,11 @@ "": [ "--------------------------------------------------------------------------------------------", "Copyright (c) Microsoft Corporation. All rights reserved.", - "Licensed under the Source EULA. See License.txt in the project root for license information.", + "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "breakpoint": "Ponto de interrupção", "editBreakpoint": "Editar {0}...", - "removeBreakpoint": "Remover {0}", "functionBreakpointsNotSupported": "Pontos de parada de função não são suportados por este tipo de depuração", "functionBreakpointPlaceholder": "Função de parada", "functionBreakPointInputAriaLabel": "Digitar Ponto de Parada de Função", diff --git a/i18n/ptb/src/vs/workbench/parts/debug/browser/debugActions.i18n.json b/i18n/ptb/src/vs/workbench/parts/debug/browser/debugActions.i18n.json index 2db51d9839..11b6775747 100644 --- a/i18n/ptb/src/vs/workbench/parts/debug/browser/debugActions.i18n.json +++ b/i18n/ptb/src/vs/workbench/parts/debug/browser/debugActions.i18n.json @@ -41,7 +41,6 @@ "debugConsoleAction": "Console do Depurador", "unreadOutput": "Nova Saída no Console de Depuração", "debugFocusConsole": "Foco no Console de Depuração", - "focusProcess": "Foco no Processo", "stepBackDebug": "Passo para trás", "reverseContinue": "Reverter" } \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/debug/browser/debugCommands.i18n.json b/i18n/ptb/src/vs/workbench/parts/debug/browser/debugCommands.i18n.json index 0ecfb5f189..2f4b567f67 100644 --- a/i18n/ptb/src/vs/workbench/parts/debug/browser/debugCommands.i18n.json +++ b/i18n/ptb/src/vs/workbench/parts/debug/browser/debugCommands.i18n.json @@ -7,7 +7,5 @@ "Do not edit this file. It is machine generated." ], "noFolderDebugConfig": "Primeiro abra uma pasta para fazer uma configuração de depuração avançada.", - "columnBreakpoint": "Coluna de ponto de parada", - "debug": "Depurar", - "addColumnBreakpoint": "Adicionar Ponto de Interrupção de Coluna" + "debug": "Depurar" } \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/debug/common/debugSchemas.i18n.json b/i18n/ptb/src/vs/workbench/parts/debug/common/debugSchemas.i18n.json new file mode 100644 index 0000000000..cb32880c0c --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/debug/common/debugSchemas.i18n.json @@ -0,0 +1,37 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "vscode.extension.contributes.debuggers": "Contribui adaptadores de depuração.", + "vscode.extension.contributes.debuggers.type": "Identificador único para esse adaptador de depuração.", + "vscode.extension.contributes.debuggers.label": "Nome de exibição para esse adaptador de depuração.", + "vscode.extension.contributes.debuggers.program": "Caminho para o programa adaptador de depuração. O caminho pode ser absoluto ou relativo à pasta de extensão.", + "vscode.extension.contributes.debuggers.args": "Argumentos opcionais a serem informados para o adaptador.", + "vscode.extension.contributes.debuggers.runtime": "Runtime opcional no caso do atributo do programa não ser um executável, mas requerer um runtime.", + "vscode.extension.contributes.debuggers.runtimeArgs": "Argumentos opcionais do runtime.", + "vscode.extension.contributes.debuggers.variables": "Mapeamento de variáveis interativas (por exemplo ${action.pickProcess}) em 'launch.json' para um comando.", + "vscode.extension.contributes.debuggers.initialConfigurations": "Configurações para gerar o 'launch.json' inicial.", + "vscode.extension.contributes.debuggers.languages": "Lista de idiomas para os quais a extensão de depuração pode ser considerada o \"depurador padrão\".", + "vscode.extension.contributes.debuggers.adapterExecutableCommand": "Se especificado VS Code chamará este comando para determinar o caminho do executável do adaptador de depuração e os argumentos para passar.", + "vscode.extension.contributes.debuggers.configurationSnippets": "Trechos de código para adicionar novas configurações em 'launch.json'.", + "vscode.extension.contributes.debuggers.configurationAttributes": "Configurações de esquema JSON para validar 'launch.json'.", + "vscode.extension.contributes.debuggers.windows": "Configurações específicas do Windows.", + "vscode.extension.contributes.debuggers.windows.runtime": "Runtime usado para Windows.", + "vscode.extension.contributes.debuggers.osx": "Configurações específicas para macOS.", + "vscode.extension.contributes.debuggers.osx.runtime": "Runtime usado para o macOS.", + "vscode.extension.contributes.debuggers.linux": "Configurações específicas do Linux.", + "vscode.extension.contributes.debuggers.linux.runtime": "Runtime usado para o Linux.", + "vscode.extension.contributes.breakpoints": "Contribui aos pontos de interrupção.", + "vscode.extension.contributes.breakpoints.language": "Permitir pontos de parada para este idioma.", + "app.launch.json.title": "Executar", + "app.launch.json.version": "Versão deste formato de arquivo.", + "app.launch.json.configurations": "Lista de configurações. Adicionar novas configurações ou editar as existentes usando o IntelliSense.", + "app.launch.json.compounds": "Lista de compostos. Cada composto faz referência a várias configurações que vão ser executadas juntas.", + "app.launch.json.compound.name": "Nome do composto. Aparece no menu drop-down da configuração de execução.", + "useUniqueNames": "Por favor, use nomes únicos de configuração.", + "app.launch.json.compounds.configurations": "Nomes das configurações que serão iniciadas como parte deste composto." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/callStackView.i18n.json b/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/callStackView.i18n.json index c94e8f1d3f..7b47d0b071 100644 --- a/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/callStackView.i18n.json +++ b/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/callStackView.i18n.json @@ -9,7 +9,6 @@ "callstackSection": "Seção de Pilha de Chamada", "debugStopped": "Pausado em {0}", "callStackAriaLabel": "Depurar a Pilha de Chamadas", - "process": "Processar", "paused": "Em pausa", "running": "Em execução", "thread": "Thread", diff --git a/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/debug.contribution.i18n.json b/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/debug.contribution.i18n.json index 1a2d0c2dbf..5396071d23 100644 --- a/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/debug.contribution.i18n.json +++ b/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/debug.contribution.i18n.json @@ -21,7 +21,6 @@ "allowBreakpointsEverywhere": "Permite definir um ponto de interrupção em qualquer arquivo.", "openExplorerOnEnd": "Automaticamente abre a visualização do explorador no final de uma sessão de depuração", "inlineValues": "Mostrar valores de variáveis em linha no editor durante a depuração", - "hideActionBar": "Controlar se a barra de ação flutuante do depurador deve ser ocultada", "never": "Nunca mostrar debug na barra de status", "always": "Sempre mostrar depurar na barra de status", "onFirstSessionStart": "Mostrar depurar na barra de status somente após a depuração ser iniciada pela primeira vez", diff --git a/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.i18n.json b/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.i18n.json index 00085d53f2..91de7344e3 100644 --- a/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.i18n.json +++ b/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.i18n.json @@ -6,36 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "vscode.extension.contributes.debuggers": "Contribui adaptadores de depuração.", - "vscode.extension.contributes.debuggers.type": "Identificador único para esse adaptador de depuração.", - "vscode.extension.contributes.debuggers.label": "Nome de exibição para esse adaptador de depuração.", - "vscode.extension.contributes.debuggers.program": "Caminho para o programa adaptador de depuração. O caminho pode ser absoluto ou relativo à pasta de extensão.", - "vscode.extension.contributes.debuggers.args": "Argumentos opcionais a serem informados para o adaptador.", - "vscode.extension.contributes.debuggers.runtime": "Runtime opcional no caso do atributo do programa não ser um executável, mas requerer um runtime.", - "vscode.extension.contributes.debuggers.runtimeArgs": "Argumentos opcionais do runtime.", - "vscode.extension.contributes.debuggers.variables": "Mapeamento de variáveis interativas (por exemplo ${action.pickProcess}) em 'launch.json' para um comando.", - "vscode.extension.contributes.debuggers.initialConfigurations": "Configurações para gerar o 'launch.json' inicial.", - "vscode.extension.contributes.debuggers.languages": "Lista de idiomas para os quais a extensão de depuração pode ser considerada o \"depurador padrão\".", - "vscode.extension.contributes.debuggers.adapterExecutableCommand": "Se especificado VS Code chamará este comando para determinar o caminho do executável do adaptador de depuração e os argumentos para passar.", - "vscode.extension.contributes.debuggers.configurationSnippets": "Trechos de código para adicionar novas configurações em 'launch.json'.", - "vscode.extension.contributes.debuggers.configurationAttributes": "Configurações de esquema JSON para validar 'launch.json'.", - "vscode.extension.contributes.debuggers.windows": "Configurações específicas do Windows.", - "vscode.extension.contributes.debuggers.windows.runtime": "Runtime usado para Windows.", - "vscode.extension.contributes.debuggers.osx": "Configurações específicas para macOS.", - "vscode.extension.contributes.debuggers.osx.runtime": "Runtime usado para o macOS.", - "vscode.extension.contributes.debuggers.linux": "Configurações específicas do Linux.", - "vscode.extension.contributes.debuggers.linux.runtime": "Runtime usado para o Linux.", - "vscode.extension.contributes.breakpoints": "Contribui aos pontos de interrupção.", - "vscode.extension.contributes.breakpoints.language": "Permitir pontos de parada para este idioma.", - "app.launch.json.title": "Executar", - "app.launch.json.version": "Versão deste formato de arquivo.", - "app.launch.json.configurations": "Lista de configurações. Adicionar novas configurações ou editar as existentes usando o IntelliSense.", - "app.launch.json.compounds": "Lista de compostos. Cada composto faz referência a várias configurações que vão ser executadas juntas.", - "app.launch.json.compound.name": "Nome do composto. Aparece no menu drop-down da configuração de execução.", - "useUniqueNames": "Por favor, use nomes únicos de configuração.", - "app.launch.json.compound.folder": "Nome da pasta em que o composto se encontra.", - "app.launch.json.compounds.configurations": "Nomes das configurações que serão iniciadas como parte deste composto.", - "debugNoType": "Depurador 'tipo' não pode ser omitido e deve ser do tipo 'string'.", "selectDebug": "Selecione o ambiente", "DebugConfig.failed": "Não é possível criar o arquivo 'launch.json' dentro da pasta '.vscode' ({0}).", "workspace": "espaço de trabalho", diff --git a/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json b/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json index 1a3d1edf6a..c27b617052 100644 --- a/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json +++ b/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json @@ -2,31 +2,21 @@ "": [ "--------------------------------------------------------------------------------------------", "Copyright (c) Microsoft Corporation. All rights reserved.", - "Licensed under the Source EULA. See License.txt in the project root for license information.", + "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "breakpoint": "Ponto de interrupção", - "removeBreakpoint": "Remover {0}", "editBreakpoint": "Editar {0}...", "disableBreakpoint": "Desabilitar {0}", - "enableBreakpoint": "Habilitar {0}", "removeBreakpoints": "Remover pontos de interrupção", - "removeBreakpointOnColumn": "Remover ponto de interrupção na coluna {0}", "removeLineBreakpoint": "Remover ponto de interrupção de linha", "editBreakpoints": "Editar pontos de interrupção", - "editBreakpointOnColumn": "Editar o ponto de interrupção na coluna {0}", "editLineBrekapoint": "Editar o ponto de interrupção de linha", "enableDisableBreakpoints": "Habilitar/Desabilitar pontos de interrupção", - "disableColumnBreakpoint": "Desabilitar ponto de interrupção na coluna {0}", "disableBreakpointOnLine": "Desabilitar ponto de interrupção de linha", - "enableBreakpoints": "Habilitar o ponto de interrupção na coluna {0}", "enableBreakpointOnLine": "Habilitar o ponto de interrupção de linha", "addBreakpoint": "Adicionar ponto de interrupção", "addConditionalBreakpoint": "Adicionar Ponto de Parada Condicional...", - "message": "Mensagem", - "condition": "condição", - "removeLogPoint": "Remover {0}", "disableLogPoint": "Desabilitar {0}", "cancel": "Cancelar", "addConfiguration": "Adicionar Configuração..." diff --git a/i18n/ptb/src/vs/workbench/parts/debug/node/debugger.i18n.json b/i18n/ptb/src/vs/workbench/parts/debug/node/debugger.i18n.json index f91926ec3d..ddf29b9437 100644 --- a/i18n/ptb/src/vs/workbench/parts/debug/node/debugger.i18n.json +++ b/i18n/ptb/src/vs/workbench/parts/debug/node/debugger.i18n.json @@ -6,7 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "launch.config.comment1": "Use o IntelliSense para aprender sobre possíveis atributos.", "launch.config.comment2": "Passe o mouse para ver as descrições dos atributos existentes.", "launch.config.comment3": "Para obter mais informações, visite: {0}", "debugType": "Tipo de configuração.", diff --git a/i18n/ptb/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.i18n.json b/i18n/ptb/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.i18n.json index f6209cf359..e6df41a65a 100644 --- a/i18n/ptb/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.i18n.json +++ b/i18n/ptb/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.i18n.json @@ -29,6 +29,8 @@ "debuggers": "Depuradores ({0})", "debugger name": "Nome", "debugger type": "Tipo", + "view container id": "ID", + "view container location": "Onde", "views": "Visualizações ({0})", "view id": "ID", "view name": "Nome", diff --git a/i18n/ptb/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json b/i18n/ptb/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json index 7e61a7b286..240d82484d 100644 --- a/i18n/ptb/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json +++ b/i18n/ptb/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json @@ -8,7 +8,6 @@ ], "neverShowAgain": "Não mostrar novamente", "searchMarketplace": "Pesquisar na Loja", - "showLanguagePackExtensions": "A loja possui extensões que podem ajudar na localização do VS Code para o local '{0}'", "dynamicWorkspaceRecommendation": "Esta extensão pode interessá-lo porque é popular entre os usuários do repositório {0}.", "exeBasedRecommendation": "Esta extensão é recomendada porque você tem {0} instalado.", "fileBasedRecommendation": "Esta extensão é recomendada baseada nos arquivos que você abriu recentemente.", diff --git a/i18n/ptb/src/vs/workbench/parts/extensions/node/extensionsWorkbenchService.i18n.json b/i18n/ptb/src/vs/workbench/parts/extensions/node/extensionsWorkbenchService.i18n.json index 74b2df609b..17556cc2af 100644 --- a/i18n/ptb/src/vs/workbench/parts/extensions/node/extensionsWorkbenchService.i18n.json +++ b/i18n/ptb/src/vs/workbench/parts/extensions/node/extensionsWorkbenchService.i18n.json @@ -12,9 +12,8 @@ "uninstallingExtension": "Desinstalando extensão...", "enable": "Sim", "doNotEnable": "Não", - "disableDependeciesConfirmation": "Gostaria de desabilitar somente '{0}', ou as suas dependências também?", - "disableOnly": "Apenas", - "disableAll": "Todos", + "yes": "Sim", + "no": "Não", "cancel": "Cancelar", "singleDependentError": "Não é possível desabilitar a extensão '{0}'. A extensão '{1}' depende dela.", "twoDependentsError": "Não é possível desabilitar a extensão '{0}'. As extensões '{1}' e '{2}' dependem dela.", diff --git a/i18n/ptb/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.i18n.json b/i18n/ptb/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.i18n.json index 804ed1a7c8..b30f63cfba 100644 --- a/i18n/ptb/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.i18n.json +++ b/i18n/ptb/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.i18n.json @@ -11,6 +11,7 @@ "no": "Não", "neverAgain": "Não mostrar novamente", "install": "Instalar", + "more information": "Mais Informações...", "JsonSchema.locale": "O idioma da interface do usuário a ser usada.", "vscode.extension.contributes.localizations": "Contribui localizações ao editor", "vscode.extension.contributes.localizations.languageId": "Id do idioma em que as strings de exibição estão traduzidas.", diff --git a/i18n/ptb/src/vs/workbench/parts/localizations/electron-browser/localizationsActions.i18n.json b/i18n/ptb/src/vs/workbench/parts/localizations/electron-browser/localizationsActions.i18n.json index 3490c90bd2..cb900a924b 100644 --- a/i18n/ptb/src/vs/workbench/parts/localizations/electron-browser/localizationsActions.i18n.json +++ b/i18n/ptb/src/vs/workbench/parts/localizations/electron-browser/localizationsActions.i18n.json @@ -6,7 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "configureLocale": "Configurar Idioma", "displayLanguage": "Define o idioma de exibição do VSCode.", "doc": "Veja {0} para obter uma lista dos idiomas suportados.", "restart": "Modificar o valor requer reinicialização do VSCode.", diff --git a/i18n/ptb/src/vs/workbench/parts/outline/electron-browser/outline.contribution.i18n.json b/i18n/ptb/src/vs/workbench/parts/outline/electron-browser/outline.contribution.i18n.json new file mode 100644 index 0000000000..fb4fcc4525 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/outline/electron-browser/outline.contribution.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "category.focus": "Arquivo" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/outline/electron-browser/outlinePanel.i18n.json b/i18n/ptb/src/vs/workbench/parts/outline/electron-browser/outlinePanel.i18n.json new file mode 100644 index 0000000000..d2d4353b7b --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/outline/electron-browser/outlinePanel.i18n.json @@ -0,0 +1,11 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "collapse": "Recolher tudo", + "sortByName": "Ordenar por: Nome" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/outline/electron-browser/outlineTree.i18n.json b/i18n/ptb/src/vs/workbench/parts/outline/electron-browser/outlineTree.i18n.json new file mode 100644 index 0000000000..35229bd669 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/outline/electron-browser/outlineTree.i18n.json @@ -0,0 +1,9 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ] +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/output/browser/outputPanel.i18n.json b/i18n/ptb/src/vs/workbench/parts/output/browser/outputPanel.i18n.json index 979340da5c..ab14473eb6 100644 --- a/i18n/ptb/src/vs/workbench/parts/output/browser/outputPanel.i18n.json +++ b/i18n/ptb/src/vs/workbench/parts/output/browser/outputPanel.i18n.json @@ -6,6 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "output": "Saída", "outputPanelWithInputAriaLabel": "{0}, Painel de saída", "outputPanelAriaLabel": "Painel de saída" } \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/preferences/browser/settingsEditor2.i18n.json b/i18n/ptb/src/vs/workbench/parts/preferences/browser/settingsEditor2.i18n.json new file mode 100644 index 0000000000..313ebae856 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/preferences/browser/settingsEditor2.i18n.json @@ -0,0 +1,14 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "previewWarning": "Visualizar", + "SearchSettings.AriaLabel": "Configurações de Pesquisa", + "SearchSettings.Placeholder": "Configurações de Pesquisa", + "advancedCustomizationLabel": "Para personalizações avançadas abrir e editar", + "treeAriaLabel": "Configurações" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/preferences/browser/settingsTree.i18n.json b/i18n/ptb/src/vs/workbench/parts/preferences/browser/settingsTree.i18n.json new file mode 100644 index 0000000000..e71de4f526 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/preferences/browser/settingsTree.i18n.json @@ -0,0 +1,12 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "workspace": "Espaço de trabalho", + "user": "Usuário", + "configured": "Modificado" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json b/i18n/ptb/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json index 56d88e0a64..08831e79b9 100644 --- a/i18n/ptb/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json +++ b/i18n/ptb/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json @@ -10,6 +10,7 @@ "copyMatchLabel": "Copiar", "copyPathLabel": "Copiar Caminho", "copyAllLabel": "Copiar todos", + "clearSearchHistoryLabel": "Limpar Histórico de Pesquisa", "findInFolder": "Procurar na pasta...", "findInWorkspace": "Procurar no Espaço de Trabalho...", "showTriggerActions": "Ir para Símbolo no Espaço de Trabalho...", diff --git a/i18n/ptb/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.i18n.json b/i18n/ptb/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.i18n.json index b5347d0795..178b92b9d7 100644 --- a/i18n/ptb/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.i18n.json +++ b/i18n/ptb/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.i18n.json @@ -26,7 +26,6 @@ "terminal.integrated.cursorStyle": "Controla o estilo do cursor do terminal.", "terminal.integrated.scrollback": "Controla a quantidade máxima de linhas que o terminal mantém em seu buffer.", "terminal.integrated.setLocaleVariables": "Controla se as variáveis locais são definidas na inicialização do terminal, este padrão é verdadeiro no OS X e falso em outras plataformas.", - "terminal.integrated.rightClickBehavior": "Controla como o terminal reage ao clique com o botão da direita. Possibilidades são 'padrão', 'copiareColar' e 'selecionarPalavra'. 'Padrão' irá mostrar o menu de contexto, 'CopiareColar' irá copiar quando houver algo selecionado, caso contrário, irá colar, 'SelecionarPalavra' irá selecionar a palavra debaixo do cursor e mostrar o menu de contexto.", "terminal.integrated.cwd": "Um caminho de início explícito onde o terminal será lançado, isso é usado como o diretório de trabalho atual (cwd) para o processo shell. Isto pode ser particularmente útil em configurações de espaço de trabalho se o diretório raiz não é um cwd conveniente.", "terminal.integrated.confirmOnExit": "Confirmar na saída se ainda houverem sessões de terminal ativas.", "terminal.integrated.enableBell": "Se o sino do terminal está habilitado ou não.", diff --git a/i18n/ptb/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.i18n.json b/i18n/ptb/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.i18n.json index d10e1eeb58..7ecad02fe7 100644 --- a/i18n/ptb/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.i18n.json +++ b/i18n/ptb/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.i18n.json @@ -8,6 +8,9 @@ ], "terminal.integrated.a11yBlankLine": "Linha em branco", "terminal.integrated.a11yPromptLabel": "Entrada do terminal", + "yes": "Sim", + "no": "Não", + "dontShowAgain": "Não mostrar novamente", "terminal.integrated.copySelection.noSelection": "O terminal não tem nenhuma seleção para copiar", "terminal.integrated.exitedWithCode": "O processo terminal encerrado com código de saída: {0}", "terminal.integrated.waitOnExit": "Pressione qualquer tecla para fechar o terminal" diff --git a/i18n/ptb/src/vs/workbench/parts/trust/electron-browser/unsupportedWorkspaceSettings.contribution.i18n.json b/i18n/ptb/src/vs/workbench/parts/trust/electron-browser/unsupportedWorkspaceSettings.contribution.i18n.json index e9ff1ac2f4..d0107f458c 100644 --- a/i18n/ptb/src/vs/workbench/parts/trust/electron-browser/unsupportedWorkspaceSettings.contribution.i18n.json +++ b/i18n/ptb/src/vs/workbench/parts/trust/electron-browser/unsupportedWorkspaceSettings.contribution.i18n.json @@ -6,7 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "unsupportedWorkspaceSettings": "Esta área de trabalho contém configurações que só podem ser definidas nas configurações do usuário. ({0}). Clique [aqui]({1}) para mais informações.", "openWorkspaceSettings": "Abrir as configurações do espaço de trabalho", - "dontShowAgain": "Não mostrar novamente" + "dontShowAgain": "Não mostrar novamente", + "unsupportedWorkspaceSettings": "Esta área de trabalho contém configurações que só podem ser definidas nas configurações do usuário. ({0}). Clique [aqui]({1}) para mais informações." } \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/update/electron-browser/update.i18n.json b/i18n/ptb/src/vs/workbench/parts/update/electron-browser/update.i18n.json index 0fbbffad2c..da6e72a8a9 100644 --- a/i18n/ptb/src/vs/workbench/parts/update/electron-browser/update.i18n.json +++ b/i18n/ptb/src/vs/workbench/parts/update/electron-browser/update.i18n.json @@ -18,9 +18,7 @@ "thereIsUpdateAvailable": "Há uma atualização disponível.", "download now": "Baixar agora", "later": "Mais tarde", - "updateAvailable": "Há uma atualização disponível: {0} {1}", "installUpdate": "Instalar Atualização", - "updateInstalling": "{0} {1} está sendo instalado no plano de fundo, nós te avisaremos quando estiver pronto.", "updateAvailableAfterRestart": "Reinicie o {0} para aplicar a atualização mais recente.", "updateNow": "Atualizar Agora", "commandPalette": "Paleta de comandos...", diff --git a/i18n/ptb/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThrough.contribution.i18n.json b/i18n/ptb/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThrough.contribution.i18n.json index 6e9b0d350f..33e599a882 100644 --- a/i18n/ptb/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThrough.contribution.i18n.json +++ b/i18n/ptb/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThrough.contribution.i18n.json @@ -7,6 +7,5 @@ "Do not edit this file. It is machine generated." ], "walkThrough.editor.label": "Playground Interativo", - "help": "Ajuda", - "interactivePlayground": "Playground Interativo" + "help": "Ajuda" } \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/services/bulkEdit/electron-browser/bulkEditService.i18n.json b/i18n/ptb/src/vs/workbench/services/bulkEdit/electron-browser/bulkEditService.i18n.json new file mode 100644 index 0000000000..f86add7197 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/services/bulkEdit/electron-browser/bulkEditService.i18n.json @@ -0,0 +1,13 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "summary.0": "Não foram feitas edições", + "summary.nm": "Feitas {0} edições de texto em {1} arquivos", + "summary.n0": "Feitas {0} edições de texto em um arquivo", + "conflict": "Estes arquivos foram alterados nesse meio tempo: {0}" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/services/themes/common/fileIconThemeSchema.i18n.json b/i18n/ptb/src/vs/workbench/services/themes/common/fileIconThemeSchema.i18n.json index e6b72d456f..27cd6e134b 100644 --- a/i18n/ptb/src/vs/workbench/services/themes/common/fileIconThemeSchema.i18n.json +++ b/i18n/ptb/src/vs/workbench/services/themes/common/fileIconThemeSchema.i18n.json @@ -21,7 +21,6 @@ "schema.languageId": "O ID da definição do ícone para a associação.", "schema.fonts": "Fontes que são usadas nas definições de ícone.", "schema.id": "O ID da fonte.", - "schema.src": "A localização da fonte.", "schema.font-path": "O caminho do fonte, relativo ao arquivo de tema de ícone atual.", "schema.font-format": "O formato da fonte.", "schema.font-weight": "O peso da fonte.", diff --git a/i18n/rus/extensions/configuration-editing/out/extension.i18n.json b/i18n/rus/extensions/configuration-editing/out/extension.i18n.json index bfba71ea77..ec10851272 100644 --- a/i18n/rus/extensions/configuration-editing/out/extension.i18n.json +++ b/i18n/rus/extensions/configuration-editing/out/extension.i18n.json @@ -6,5 +6,16 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "workspaceFolder": "Путь к папке открыт в VS Code", + "workspaceFolderBasename": "Имя папки, открытой в VS Code, без каких-либо слешей (/)", + "relativeFile": "Текущий открытый файл относительно ${workspaceFolder}", + "file": "Текущий открытый файл", + "cwd": "Текущий рабочий каталог средства запуска задачи при запуске", + "lineNumber": "Номер текущей выбранной строки в активном файле", + "selectedText": "Текущий выделенный текст в активном файле ", + "fileDirname": "Имя директории текущего открытого файла", + "fileExtname": "Расширение текущего открытого файла", + "fileBasename": "Базовое имя текущего открытого файла", + "fileBasenameNoExtension": "Базовое имя текущего открытого файла без расширения", "exampleExtension": "Пример" } \ No newline at end of file diff --git a/i18n/rus/extensions/git/out/commands.i18n.json b/i18n/rus/extensions/git/out/commands.i18n.json index 61e4db033a..bdd7adadfa 100644 --- a/i18n/rus/extensions/git/out/commands.i18n.json +++ b/i18n/rus/extensions/git/out/commands.i18n.json @@ -2,7 +2,7 @@ "": [ "--------------------------------------------------------------------------------------------", "Copyright (c) Microsoft Corporation. All rights reserved.", - "Licensed under the Source EULA. See License.txt in the project root for license information.", + "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], @@ -10,10 +10,12 @@ "remote branch at": "Удаленная ветвь в {0}", "create branch": "$(plus) Создать новую ветвь", "repourl": "URL-адрес репозитория", - "parent": "Родительский каталог", + "selectFolder": "Выбрать расположение репозитория", "cloning": "Клонирование репозитория Git \"{0}\"...", - "openrepo": "Открыть репозиторий", "proposeopen": "Вы хотите открыть клонированный репозиторий?", + "openrepo": "Открыть репозиторий", + "add": "Добавить в рабочую область", + "proposeopen2": "Вы хотите открыть клонированный репозиторий, или добавить его в текущую рабочую область?", "init": "Выберите папку рабочей области для инициализации репозитория Git", "init repo": "Инициализировать репозиторий", "create repo": "Инициализировать репозиторий", diff --git a/i18n/rus/extensions/npm/out/npmView.i18n.json b/i18n/rus/extensions/npm/out/npmView.i18n.json index b6387cc4b5..1d9c06d37c 100644 --- a/i18n/rus/extensions/npm/out/npmView.i18n.json +++ b/i18n/rus/extensions/npm/out/npmView.i18n.json @@ -6,6 +6,9 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "npm.noDebugOptions": "Не удалось запустить \"{0}\" для отладки, так как в сценариях отсутствует параметр отладки узла, например, \"--inspect-brk\".", - "npm.scriptInvalid": "Не удалось найти сценарий \"{0}\". Попробуйте обновить представление." + "noScripts": "Сценарии не найдены", + "noDebugOptions": "Не удалось запустить \"{0}\" для отладки, так как в сценариях отсутствует параметр отладки узла, например, \"--inspect-brk\".", + "learnMore": "Дополнительные сведения", + "ok": "ОК", + "scriptInvalid": "Не удалось найти сценарий \"{0}\". Попробуйте обновить представление." } \ No newline at end of file diff --git a/i18n/rus/extensions/npm/package.i18n.json b/i18n/rus/extensions/npm/package.i18n.json index ff1cc85f4a..8d7baa6e0d 100644 --- a/i18n/rus/extensions/npm/package.i18n.json +++ b/i18n/rus/extensions/npm/package.i18n.json @@ -12,15 +12,15 @@ "config.npm.runSilent": "Запускать команды npm с параметром '--silent'.", "config.npm.packageManager": "Диспетчер пакетов, используемый для запуска сценариев.", "config.npm.exclude": "Настройте стандартные маски для папок, которые должны быть обработаны с помощью автоматического определения сценария.", - "config.npm.enableScriptExplorer": "Включить представление обозревателя для сценариев npm, если рабочая область содержит файл 'package.json'.", + "config.npm.enableScriptExplorer": "Включить представление обозревателя для сценариев npm.", + "config.npm.scriptExplorerAction": "Действие по умолчанию при щелчке в обозревателе сценариев. Допустимые значения: 'open' или 'run', значение по умолчанию – 'open'.", "npm.parseError": "Определение задач npm: не удалось проанализировать файл {0}", "taskdef.script": "Скрипт npm для изменения.", - "taskdef.path": "Путь к папке с файлом package.json, который содержит сценарий. Можно опустить.", + "taskdef.path": "Путь к папке с файлом package.json, который содержит сценарий. Этот параметр можно опустить.", "view.name": "Сценарии NPM", "command.refresh": "Обновить", "command.run": "Запустить", "command.debug": "Отладка", "command.openScript": "Открыть", - "npm.scriptInvalid": "Не удалось найти сценарий '{0}'. Попробуйте обновить представление.", - "npm.noDebugOptions": "Не удалось запустить '{0}' для отладки, так как в сценариях не указан параметр отладки узла, например, '--inspect-brk'." + "command.runInstall": "Запустить установку" } \ No newline at end of file diff --git a/i18n/rus/extensions/search-rg/package.i18n.json b/i18n/rus/extensions/search-rg/package.i18n.json new file mode 100644 index 0000000000..dd7a66691d --- /dev/null +++ b/i18n/rus/extensions/search-rg/package.i18n.json @@ -0,0 +1,11 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "displayName": "Поиск (ripgrep)", + "description": "Поиск с использованием ripgrep." +} \ No newline at end of file diff --git a/i18n/rus/extensions/typescript-language-features/out/features/updatePathsOnRename.i18n.json b/i18n/rus/extensions/typescript-language-features/out/features/updatePathsOnRename.i18n.json new file mode 100644 index 0000000000..4d667fdc7d --- /dev/null +++ b/i18n/rus/extensions/typescript-language-features/out/features/updatePathsOnRename.i18n.json @@ -0,0 +1,14 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "prompt": "Вы хотите обновить импорты для перемещенного файла: '{0}'?", + "reject.title": "Нет", + "accept.title": "Да", + "always.title": "Да, всегда обновлять импорты", + "never.title": "Нет, никогда не обновлять импорты" +} \ No newline at end of file diff --git a/i18n/rus/extensions/typescript-language-features/package.i18n.json b/i18n/rus/extensions/typescript-language-features/package.i18n.json index c7f564e29d..378947c53a 100644 --- a/i18n/rus/extensions/typescript-language-features/package.i18n.json +++ b/i18n/rus/extensions/typescript-language-features/package.i18n.json @@ -8,8 +8,7 @@ ], "displayName": "Возможности языков TypeScript и JavaScript", "description": "Предоставляет широкую поддержку языка для JavaScript и TypeScript.", - "typescript.reloadProjects.title": "Перезагрузить проект", - "javascript.reloadProjects.title": "Перезагрузить проект", + "reloadProjects.title": "Перезагрузить проект", "configuration.typescript": "TypeScript", "typescript.useCodeSnippetsOnMethodSuggest.dec": "Дополните функции сигнатурами их параметров.", "typescript.tsdk.desc": "Указывает путь к папке, содержащей файлы tsserver и lib*.d.ts, которые необходимо использовать.", @@ -37,8 +36,7 @@ "format.placeOpenBraceOnNewLineForFunctions": "Определяет, ставится ли открывающая фигурная скобка с новой строки в функциях.", "format.placeOpenBraceOnNewLineForControlBlocks": "Определяет, ставится ли открывающая фигурная скобка с новой строки в блоках управления.", "javascript.validate.enable": "Включение или отключение проверки JavaScript.", - "typescript.goToProjectConfig.title": "Перейти к конфигурации проекта", - "javascript.goToProjectConfig.title": "Перейти к конфигурации проекта", + "goToProjectConfig.title": "Перейти к конфигурации проекта", "javascript.referencesCodeLens.enabled": "Включить/отключить ссылки CodeLens для файлов JavaScript.", "typescript.referencesCodeLens.enabled": "Включить/отключить ссылки CodeLens для файлов TypeScript. Требуется TypeScript версии 2.0.6 или более поздней версии.", "typescript.implementationsCodeLens.enabled": "Включить или отключить CodeLens для реализаций. Требуется TypeScript >= 2.2.0.", @@ -55,11 +53,15 @@ "typescript.problemMatchers.tsc.label": "Проблемы TypeScript", "typescript.problemMatchers.tscWatch.label": "Проблемы TypeScript (режим наблюдения)", "typescript.quickSuggestionsForPaths": "Включить/отключить краткие предложения при вводе пути импорта.", - "typescript.locale": "Устанавливает языковой стандарт, используемый для сообщений об ошибках TypeScript. Требуется TypeScript 2.6.0 или более поздней версии. Значение по умолчанию — 'null'. При указании значения null для сообщений об ошибках TypeScript используется языковой стандарт VS Code.", + "typescript.locale": "Устанавливает языковой стандарт, используемый для сообщений об ошибках JavaScript и TypeScript. Требуется TypeScript 2.6.0 или более поздней версии. Значение по умолчанию — 'null'. При указании значения null используется языковой стандарт VS Code.", "javascript.implicitProjectConfig.experimentalDecorators": "Включает/отключает параметр 'experimentalDecorators' для файлов JavaScript, которые не являются частью проекта. Этот параметр может переопределяться в файле jsconfig.json или tsconfig.json. Требуется TypeScript 2.3.1 или более поздней версии.", "typescript.autoImportSuggestions.enabled": "Включить/отключить предложения автоматического импорта. Требуется TypeScript 2.6.1 или более поздней версии", "typescript.experimental.syntaxFolding": "Включает/отключает маркеры свертывания с учетом синтаксиса.", "taskDefinition.tsconfig.description": "Файл tsconfig, который определяет сборку TS.", "javascript.suggestionActions.enabled": "Включить/отключить предложения диагностики для файлов JavaScript в редакторе. Требуется TypeScript версии 2.8 или более поздней версии.", - "typescript.suggestionActions.enabled": "Включить/отключить предложения диагностики для файлов TypeScript в редакторе. Требуется TypeScript версии 2.8 или более поздней версии." + "typescript.suggestionActions.enabled": "Включить/отключить предложения диагностики для файлов TypeScript в редакторе. Требуется TypeScript версии 2.8 или более поздней версии", + "typescript.preferences.quoteStyle": "Предпочтительный стиль кавычек для быстрых исправлений. Допустимые значения: 'single' (одинарные кавычки), 'double' (двойные кавычки) и 'auto' (использовать тип кавычек из предыдущих операций импорта). Требуется TypeScript версии 2.9 или более поздней версии", + "typescript.preferences.importModuleSpecifier": "Предпочитаемый стиль пути для автоматического импорта:\n- \"relative\": относительный путь по отношению к расположению файла.\n- \"non-relative\": относительный путь по отношению к 'baseUrl', указанному в файле 'jsconfig.json' или 'tsconfig.json'.\n- \"auto\": использовать самый короткий тип пути.\nТребуется TypeScript версии 2.9 или более поздней версии", + "typescript.showUnused": "Включить/отключить выделение неиспользуемых переменных в коде. Требуется TypeScript версии 2.9 или более поздней версии", + "typescript.updateImportsOnFileMove.enabled": "Включить/отключить автоматическое обновление путей импорта при переименовании или перемещении файлов в VS Code. Допустимые значения: 'prompt' (выдавать запрос при каждом переименовании), 'always' (обновлять пути автоматически) и 'never' (никогда не изменять пути и не выдавать запросы). Требуется TypeScript версии 2.9 или более поздней версии" } \ No newline at end of file diff --git a/i18n/rus/src/vs/base/node/zip.i18n.json b/i18n/rus/src/vs/base/node/zip.i18n.json index deb54c61b8..d4e29cd759 100644 --- a/i18n/rus/src/vs/base/node/zip.i18n.json +++ b/i18n/rus/src/vs/base/node/zip.i18n.json @@ -2,10 +2,10 @@ "": [ "--------------------------------------------------------------------------------------------", "Copyright (c) Microsoft Corporation. All rights reserved.", - "Licensed under the Source EULA. See License.txt in the project root for license information.", + "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "incompleteExtract": "Операция не завершена. Извлечено {0} из {1} записей", + "incompleteExtract": "Операция не завершена. Найдено {0} из {1} записей", "notFound": "{0} не найдено в ZIP-архиве." } \ No newline at end of file diff --git a/i18n/rus/src/vs/code/electron-browser/issue/issueReporterMain.i18n.json b/i18n/rus/src/vs/code/electron-browser/issue/issueReporterMain.i18n.json index 49cc89f5ef..6d3f99cb3b 100644 --- a/i18n/rus/src/vs/code/electron-browser/issue/issueReporterMain.i18n.json +++ b/i18n/rus/src/vs/code/electron-browser/issue/issueReporterMain.i18n.json @@ -6,6 +6,8 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "hide": "скрыть", + "show": "показать", "previewOnGitHub": "Предварительный просмотр в GitHub", "loadingData": "Загрузка данных...", "rateLimited": "Превышено ограничение на количество запросов GitHub. Подождите.", diff --git a/i18n/rus/src/vs/code/electron-browser/issue/issueReporterPage.i18n.json b/i18n/rus/src/vs/code/electron-browser/issue/issueReporterPage.i18n.json index ec1142c973..cd7ea704ca 100644 --- a/i18n/rus/src/vs/code/electron-browser/issue/issueReporterPage.i18n.json +++ b/i18n/rus/src/vs/code/electron-browser/issue/issueReporterPage.i18n.json @@ -17,13 +17,12 @@ "issueTitleLabel": "Название", "issueTitleRequired": "Введите название.", "titleLengthValidation": "Название слишком длинное.", - "systemInfo": "Информация о системе", - "sendData": "Отправить мои данные", - "processes": "Запущенные процессы", - "workspaceStats": "Статистика моей рабочей области", - "extensions": "Мои расширения", - "searchedExtensions": "Расширения, для которых выполнялся поиск", - "settingsSearchDetails": "Сведения о параметрах поиска", "details": "Укажите сведения.", - "loadingData": "Загрузка данных..." + "sendSystemInfo": "Включить сведения о моей системе ({0})", + "show": "показать", + "sendProcessInfo": "Включить сведения о запущенных процессах ({0})", + "sendWorkspaceInfo": "Включить метаданные рабочей области ({0})", + "sendExtensions": "Включить сведения об активных расширениях ({0})", + "sendSearchedExtensions": "Отправить сведения о расширениях, для которых выполнялся поиск ({0})", + "sendSettingsSearchDetails": "Отправить сведения о параметрах поиска ({0})" } \ No newline at end of file diff --git a/i18n/rus/src/vs/code/electron-browser/processExplorer/processExplorerMain.i18n.json b/i18n/rus/src/vs/code/electron-browser/processExplorer/processExplorerMain.i18n.json index c07ddc329b..7531671318 100644 --- a/i18n/rus/src/vs/code/electron-browser/processExplorer/processExplorerMain.i18n.json +++ b/i18n/rus/src/vs/code/electron-browser/processExplorer/processExplorerMain.i18n.json @@ -8,8 +8,10 @@ ], "cpu": "Загрузка ЦП (%)", "memory": "Память (МБ)", - "pid": "PID", + "pid": "идентификатор процесса", "name": "Имя", - "killProcess": "Убить процесс", - "forceKillProcess": "Принудительно убить процесс" + "killProcess": "Завершить процесс", + "forceKillProcess": "Принудительно убить процесс", + "copy": "Копировать", + "copyAll": "Копировать все" } \ No newline at end of file diff --git a/i18n/rus/src/vs/code/electron-main/menus.i18n.json b/i18n/rus/src/vs/code/electron-main/menus.i18n.json index 6c8c10fb36..5c6bba8575 100644 --- a/i18n/rus/src/vs/code/electron-main/menus.i18n.json +++ b/i18n/rus/src/vs/code/electron-main/menus.i18n.json @@ -88,7 +88,6 @@ "miToggleDebugConsole": "Ко&&нсоль отладки", "miToggleIntegratedTerminal": "&&Интегрированный терминал", "miMarker": "Проблемы", - "miAdditionalViews": "Дополнительные &&представления", "miCommandPalette": "&&Палитра команд...", "miOpenView": "&&Открыть представление...", "miToggleFullScreen": "Включить/выключить полно&&экранный режим", @@ -144,7 +143,7 @@ "miContinue": "&&Продолжить", "miToggleBreakpoint": "Перек&&лючить точку останова", "miConditionalBreakpoint": "У&&словная точка останова...", - "miColumnBreakpoint": "Т&&очка останова столбца", + "miInlineBreakpoint": "Внутренняя точ&&ка останова", "miFunctionBreakpoint": "&&Точка останова функции...", "miLogPoint": "&&Точка журнала...", "miNewBreakpoint": "&&Новая точка останова", diff --git a/i18n/rus/src/vs/editor/browser/widget/codeEditorWidget.i18n.json b/i18n/rus/src/vs/editor/browser/widget/codeEditorWidget.i18n.json new file mode 100644 index 0000000000..b56dc782df --- /dev/null +++ b/i18n/rus/src/vs/editor/browser/widget/codeEditorWidget.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "cursors.maximum": "Количество курсоров ограничено {0}." +} \ No newline at end of file diff --git a/i18n/rus/src/vs/editor/common/config/commonEditorConfig.i18n.json b/i18n/rus/src/vs/editor/common/config/commonEditorConfig.i18n.json index 65df61d33a..66cf48db0f 100644 --- a/i18n/rus/src/vs/editor/common/config/commonEditorConfig.i18n.json +++ b/i18n/rus/src/vs/editor/common/config/commonEditorConfig.i18n.json @@ -2,7 +2,7 @@ "": [ "--------------------------------------------------------------------------------------------", "Copyright (c) Microsoft Corporation. All rights reserved.", - "Licensed under the Source EULA. See License.txt in the project root for license information.", + "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], @@ -26,6 +26,7 @@ "detectIndentation": "При открытии файла editor.tabSize и editor.insertSpaces будут определяться на основе содержимого файла.", "roundedSelection": "Определяет, будут ли выделения иметь скругленные углы.", "scrollBeyondLastLine": "Определяет, будет ли содержимое редактора прокручиваться за последнюю строку.", + "scrollBeyondLastColumn": "Управляет количеством дополнительных символов, на которое содержимое редактора будет прокручиваться по горизонтали.", "smoothScrolling": "Определяет, будет ли использоваться анимация при прокрутке содержимого редактора", "minimap.enabled": "Определяет, отображается ли мини-карта", "minimap.side": "Определяет, с какой стороны будет отображаться мини-карта.", @@ -41,7 +42,7 @@ "wordWrap.bounded": "Строки будут перенесены по минимальному значению из двух: ширина окна просмотра и \"editor.wordWrapColumn\".", "wordWrap": "Определяет, как должны переноситься строки. Допустимые значения:\n - \"off\" (отключить перенос);\n - \"on\" (перенос окна просмотра);\n - \"wordWrapColumn\" (перенос в \"editor.wordWrapColumn\");\n - \"bounded\" (перенос при минимальной ширине окна просмотра и \"editor.wordWrapColumn\").", "wordWrapColumn": "Определяет столбец переноса редактора, если значение \"editor.wordWrap\" — \"wordWrapColumn\" или \"bounded\".", - "wrappingIndent": "Управляет отступом строк с переносом по словам. Допустимые значения: \"none\", \"same\" или \"indent\".", + "wrappingIndent": "Управляет отступом строк с переносом по словам. Допустимые значения: 'none', 'same', 'indent' и 'deepIndent'.", "mouseWheelScrollSensitivity": "Множитель, используемый для параметров deltaX и deltaY событий прокрутки колесика мыши.", "multiCursorModifier.ctrlCmd": "Соответствует клавише CTRL в Windows и Linux и клавише COMMAND в macOS.", "multiCursorModifier.alt": "Соответствует клавише ALT в Windows и Linux и клавише OPTION в macOS.", @@ -77,7 +78,7 @@ "occurrencesHighlight": "Определяет, должен ли редактор выделять экземпляры семантических символов.", "overviewRulerLanes": "Определяет, сколько украшений могут отображаться на одном месте в обзорной линейке.", "overviewRulerBorder": "Определяет, следует ли рисовать границу на обзорной линейке.", - "cursorBlinking": "Управление стилем анимации курсора.", + "cursorBlinking": "Управляет стилем анимации курсора.", "mouseWheelZoom": "Изменение размера шрифта в редакторе при нажатой клавише CTRL и движении колесика мыши", "cursorStyle": "Определяет стиль курсора. Допустимые значения: \"block\", \"block-outline\", \"line\", \"line-thin\", \"underline\" и \"underline-thin\"", "cursorWidth": "Управляет шириной курсора, когда для параметра editor.cursorStyle установлено значение 'line'", diff --git a/i18n/rus/src/vs/editor/common/view/editorColorRegistry.i18n.json b/i18n/rus/src/vs/editor/common/view/editorColorRegistry.i18n.json index c89275c69c..9d3bc679fc 100644 --- a/i18n/rus/src/vs/editor/common/view/editorColorRegistry.i18n.json +++ b/i18n/rus/src/vs/editor/common/view/editorColorRegistry.i18n.json @@ -32,6 +32,7 @@ "infoBorder": "Цвет границ волнистой линии для выделения информационных сообщений в редакторе. ", "hintForeground": "Цвет волнистой линии для выделения подсказок в редакторе.", "hintBorder": "Цвет границ волнистой линии для выделения подсказок в редакторе. ", + "unnecessaryForeground": "Цвет переднего плана ненужного кода в редакторе.", "overviewRulerRangeHighlight": "Цвет метки линейки в окне просмотра для выделений диапазонов. Цвет должен быть прозрачным, чтобы не перекрывать основные знаки отличия.", "overviewRuleError": "Цвет метки линейки в окне просмотра для ошибок.", "overviewRuleWarning": "Цвет метки линейки в окне просмотра для предупреждений.", diff --git a/i18n/rus/src/vs/editor/contrib/fontZoom/fontZoom.i18n.json b/i18n/rus/src/vs/editor/contrib/fontZoom/fontZoom.i18n.json new file mode 100644 index 0000000000..e65377b6d3 --- /dev/null +++ b/i18n/rus/src/vs/editor/contrib/fontZoom/fontZoom.i18n.json @@ -0,0 +1,12 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "EditorFontZoomIn.label": "Увеличить шрифт редактора", + "EditorFontZoomOut.label": "Уменьшить шрифт редактора", + "EditorFontZoomReset.label": "Сбросить масштаб шрифта редактора" +} \ No newline at end of file diff --git a/i18n/rus/src/vs/editor/contrib/goToDefinition/goToDefinitionCommands.i18n.json b/i18n/rus/src/vs/editor/contrib/goToDefinition/goToDefinitionCommands.i18n.json new file mode 100644 index 0000000000..09533b7d61 --- /dev/null +++ b/i18n/rus/src/vs/editor/contrib/goToDefinition/goToDefinitionCommands.i18n.json @@ -0,0 +1,25 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "noResultWord": "Определение для \"{0}\" не найдено.", + "generic.noResults": "Определения не найдены.", + "meta.title": " — определения {0}", + "actions.goToDecl.label": "Перейти к определению", + "actions.goToDeclToSide.label": "Открыть определение сбоку", + "actions.previewDecl.label": "Показать определение", + "goToImplementation.noResultWord": "Не найдена реализация для \"{0}\".", + "goToImplementation.generic.noResults": "Не найдена реализация.", + "meta.implementations.title": "— {0} реализаций", + "actions.goToImplementation.label": "Перейти к реализации", + "actions.peekImplementation.label": "Показать реализацию", + "goToTypeDefinition.noResultWord": "Не найдено определение типа для \"{0}\".", + "goToTypeDefinition.generic.noResults": "Не найдено определение типа.", + "meta.typeDefinitions.title": "— {0} определений типов", + "actions.goToTypeDefinition.label": "Перейти к определению типа", + "actions.peekTypeDefinition.label": "Показать определение типа" +} \ No newline at end of file diff --git a/i18n/rus/src/vs/editor/contrib/goToDefinition/goToDefinitionMouse.i18n.json b/i18n/rus/src/vs/editor/contrib/goToDefinition/goToDefinitionMouse.i18n.json new file mode 100644 index 0000000000..439e28bae4 --- /dev/null +++ b/i18n/rus/src/vs/editor/contrib/goToDefinition/goToDefinitionMouse.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "multipleResults": "Щелкните, чтобы отобразить определения ({0})." +} \ No newline at end of file diff --git a/i18n/rus/src/vs/editor/contrib/gotoError/gotoError.i18n.json b/i18n/rus/src/vs/editor/contrib/gotoError/gotoError.i18n.json index cc4cd3d50d..25f3112f1d 100644 --- a/i18n/rus/src/vs/editor/contrib/gotoError/gotoError.i18n.json +++ b/i18n/rus/src/vs/editor/contrib/gotoError/gotoError.i18n.json @@ -7,5 +7,7 @@ "Do not edit this file. It is machine generated." ], "markerAction.next.label": "Перейти к Следующей Проблеме (Ошибке, Предупреждению, Информации)", - "markerAction.previous.label": "Перейти к Предыдущей Проблеме (Ошибке, Предупреждению, Информации)" + "markerAction.previous.label": "Перейти к Предыдущей Проблеме (Ошибке, Предупреждению, Информации)", + "markerAction.nextInFiles.label": "Перейти к следующей проблеме в файлах (ошибки, предупреждения, информационные сообщения)", + "markerAction.previousInFiles.label": "Перейти к предыдущей проблеме в файлах (ошибки, предупреждения, информационные сообщения)" } \ No newline at end of file diff --git a/i18n/rus/src/vs/editor/contrib/indentation/indentation.i18n.json b/i18n/rus/src/vs/editor/contrib/indentation/indentation.i18n.json index 021e441244..fc6e079e7e 100644 --- a/i18n/rus/src/vs/editor/contrib/indentation/indentation.i18n.json +++ b/i18n/rus/src/vs/editor/contrib/indentation/indentation.i18n.json @@ -13,5 +13,6 @@ "indentUsingTabs": "Отступ с использованием табуляции", "indentUsingSpaces": "Отступ с использованием пробелов", "detectIndentation": "Определение отступа от содержимого", - "editor.reindentlines": "Повторно расставить отступы строк" + "editor.reindentlines": "Повторно расставить отступы строк", + "editor.reindentselectedlines": "Повторно расставить отступы для выбранных строк" } \ No newline at end of file diff --git a/i18n/rus/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json b/i18n/rus/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json index e7308bcfc7..b5b010a1ed 100644 --- a/i18n/rus/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json +++ b/i18n/rus/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json @@ -25,8 +25,6 @@ "uninstallDependeciesConfirmation": "Вы хотите удалить \"{0}\" отдельно или вместе с зависимостями?", "uninstallOnly": "Только расширение", "uninstallAll": "Удалить все", - "uninstallConfirmation": "Вы действительно хотите удалить \"{0}\"?", - "ok": "ОК", "singleDependentError": "Не удается удалить расширение \"{0}\". От него зависит расширение \"{1}\".", "twoDependentsError": "Не удается удалить расширение \"{0}\". От него зависят расширения \"{1}\" и \"{2}\".", "multipleDependentsError": "Не удается удалить расширение \"{0}\". От него зависят расширения \"{1}\", \"{2}\" и другие.", diff --git a/i18n/rus/src/vs/platform/node/minimalTranslations.i18n.json b/i18n/rus/src/vs/platform/node/minimalTranslations.i18n.json new file mode 100644 index 0000000000..ef1cc0c9ea --- /dev/null +++ b/i18n/rus/src/vs/platform/node/minimalTranslations.i18n.json @@ -0,0 +1,13 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "showLanguagePackExtensions": "Среда VS Code доступна на следующем языке: {0}. Чтобы начать работу, найдите необходимые языковые пакеты в Marketplace. ", + "searchMarketplace": "Поиск в Marketplace", + "installAndRestartMessage": "Среда VS Code доступна на следующем языке: {0}. Чтобы начать работу, установите языковой пакет. После установки потребуется перезапустить среду. ", + "installAndRestart": "Установить и перезапустить" +} \ No newline at end of file diff --git a/i18n/rus/src/vs/platform/theme/common/colorRegistry.i18n.json b/i18n/rus/src/vs/platform/theme/common/colorRegistry.i18n.json index 431b0eeb96..a203da5726 100644 --- a/i18n/rus/src/vs/platform/theme/common/colorRegistry.i18n.json +++ b/i18n/rus/src/vs/platform/theme/common/colorRegistry.i18n.json @@ -16,7 +16,7 @@ "selectionBackground": "Цвет фона выделенного текста в рабочей области (например, в полях ввода или в текстовых полях). Не применяется к выделенному тексту в редакторе.", "textSeparatorForeground": "Цвет для разделителей текста.", "textLinkForeground": "Цвет переднего плана для ссылок в тексте.", - "textLinkActiveForeground": "Цвет переднего фона для активных ссылок в тексте.", + "textLinkActiveForeground": "Цвет переднего плана для ссылок в тексте при щелчке и при наведении курсора мыши.", "textPreformatForeground": "Цвет текста фиксированного формата.", "textBlockQuoteBackground": "Цвет фона для блоков с цитатами в тексте.", "textBlockQuoteBorder": "Цвет границ для блоков с цитатами в тексте.", @@ -48,6 +48,8 @@ "listDropBackground": "Фоновый цвет элементов List/Tree при перемещении с помощью мыши.", "highlight": "Цвет переднего плана для выделения соответствия при поиске по элементу List/Tree.", "invalidItemForeground": "Цвет переднего плана списка/дерева для недопустимых элементов, например, для неразрешенного корневого узла в проводнике.", + "listErrorForeground": "Цвет переднего плана элементов списка, содержащих ошибки.", + "listWarningForeground": "Цвет переднего плана элементов списка, содержащих предупреждения.", "pickerGroupForeground": "Цвет средства быстрого выбора для группировки меток.", "pickerGroupBorder": "Цвет средства быстрого выбора для группировки границ.", "buttonForeground": "Цвет переднего плана кнопки.", @@ -58,7 +60,7 @@ "scrollbarShadow": "Цвет тени полосы прокрутки, которая свидетельствует о том, что содержимое прокручивается.", "scrollbarSliderBackground": "Цвет фона ползунка полосы прокрутки.", "scrollbarSliderHoverBackground": "Цвет фона ползунка полосы прокрутки при наведении курсора.", - "scrollbarSliderActiveBackground": "Цвет фона активного ползунка полосы прокрутки.", + "scrollbarSliderActiveBackground": "Цвет фона ползунка полосы прокрутки при щелчке по нему.", "progressBarBackground": "Цвет фона индикатора выполнения, который может отображаться для длительных операций.", "editorBackground": "Цвет фона редактора.", "editorForeground": "Цвет переднего плана редактора по умолчанию.", @@ -75,6 +77,7 @@ "editorFindMatchBorder": "Цвет границы текущего результата поиска.", "findMatchHighlightBorder": "Цвет границы других результатов поиска.", "findRangeHighlightBorder": "Цвет границы диапазона для ограничения поиска. Цвет должен быть прозрачным, чтобы не перекрывать основные знаки отличия.", + "findWidgetResizeBorder": "Цвет границ панели изменения размера для мини-приложения поиска.", "hoverHighlight": "Выделение под словом, для которого показано наведение. Цвет должен быть прозрачным, чтобы не перекрывать основные знаки отличия.", "hoverBackground": "Цвет фона при наведении указателя на редактор.", "hoverBorder": "Цвет границ при наведении указателя на редактор.", diff --git a/i18n/rus/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.i18n.json b/i18n/rus/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.i18n.json index 1d30401977..60446b0bda 100644 --- a/i18n/rus/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.i18n.json +++ b/i18n/rus/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.i18n.json @@ -6,5 +6,5 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "confirmUrl": "Вы хотите разрешить расширению {0} открыть следующий URL-адрес?" + "confirmUrl": "Разрешить расширению открыть этот URL-адрес?" } \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json b/i18n/rus/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json index e0e9544610..38da1fad97 100644 --- a/i18n/rus/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json +++ b/i18n/rus/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json @@ -8,11 +8,10 @@ ], "vscode.extension.contributes.views.containers.id": "Уникальный идентификатор, используемый для идентификации контейнера, в котором могут быть размещены представления с помощью точки вклада 'views'", "vscode.extension.contributes.views.containers.title": "Строка в понятном формате, используемая для отображения контейнера", - "vscode.extension.contributes.views.containers.icon": "Путь к значку контейнера. Значки имеют размер 24x24, расположены в центре прямоугольника размером 50x40 и имеют цвет заливки rgb (215, 218, 224) или #d7dae0. Для значков рекомендуется использовать формат SVG, хотя допускается любой тип изображения.", + "vscode.extension.contributes.views.containers.icon": "Путь к значку контейнера. Значки имеют размер 24x24, расположены в центре прямоугольника размером 50x40 и имеют цвет заливки rgb (215, 218, 224) или #d7dae0. Для значков рекомендуется использовать формат SVG, хотя допускается любой тип изображения.", "vscode.extension.contributes.viewsContainers": "Добавляет контейнеры представлений в редактор", "views.container.activitybar": "Добавляет контейнеры представлений на панель действий", "test": "Проверить", - "proposed": "Вклад 'viewsContainers' доступен только при запуске из среды разработки или при запуске с параметром командной строки --enable-proposed-api {0}", "requirearray": "Контейнер представлений должен быть массивом", "requireidstring": "Свойство '{0}' является обязательным и должно иметь тип 'string'. Оно может содержать только буквенно-цифровые символы и символы '_' и '-'.", "requirestring": "свойство \"{0}\" является обязательным и должно иметь тип string", diff --git a/i18n/rus/src/vs/workbench/browser/actions/workspaceActions.i18n.json b/i18n/rus/src/vs/workbench/browser/actions/workspaceActions.i18n.json index 8b304577ea..4fc9f30670 100644 --- a/i18n/rus/src/vs/workbench/browser/actions/workspaceActions.i18n.json +++ b/i18n/rus/src/vs/workbench/browser/actions/workspaceActions.i18n.json @@ -15,5 +15,5 @@ "saveWorkspace": "Сохранить рабочую область", "openWorkspaceAction": "Открыть рабочую область...", "openWorkspaceConfigFile": "Открыть файл конфигурации рабочей области", - "openFolderAsWorkspaceInNewWindow": "Открыть папку как рабочую область в новом окне" + "duplicateWorkspaceInNewWindow": "Создать копию рабочей области в новом окне" } \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/browser/parts/panel/panelPart.i18n.json b/i18n/rus/src/vs/workbench/browser/parts/panel/panelPart.i18n.json index 988ee9b118..9d7f5bc1e6 100644 --- a/i18n/rus/src/vs/workbench/browser/parts/panel/panelPart.i18n.json +++ b/i18n/rus/src/vs/workbench/browser/parts/panel/panelPart.i18n.json @@ -1,8 +1,10 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the Source EULA. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ -// Do not edit this file. It is machine generated. { - "panelSwitcherBarAriaLabel": "Переключатель активной панели" + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "hidePanel": "Скрыть панель" } \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/browser/parts/quickopen/quickOpenController.i18n.json b/i18n/rus/src/vs/workbench/browser/parts/quickopen/quickOpenController.i18n.json index de784b0da2..7bafab7b75 100644 --- a/i18n/rus/src/vs/workbench/browser/parts/quickopen/quickOpenController.i18n.json +++ b/i18n/rus/src/vs/workbench/browser/parts/quickopen/quickOpenController.i18n.json @@ -6,8 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "inputModeEntryDescription": "{0} (нажмите клавишу ВВОД, чтобы подтвердить введенные данные, или ESCAPE для отмены)", - "inputModeEntry": "Нажмите клавишу ВВОД, чтобы подтвердить введенные данные, или ESCAPE для отмены", "emptyPicks": "Нет записей для выбора", "quickOpenInput": "Введите \"?\", чтобы узнать, какие отсюда можно выполнить действия", "historyMatches": "недавно открывавшиеся", diff --git a/i18n/rus/src/vs/workbench/browser/parts/views/viewsViewlet.i18n.json b/i18n/rus/src/vs/workbench/browser/parts/views/viewsViewlet.i18n.json index 0a0503bc1f..13f426f144 100644 --- a/i18n/rus/src/vs/workbench/browser/parts/views/viewsViewlet.i18n.json +++ b/i18n/rus/src/vs/workbench/browser/parts/views/viewsViewlet.i18n.json @@ -6,5 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "cannot toggle": "Не удается переключить видимость для представления {0}", + "cannot show": "Представление {0} не может быть показано, так как оно скрыто в условии 'when'", "hideView": "Скрыть" } \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/common/theme.i18n.json b/i18n/rus/src/vs/workbench/common/theme.i18n.json index 22e0f0068a..e1eb661694 100644 --- a/i18n/rus/src/vs/workbench/common/theme.i18n.json +++ b/i18n/rus/src/vs/workbench/common/theme.i18n.json @@ -11,8 +11,10 @@ "tabHoverBackground": "Цвет фона вкладки при наведении. Вкладки — это контейнеры для редакторов в области редактора. В одной группе редакторов можно открыть несколько вкладок. Может присутствовать несколько групп редакторов.", "tabUnfocusedHoverBackground": "Цвет фона вкладки в группе, не имеющей фокуса, при наведении. Вкладки — это контейнеры для редакторов в области редактора. В одной группе редакторов можно открыть несколько вкладок. Также можно открыть несколько групп редакторов.", "tabBorder": "Граница для разделения вкладок. Вкладки — это контейнеры для редакторов в области редакторов. В одной группе редакторов можно открыть несколько вкладок. Может быть несколько групп редакторов.", - "tabActiveBorder": "Граница для выделения активных вкладок. Вкладки — это контейнеры для редакторов в области редакторов. В одной группе редакторов можно открыть несколько вкладок. Также можно открыть несколько групп редакторов. ", - "tabActiveUnfocusedBorder": "Граница для выделения активных вкладок в группе, не имеющей фокуса. Вкладки — это контейнеры для редакторов в области редакторов. В одной группе редакторов можно открыть несколько вкладок. Также можно открыть несколько групп редакторов.", + "tabActiveBorder": "Граница в нижней части активной вкладки. Вкладки — это контейнеры для редакторов в области редакторов. В одной группе редакторов можно открыть несколько вкладок. Также можно открыть несколько групп редакторов. ", + "tabActiveBorderTop": "Граница в верхней части активной вкладки. Вкладки — это контейнеры для редакторов в области редакторов. В одной группе редакторов можно открыть несколько вкладок. Также можно открыть несколько групп редакторов. ", + "tabActiveUnfocusedBorder": "Граница нижней части активной вкладки в группе, не имеющей фокуса. Вкладки — это контейнеры для редакторов в области редакторов. В одной группе редакторов можно открыть несколько вкладок. Также можно открыть несколько групп редакторов.", + "tabActiveUnfocusedBorderTop": "Граница верхней части активной вкладки в группе, не имеющей фокуса. Вкладки — это контейнеры для редакторов в области редакторов. В одной группе редакторов можно открыть несколько вкладок. Также можно открыть несколько групп редакторов.", "tabHoverBorder": "Граница для выделения вкладок при наведении курсора. Вкладки — это контейнеры для редакторов в области редакторов. В одной группе редакторов можно открыть несколько вкладок. Также можно открыть несколько групп редакторов. ", "tabUnfocusedHoverBorder": "Граница для выделения вкладок в группе, не имеющей фокуса, при наведении. Вкладки — это контейнеры для редакторов в области редакторов. В одной группе редакторов можно открыть несколько вкладок. Также можно открыть несколько групп редакторов.", "tabActiveForeground": "Цвет переднего плана активной вкладки в активной группе. Вкладки — это контейнеры для редакторов в области редактора. В одной группе редакторов можно открыть несколько вкладок. Может присутствовать несколько групп редакторов.", diff --git a/i18n/rus/src/vs/workbench/parts/codeEditor/electron-browser/largeFileOptimizations.i18n.json b/i18n/rus/src/vs/workbench/parts/codeEditor/electron-browser/largeFileOptimizations.i18n.json new file mode 100644 index 0000000000..c914868ba4 --- /dev/null +++ b/i18n/rus/src/vs/workbench/parts/codeEditor/electron-browser/largeFileOptimizations.i18n.json @@ -0,0 +1,13 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "largeFile": "{0}: этот файл имеет слишком большой размер, поэтому для него были отключены разметка, перенос и свертывание, чтобы уменьшить объем используемой памяти и предотвратить зависание или неожиданное завершение работы программы.", + "neverShowAgain": "ОК. Больше не показывать", + "removeOptimizations": "Принудительно включить функции", + "reopenFilePrompt": "Откройте файл повторно, чтобы изменение этого параметра вступило в силу." +} \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/debug/browser/debugActions.i18n.json b/i18n/rus/src/vs/workbench/parts/debug/browser/debugActions.i18n.json index 89c4641e03..21096763cb 100644 --- a/i18n/rus/src/vs/workbench/parts/debug/browser/debugActions.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/debug/browser/debugActions.i18n.json @@ -41,7 +41,7 @@ "debugConsoleAction": "Консоль отладки", "unreadOutput": "Новые выходные данные в консоли отладки", "debugFocusConsole": "Фокус консоли отладки", - "focusProcess": "Обработка фокуса", + "focusSession": "Перевести фокус на сеанс", "stepBackDebug": "На шаг назад", "reverseContinue": "Обратно" } \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/debug/browser/debugCommands.i18n.json b/i18n/rus/src/vs/workbench/parts/debug/browser/debugCommands.i18n.json index eb6444f1cd..ee33983d60 100644 --- a/i18n/rus/src/vs/workbench/parts/debug/browser/debugCommands.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/debug/browser/debugCommands.i18n.json @@ -7,7 +7,7 @@ "Do not edit this file. It is machine generated." ], "noFolderDebugConfig": "Перед расширенной настройкой отладки откройте папку.", - "columnBreakpoint": "Точка останова столбца", + "inlineBreakpoint": "Внутренняя точка останова", "debug": "Отладка", - "addColumnBreakpoint": "Добавить точку останова столбца" + "addInlineBreakpoint": "Добавить внутреннюю точку останова" } \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/debug/browser/debugEditorActions.i18n.json b/i18n/rus/src/vs/workbench/parts/debug/browser/debugEditorActions.i18n.json index 9abcd29048..4b33e4684e 100644 --- a/i18n/rus/src/vs/workbench/parts/debug/browser/debugEditorActions.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/debug/browser/debugEditorActions.i18n.json @@ -12,5 +12,7 @@ "runToCursor": "Выполнить до курсора", "debugEvaluate": "Отладка: вычисление", "debugAddToWatch": "Отладка: добавить контрольное значение", - "showDebugHover": "Отладка: показать при наведении" + "showDebugHover": "Отладка: показать при наведении", + "goToNextBreakpoint": "Отладка: перейти к следующей точке останова", + "goToPreviousBreakpoint": "Отладка: перейти к предыдущей точке останова" } \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/debug/browser/debugViewlet.i18n.json b/i18n/rus/src/vs/workbench/parts/debug/browser/debugViewlet.i18n.json index a1e5c9bda3..e3f86146d8 100644 --- a/i18n/rus/src/vs/workbench/parts/debug/browser/debugViewlet.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/debug/browser/debugViewlet.i18n.json @@ -6,6 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "startAdditionalSession": "Запустить дополнительный сеанс", "debugFocusVariablesView": "Перейти в область переменных", "debugFocusWatchView": "Перейти в область контрольных значений", "debugFocusCallStackView": "Перейти в область стека вызовов", diff --git a/i18n/rus/src/vs/workbench/parts/debug/common/debugSchemas.i18n.json b/i18n/rus/src/vs/workbench/parts/debug/common/debugSchemas.i18n.json new file mode 100644 index 0000000000..4b03de0a74 --- /dev/null +++ b/i18n/rus/src/vs/workbench/parts/debug/common/debugSchemas.i18n.json @@ -0,0 +1,38 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "vscode.extension.contributes.debuggers": "Добавляет адаптеры отладки.", + "vscode.extension.contributes.debuggers.type": "Уникальный идентификатор этого адаптера отладки.", + "vscode.extension.contributes.debuggers.label": "Отображаемое имя этого адаптера отладки.", + "vscode.extension.contributes.debuggers.program": "Путь к программе адаптера отладки. Путь указывается либо как абсолютный, либо относительно папки расширения.", + "vscode.extension.contributes.debuggers.args": "Необязательные аргументы для передачи адаптеру.", + "vscode.extension.contributes.debuggers.runtime": "Дополнительная среда выполнения, используемая в том случае, если атрибут program не указывает на исполняемый файл, но среда выполнения требуется.", + "vscode.extension.contributes.debuggers.runtimeArgs": "Аргументы дополнительной среды выполнения.", + "vscode.extension.contributes.debuggers.variables": "Сопоставление интерактивных переменных (например, ${action.pickProcess}) в \"launch.json\" для команды.", + "vscode.extension.contributes.debuggers.initialConfigurations": "Конфигурации для создания первоначального файла launch.json.", + "vscode.extension.contributes.debuggers.languages": "Список языков, для которых расширение отладки может считаться \"отладчиком по умолчанию\".", + "vscode.extension.contributes.debuggers.adapterExecutableCommand": "Если задано, VS Code будет вызывать эту команду, чтобы определить путь к исполняемому файлу адаптера отладки и передаваемые аргументы.", + "vscode.extension.contributes.debuggers.configurationSnippets": "Фрагменты для добавления новых конфигураций в launch.json.", + "vscode.extension.contributes.debuggers.configurationAttributes": "Конфигурации схемы JSON для проверки launch.json.", + "vscode.extension.contributes.debuggers.windows": "Параметры, связанные с Windows.", + "vscode.extension.contributes.debuggers.windows.runtime": "Среда выполнения, используемая для Windows.", + "vscode.extension.contributes.debuggers.osx": "Параметры, связанные с macOS.", + "vscode.extension.contributes.debuggers.osx.runtime": "Среда выполнения, используемая для macOS.", + "vscode.extension.contributes.debuggers.linux": "Параметры, связанные с Linux.", + "vscode.extension.contributes.debuggers.linux.runtime": "Среда выполнения, используемая для Linux.", + "vscode.extension.contributes.breakpoints": "Добавляет точки останова.", + "vscode.extension.contributes.breakpoints.language": "Разрешить точки останова для этого языка.", + "app.launch.json.title": "Запустить", + "app.launch.json.version": "Версия этого формата файла.", + "app.launch.json.configurations": "Список конфигураций. Добавьте новые конфигурации или измените существующие с помощью IntelliSense.", + "app.launch.json.compounds": "Список составных объектов. Каждый из них ссылается на несколько конфигураций, которые будут запущены вместе.", + "app.launch.json.compound.name": "Имя составного объекта. Отображается в раскрывающемся меню запуска конфигурации.", + "useUniqueNames": "Используйте уникальное имя конфигурации.", + "app.launch.json.compound.folder": "Имя папки, в которой расположен составной объект.", + "app.launch.json.compounds.configurations": "Имена конфигураций, которые будут запущены как часть этого составного объекта." +} \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/debug/electron-browser/callStackView.i18n.json b/i18n/rus/src/vs/workbench/parts/debug/electron-browser/callStackView.i18n.json index 9d11538b13..ab885abb5e 100644 --- a/i18n/rus/src/vs/workbench/parts/debug/electron-browser/callStackView.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/debug/electron-browser/callStackView.i18n.json @@ -9,7 +9,7 @@ "callstackSection": "Раздел стека вызовов", "debugStopped": "Приостановлено на {0}", "callStackAriaLabel": "Отладка стека вызовов", - "process": "Процесс", + "session": "Сеанс", "paused": "Приостановлено", "running": "Работает", "thread": "Поток", diff --git a/i18n/rus/src/vs/workbench/parts/debug/electron-browser/debug.contribution.i18n.json b/i18n/rus/src/vs/workbench/parts/debug/electron-browser/debug.contribution.i18n.json index f2ced40ab4..deb3cae7e7 100644 --- a/i18n/rus/src/vs/workbench/parts/debug/electron-browser/debug.contribution.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/debug/electron-browser/debug.contribution.i18n.json @@ -21,11 +21,12 @@ "allowBreakpointsEverywhere": "Разрешает задание точки останова в любом файле", "openExplorerOnEnd": "Автоматически открывать представление обозревателя в конце сеанса отладки", "inlineValues": "Показывать значения переменных в редакторе во время отладки", - "hideActionBar": "Определяет, следует ли скрыть всплывающую панель действий отладки.", + "toolBarLocation": "Управляет расположением панели инструментов отладки. Допустимые значения: \"floating\" (может находиться во всех представлениях), \"docked\" (закреплена в представлении отладки) или \"hidden\" (скрыта).", "never": "Никогда не отображать отладку в строке состояния", "always": "Всегда отображать отладку в строке состояния", "onFirstSessionStart": "Отображать отладку в строке состояния только после первого запуска отладки", "showInStatusBar": "Определяет видимость для строки состояния отладки", "openDebug": "Определяет, следует ли открыть представление отладки в начале сеанса отладки.", + "enableAllHovers": "Управляет тем, должны ли отображаться всплывающие сообщения, не связанные с отладкой, во время отладки. Если этот параметр имеет значение true, будут вызваны поставщики всплывающих сообщений, и сообщения будут отображены. Обычные всплывающие сообщения не будут отображаться, даже если этот параметр имеет значение true.", "launch": "Глобальная конфигурация запуска отладки. Должна использоваться в качестве альтернативы для конфигурации \"launch.json\", которая является общей для рабочих пространств" } \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.i18n.json b/i18n/rus/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.i18n.json index 2566c06081..0ae1d13f64 100644 --- a/i18n/rus/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.i18n.json @@ -2,39 +2,10 @@ "": [ "--------------------------------------------------------------------------------------------", "Copyright (c) Microsoft Corporation. All rights reserved.", - "Licensed under the Source EULA. See License.txt in the project root for license information.", + "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "vscode.extension.contributes.debuggers": "Добавляет адаптеры отладки.", - "vscode.extension.contributes.debuggers.type": "Уникальный идентификатор этого адаптера отладки.", - "vscode.extension.contributes.debuggers.label": "Отображаемое имя этого адаптера отладки.", - "vscode.extension.contributes.debuggers.program": "Путь к программе адаптера отладки. Путь указывается либо как абсолютный, либо относительно папки расширения.", - "vscode.extension.contributes.debuggers.args": "Необязательные аргументы для передачи адаптеру.", - "vscode.extension.contributes.debuggers.runtime": "Дополнительная среда выполнения, используемая в том случае, если атрибут program не указывает на исполняемый файл, но среда выполнения требуется.", - "vscode.extension.contributes.debuggers.runtimeArgs": "Аргументы дополнительной среды выполнения.", - "vscode.extension.contributes.debuggers.variables": "Сопоставление интерактивных переменных (например, ${action.pickProcess}) в \"launch.json\" для команды.", - "vscode.extension.contributes.debuggers.initialConfigurations": "Конфигурации для создания первоначального файла launch.json.", - "vscode.extension.contributes.debuggers.languages": "Список языков, для которых расширение отладки может считаться \"отладчиком по умолчанию\".", - "vscode.extension.contributes.debuggers.adapterExecutableCommand": "Если задано, VS Code будет вызывать эту команду, чтобы определить путь к исполняемому файлу адаптера отладки и передаваемые аргументы.", - "vscode.extension.contributes.debuggers.configurationSnippets": "Фрагменты для добавления новых конфигураций в launch.json.", - "vscode.extension.contributes.debuggers.configurationAttributes": "Конфигурации схемы JSON для проверки launch.json.", - "vscode.extension.contributes.debuggers.windows": "Параметры, связанные с Windows.", - "vscode.extension.contributes.debuggers.windows.runtime": "Среда выполнения, используемая для Windows.", - "vscode.extension.contributes.debuggers.osx": "Параметры, связанные с macOS.", - "vscode.extension.contributes.debuggers.osx.runtime": "Среда выполнения, используемая для macOS.", - "vscode.extension.contributes.debuggers.linux": "Параметры, связанные с Linux.", - "vscode.extension.contributes.debuggers.linux.runtime": "Среда выполнения, используемая для Linux.", - "vscode.extension.contributes.breakpoints": "Добавляет точки останова.", - "vscode.extension.contributes.breakpoints.language": "Разрешить точки останова для этого языка.", - "app.launch.json.title": "Запустить", - "app.launch.json.version": "Версия этого формата файла.", - "app.launch.json.configurations": "Список конфигураций. Добавьте новые конфигурации или измените существующие с помощью IntelliSense.", - "app.launch.json.compounds": "Список составных объектов. Каждый из них ссылается на несколько конфигураций, которые будут запущены вместе.", - "app.launch.json.compound.name": "Имя составного объекта. Отображается в раскрывающемся меню запуска конфигурации.", - "useUniqueNames": "Используйте уникальное имя конфигурации.", - "app.launch.json.compound.folder": "Имя папки, в которой расположен составной объект.", - "app.launch.json.compounds.configurations": "Имена конфигураций, которые будут запущены как часть этого составного объекта.", "debugNoType": "Параметр 'type' отладчика является обязательным и должен иметь тип 'string'.", "selectDebug": "Выбор среды", "DebugConfig.failed": "Не удается создать файл launch.json в папке .vscode ({0}).", diff --git a/i18n/rus/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json b/i18n/rus/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json index fb7d93803d..23861effe7 100644 --- a/i18n/rus/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json @@ -2,7 +2,7 @@ "": [ "--------------------------------------------------------------------------------------------", "Copyright (c) Microsoft Corporation. All rights reserved.", - "Licensed under the Source EULA. See License.txt in the project root for license information.", + "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], @@ -13,21 +13,21 @@ "disableBreakpoint": "Отключить {0}", "enableBreakpoint": "Включить {0}", "removeBreakpoints": "Удалить точки останова", - "removeBreakpointOnColumn": "Удалить точку останова из столбца {0}", + "removeInlineBreakpointOnColumn": "Удалить внутреннюю точку останова в столбце {0}", "removeLineBreakpoint": "Удалить точку останова из строки", "editBreakpoints": "Изменить точки останова", - "editBreakpointOnColumn": "Изменить точку останова в столбце {0}", + "editInlineBreakpointOnColumn": "Изменить внутреннюю точку останова в столбце {0}", "editLineBrekapoint": "Изменить точку останова в строке", "enableDisableBreakpoints": "Включить или отключить точки останова", - "disableColumnBreakpoint": "Отключить точку останова в столбце {0}", + "disableInlineColumnBreakpoint": "Отключить внутреннюю точку останова в столбце {0} ", "disableBreakpointOnLine": "Отключить точку останова в строке", - "enableBreakpoints": "Включить точку останова в столбце {0}", + "enableBreakpoints": "Включить внутреннюю точку останова в столбце {0} ", "enableBreakpointOnLine": "Включить точку останова в строке", "addBreakpoint": "Добавить точку останова", "addConditionalBreakpoint": "Добавить условную точку останова…", "addLogPoint": "Добавить точку журнала...", "breakpointHasCondition": "Этот {0} содержит {1}, который будет утерян при удалении. Попробуйте отключить {0} вместо удаления.", - "message": "Сообщение", + "message": "сообщение", "condition": "Условие", "removeLogPoint": "Удалить {0}", "disableLogPoint": "Отключить {0}", diff --git a/i18n/rus/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.i18n.json b/i18n/rus/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.i18n.json index 80214fe333..f164fde436 100644 --- a/i18n/rus/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.i18n.json @@ -16,9 +16,13 @@ "repository": "Репозиторий", "license": "Лицензия", "details": "Подробности", + "detailstooltip": "Сведения о расширении, полученные из файла 'README.md' расширения", "contributions": "Вклады", + "contributionstooltip": "Выводит список изменений в VS Code для этого расширения", "changelog": "Журнал изменений", + "changelogtooltip": "История обновления расширения, полученная из файла 'CHANGELOG.md' расширения", "dependencies": "Зависимости", + "dependenciestooltip": "Выводит список расширений, от которых зависит это расширение", "noReadme": "Файл сведений недоступен.", "noChangelog": "Журнал изменений недоступен.", "noContributions": "Нет публикаций", @@ -30,6 +34,10 @@ "debuggers": "Отладчики ({0})", "debugger name": "Имя", "debugger type": "Тип", + "viewContainers": "Просмотреть контейнеры ({0})", + "view container id": "Идентификатор", + "view container title": "Название", + "view container location": "Где", "views": "Представления ({0})", "view id": "Идентификатор", "view name": "Имя", diff --git a/i18n/rus/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json b/i18n/rus/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json index 7932bb5cda..8bcb1c3f47 100644 --- a/i18n/rus/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json @@ -8,7 +8,6 @@ ], "neverShowAgain": "Больше не показывать", "searchMarketplace": "Поиск в Marketplace", - "showLanguagePackExtensions": "В Marketplace есть расширения, которые помогут локализовать VS Code на язык \"{0}\"", "dynamicWorkspaceRecommendation": "Это расширение может вас заинтересовать, потому что оно популярно среди пользователей репозитория {0}.", "exeBasedRecommendation": "Рекомендуется использовать это расширение, так как установлено {0}.", "fileBasedRecommendation": "Рекомендуется использовать это расширение (на основе недавно открытых файлов).", diff --git a/i18n/rus/src/vs/workbench/parts/extensions/node/extensionsWorkbenchService.i18n.json b/i18n/rus/src/vs/workbench/parts/extensions/node/extensionsWorkbenchService.i18n.json index c1970bf6a0..bb93c90fcd 100644 --- a/i18n/rus/src/vs/workbench/parts/extensions/node/extensionsWorkbenchService.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/extensions/node/extensionsWorkbenchService.i18n.json @@ -10,12 +10,12 @@ "malicious": "Это расширение помечено как проблемное.", "installingMarketPlaceExtension": "Установка расширения из Marketplace...", "uninstallingExtension": "Удаление расширения...", - "enableDependeciesConfirmation": "При включении \"{0}\" также будут включены его зависимости. Вы действительно хотите продолжить?", + "enableDependeciesConfirmation": "При включении расширения также будут включены его зависимости. Вы действительно хотите продолжить?", "enable": "Да", "doNotEnable": "Нет", - "disableDependeciesConfirmation": "Отключить только \"{0}\" или вместе с зависимостями?", - "disableOnly": "Только", - "disableAll": "Все", + "disableDependeciesConfirmation": "Вы хотели бы также отключить зависимости расширения?", + "yes": "Да", + "no": "Нет", "cancel": "Отмена", "singleDependentError": "Невозможно отключить расширение \"{0}\". От него зависит расширение \"{1}\".", "twoDependentsError": "Невозможно отключить расширение \"{0}\". От него зависят расширения \"{1}\" и \"{2}\".", diff --git a/i18n/rus/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.i18n.json b/i18n/rus/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.i18n.json index d5124404f9..92e148db1b 100644 --- a/i18n/rus/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.i18n.json @@ -7,6 +7,7 @@ "Do not edit this file. It is machine generated." ], "updateLocale": "Вы хотели бы изменить язык пользовательского интерфейса VS Code на {0} и перезапустить VS Code?", + "activateLanguagePack": "Вы хотите перезапустить VS Code, чтобы активировать установленный языковой пакет?", "yes": "Да", "no": "Нет", "neverAgain": "Больше не показывать", diff --git a/i18n/rus/src/vs/workbench/parts/localizations/electron-browser/localizationsActions.i18n.json b/i18n/rus/src/vs/workbench/parts/localizations/electron-browser/localizationsActions.i18n.json index d4a882b6b2..aa48aa0a26 100644 --- a/i18n/rus/src/vs/workbench/parts/localizations/electron-browser/localizationsActions.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/localizations/electron-browser/localizationsActions.i18n.json @@ -6,7 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "configureLocale": "Настроить язык", + "configureLocale": "Настройка языка интерфейса", "displayLanguage": "Определяет язык интерфейса VSCode.", "doc": "Список поддерживаемых языков см. в {0}.", "restart": "Для изменения значения требуется перезапуск VSCode.", diff --git a/i18n/rus/src/vs/workbench/parts/outline/electron-browser/outline.contribution.i18n.json b/i18n/rus/src/vs/workbench/parts/outline/electron-browser/outline.contribution.i18n.json new file mode 100644 index 0000000000..1580bc9dbc --- /dev/null +++ b/i18n/rus/src/vs/workbench/parts/outline/electron-browser/outline.contribution.i18n.json @@ -0,0 +1,12 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "name": "Структура", + "category.focus": "Файл", + "label.focus": "Фокус на структуре" +} \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/outline/electron-browser/outlinePanel.i18n.json b/i18n/rus/src/vs/workbench/parts/outline/electron-browser/outlinePanel.i18n.json new file mode 100644 index 0000000000..b3e074126f --- /dev/null +++ b/i18n/rus/src/vs/workbench/parts/outline/electron-browser/outlinePanel.i18n.json @@ -0,0 +1,17 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "filter": "Фильтр", + "collapse": "Свернуть все", + "sortByPosition": "Сортировать по: положение", + "sortByName": "Сортировать по: название", + "sortByKind": "Сортировать по: тип", + "live": "Следовать за курсором", + "no-editor": "Отсутствуют открытые редакторы, которые могут предоставить сведения о структуре.", + "too-many-symbols": "Этот файл имеет слишком большой размер для отображения структуры. Приносим свои извинения." +} \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/outline/electron-browser/outlineTree.i18n.json b/i18n/rus/src/vs/workbench/parts/outline/electron-browser/outlineTree.i18n.json new file mode 100644 index 0000000000..575278452f --- /dev/null +++ b/i18n/rus/src/vs/workbench/parts/outline/electron-browser/outlineTree.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "outline.title": "строка {0} в {1}" +} \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/output/browser/outputPanel.i18n.json b/i18n/rus/src/vs/workbench/parts/output/browser/outputPanel.i18n.json index 8758767544..51828c94c2 100644 --- a/i18n/rus/src/vs/workbench/parts/output/browser/outputPanel.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/output/browser/outputPanel.i18n.json @@ -6,6 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "output": "Вывод", "outputPanelWithInputAriaLabel": "{0}, панель выходных данных", "outputPanelAriaLabel": "Панель выходных данных" } \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/preferences/browser/keybindingWidgets.i18n.json b/i18n/rus/src/vs/workbench/parts/preferences/browser/keybindingWidgets.i18n.json index 90245489ed..4c63ca24aa 100644 --- a/i18n/rus/src/vs/workbench/parts/preferences/browser/keybindingWidgets.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/preferences/browser/keybindingWidgets.i18n.json @@ -6,6 +6,8 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "defineKeybinding.oneExists": "Это сочетание клавиш назначено одной имеющейся команде", + "defineKeybinding.existing": "Это сочетание клавиш назначено нескольким имеющимся командам ({0}}", "defineKeybinding.initial": "Нажмите нужное сочетание клавиш, а затем клавишу ВВОД.", "defineKeybinding.chordsTo": "Аккорд для" } \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json b/i18n/rus/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json index 27ac035bad..92441ea284 100644 --- a/i18n/rus/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json @@ -7,6 +7,7 @@ "Do not edit this file. It is machine generated." ], "openRawDefaultSettings": "Открыть исходные параметры по умолчанию", + "openSettings2": "Открыть параметры (предварительная версия)", "openSettings": "Открыть параметры", "openGlobalSettings": "Открыть пользовательские параметры", "openGlobalKeybindings": "Открыть сочетания клавиш", diff --git a/i18n/rus/src/vs/workbench/parts/preferences/browser/settingsEditor2.i18n.json b/i18n/rus/src/vs/workbench/parts/preferences/browser/settingsEditor2.i18n.json new file mode 100644 index 0000000000..d65409a7c4 --- /dev/null +++ b/i18n/rus/src/vs/workbench/parts/preferences/browser/settingsEditor2.i18n.json @@ -0,0 +1,18 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "previewWarning": "Предварительная версия", + "previewLabel": "Это предварительная версия нашего нового редактора параметров", + "SearchSettings.AriaLabel": "Параметры поиска", + "SearchSettings.Placeholder": "Параметры поиска", + "advancedCustomizationLabel": "Для использования расширенных настроек откройте и измените", + "openSettingsLabel": "settings.json", + "showOverriddenOnly": "Отображать только измененные", + "treeAriaLabel": "Параметры", + "feedbackButtonLabel": "Оставить отзыв" +} \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/preferences/browser/settingsTree.i18n.json b/i18n/rus/src/vs/workbench/parts/preferences/browser/settingsTree.i18n.json new file mode 100644 index 0000000000..4585a186d1 --- /dev/null +++ b/i18n/rus/src/vs/workbench/parts/preferences/browser/settingsTree.i18n.json @@ -0,0 +1,19 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "modifiedItemForeground": "Цвет переднего плана для измененного параметра.", + "workspace": "Рабочая область", + "user": "Пользователь", + "resetButtonTitle": "сбросить", + "configured": "Изменено", + "alsoConfiguredIn": "Также изменен в", + "configuredIn": "Изменен в", + "editInSettingsJson": "Изменить в settings.json", + "settingRowAriaLabel": "{0} {1}, параметр", + "groupRowAriaLabel": "{0}, группа" +} \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/preferences/electron-browser/preferences.contribution.i18n.json b/i18n/rus/src/vs/workbench/parts/preferences/electron-browser/preferences.contribution.i18n.json index b38bd2e52a..af39f57bad 100644 --- a/i18n/rus/src/vs/workbench/parts/preferences/electron-browser/preferences.contribution.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/preferences/electron-browser/preferences.contribution.i18n.json @@ -7,6 +7,7 @@ "Do not edit this file. It is machine generated." ], "defaultPreferencesEditor": "Редактор настроек по умолчанию", + "settingsEditor2": "Редактор параметров 2", "keybindingsEditor": "Редактор настраиваемых сочетаний клавиш", "preferences": "Параметры" } \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/search/browser/searchActions.i18n.json b/i18n/rus/src/vs/workbench/parts/search/browser/searchActions.i18n.json index 26408e3a23..83ec7680a5 100644 --- a/i18n/rus/src/vs/workbench/parts/search/browser/searchActions.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/search/browser/searchActions.i18n.json @@ -12,6 +12,8 @@ "previousSearchExcludePattern": "Показать предыдущий шаблон исключения из поиска", "nextSearchTerm": "Показать следующее условие поиска", "previousSearchTerm": "Показать предыдущее условие поиска", + "nextReplaceTerm": "Показать следующее условие поиска и замены", + "previousReplaceTerm": "Показать предыдущее условие поиска и замены", "findInFiles": "Найти в файлах", "replaceInFiles": "Заменить в файлах", "RefreshAction.label": "Обновить", diff --git a/i18n/rus/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json b/i18n/rus/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json index 90e23af847..113d804b27 100644 --- a/i18n/rus/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json @@ -31,5 +31,5 @@ "search.followSymlinks": "Определяет, нужно ли следовать символическим ссылкам при поиске.", "search.smartCase": "Выполняет поиск без учета регистра, если шаблон состоит только из букв нижнего регистра; в противном случае выполняет поиск с учетом регистра", "search.globalFindClipboard": "Определяет, должно ли представление поиска считывать или изменять общий буфер обмена поиска в macOS", - "search.location": "Управляет тем, будет ли панель поиска отображаться в виде представления в боковой колонке или в виде панели в области панели для освобождения пространства по горизонтали. В следующем выпуске горизонтальное расположение поиска в панели будет улучшено, и этот параметр больше не будет находиться в предварительной версии." + "search.location": "Управляет тем, будет ли панель поиска отображаться в виде представления в боковой колонке или в виде панели в области панели, чтобы освободить пространство по горизонтали." } \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/tasks/electron-browser/jsonSchema_v2.i18n.json b/i18n/rus/src/vs/workbench/parts/tasks/electron-browser/jsonSchema_v2.i18n.json index aa9e0dcee8..666308fc14 100644 --- a/i18n/rus/src/vs/workbench/parts/tasks/electron-browser/jsonSchema_v2.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/tasks/electron-browser/jsonSchema_v2.i18n.json @@ -28,6 +28,7 @@ "JsonSchema.tasks.group.none": "Отменяет связь задачи со всеми группами", "JsonSchema.tasks.group": "Определяет, к какой группе выполнения принадлежит эта задача. Поддерживаемые значения: \"build\" для добавления задачи к группе сборки и \"test\" для добавления задачи к группе тестирования.", "JsonSchema.tasks.type": "Определяет, выполняется ли задача в виде процесса или в виде команды оболочки.", + "JsonSchema.commandArray": "Команда оболочки, которая будет выполнена. Элементы массива будут объединены с помощью пробела", "JsonSchema.command.quotedString.value": "Фактическое значение команды", "JsonSchema.tasks.quoting.escape": "Экранирует символы с помощью escape-символа оболочки (например, \"`\" в PowerShell и\"\\\" в bash).", "JsonSchema.tasks.quoting.strong": "Заключает аргумент в кавычки с использованием символа двойной кавычки (например, \" в PowerShell и bash).", diff --git a/i18n/rus/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.i18n.json b/i18n/rus/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.i18n.json index 1d8df17853..ea044a5684 100644 --- a/i18n/rus/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.i18n.json @@ -19,6 +19,7 @@ "terminal.integrated.copyOnSelection": "Если задано, текст выделенный в терминале будет скопирован в буфер обмена", "terminal.integrated.fontFamily": "Определяет семейство шрифтов терминала, значение по умолчанию — editor.fontFamily.", "terminal.integrated.fontSize": "Определяет размер шрифта (в пикселях) для терминала.", + "terminal.integrated.letterSpacing": "Управляет межсимвольным интервалом в терминале. Это целочисленное значение, которое представляет собой количество дополнительных пикселей между символами.", "terminal.integrated.lineHeight": "Определяет высоту строки терминала; это число умножается на размер шрифта терминала, что дает фактическую высоту строки в пикселях.", "terminal.integrated.fontWeight": "Размер шрифта в терминале для нежирного текста.", "terminal.integrated.fontWeightBold": "Размер шрифта в терминале для полужирного текста. ", @@ -26,7 +27,8 @@ "terminal.integrated.cursorStyle": "Определяет стиль курсора терминала.", "terminal.integrated.scrollback": "Определяет предельное число строк в буфере терминала.", "terminal.integrated.setLocaleVariables": "Управляет заданием переменных при запуске терминала, значение по умолчанию: \"True\" для OS X и \"False\" для других платформ.", - "terminal.integrated.rightClickBehavior": "Управляет тем, как терминал реагирует на щелчок правой кнопкой мыши. Возможные значения: 'default', 'copyPaste' и 'selectWord'. При выборе варианта 'default' будет показано контекстное меню, при выборе варианта 'copyPaste' выделенный текст будет скопирован, а при отсутствии выделенного текста - вставлен, при выборе варианта 'selectWord' будет выбрано слово, над которым находится курсор, и показано контекстное меню.", + "terminal.integrated.rendererType": "Управляет отображением терминала. Допустимые значения: \"canvas\" (использование стандартного быстрого модуля отображения на основе холста), \"dom\" (использование резервного модуля отображения на основе DOM) и \"auto\" (модуль отображения определяется средой VS Code). После изменения этого параметра необходимо перезапустить VS, чтобы изменения вступили в силу.", + "terminal.integrated.rightClickBehavior": "Управляет тем, как терминал реагирует на щелчок правой кнопкой мыши. Возможные значения: \"default\", \"copyPaste\" и \"selectWord\". При выборе варианта \"default\" будет отображаться контекстное меню, при выборе варианта \"copyPaste\" выделенный текст будет скопирован, а при отсутствии выделенного текста – вставлен, при выборе варианта \"selectWord\" будет выбрано слово, над которым находится курсор, и будет отображено контекстное меню.", "terminal.integrated.cwd": "Путь явного запуска, по которому будет запущен терминал. Используется в качестве текущего рабочего каталога (cwd) для процесса оболочки. Это может быть особенно удобно в параметрах рабочей области, если корневой каталог не является подходящим каталогом cwd.", "terminal.integrated.confirmOnExit": "Указывает, следует ли при выходе выводить подтверждение об имеющихся активных сеансах терминала.", "terminal.integrated.enableBell": "Определяет, включен ли \"звонок\" терминала.", diff --git a/i18n/rus/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json b/i18n/rus/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json index 73aa5a7d0b..ea0d455fc7 100644 --- a/i18n/rus/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json @@ -57,5 +57,7 @@ "workbench.action.terminal.scrollToPreviousCommand": "Перейти к предыдущей команде", "workbench.action.terminal.scrollToNextCommand": "Перейти к следующей команде", "workbench.action.terminal.selectToPreviousCommand": "Выбрать предыдущую команду", - "workbench.action.terminal.selectToNextCommand": "Выбрать следующую команду" + "workbench.action.terminal.selectToNextCommand": "Выбрать следующую команду", + "workbench.action.terminal.selectToPreviousLine": "Выделить текст до предыдущей строки", + "workbench.action.terminal.selectToNextLine": "Выделить текст до следующей строки" } \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.i18n.json b/i18n/rus/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.i18n.json index f96a099bc5..ff481cfdd8 100644 --- a/i18n/rus/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.i18n.json @@ -9,6 +9,11 @@ "terminal.integrated.a11yBlankLine": "Пустая строка", "terminal.integrated.a11yPromptLabel": "Ввод терминала", "terminal.integrated.a11yTooMuchOutput": "Объем выходных данных слишком велик для создания оповещения; проверьте строки вручную", + "yes": "Да", + "terminal.rendererInAllNewTerminals": "Во всех созданных терминалах будет использоваться модуль отображения, не связанный с GPU.", + "no": "Нет", + "dontShowAgain": "Больше не показывать", + "terminal.slowRendering": "Стандартный модуль отображения для встроенного терминала работает медленно. Вы хотите переключиться на альтернативный модуль отображения на основе DOM, который может повысить производительность? [Дополнительные сведения о параметрах терминала](https://code.visualstudio.com/docs/editor/integrated-terminal#_changing-how-the-terminal-is-rendered).", "terminal.integrated.copySelection.noSelection": "В терминале отсутствует выделенный текст для копирования", "terminal.integrated.exitedWithCode": "Процесс терминала завершен с кодом выхода: {0}", "terminal.integrated.waitOnExit": "Нажмите любую клавишу, чтобы закрыть терминал.", diff --git a/i18n/rus/src/vs/workbench/parts/terminal/electron-browser/terminalPanel.i18n.json b/i18n/rus/src/vs/workbench/parts/terminal/electron-browser/terminalPanel.i18n.json index 757a34d7ee..5134ea91bd 100644 --- a/i18n/rus/src/vs/workbench/parts/terminal/electron-browser/terminalPanel.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/terminal/electron-browser/terminalPanel.i18n.json @@ -6,6 +6,8 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "terminal.useMonospace": "Использовать моноширинные шрифты", + "terminal.monospaceOnly": "Этот терминал поддерживает только моноширинные шрифты.", "copy": "Копировать", "split": "Разделить", "paste": "Вставить", diff --git a/i18n/rus/src/vs/workbench/parts/trust/electron-browser/unsupportedWorkspaceSettings.contribution.i18n.json b/i18n/rus/src/vs/workbench/parts/trust/electron-browser/unsupportedWorkspaceSettings.contribution.i18n.json index bb2052c5cc..3bc58ea6cd 100644 --- a/i18n/rus/src/vs/workbench/parts/trust/electron-browser/unsupportedWorkspaceSettings.contribution.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/trust/electron-browser/unsupportedWorkspaceSettings.contribution.i18n.json @@ -6,7 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "unsupportedWorkspaceSettings": "Эта рабочая область содержит параметры, которые можно задать только в параметрах пользователя. ({0}) Дополнительные сведения см. [здесь]({1}).", "openWorkspaceSettings": "Открыть параметры рабочей области", "dontShowAgain": "Больше не показывать", "unsupportedWorkspaceSettings": "Эта рабочая область содержит параметры, которые можно задать только в параметрах пользователя. ({0}) Дополнительные сведения см. [здесь]({1})." diff --git a/i18n/rus/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThrough.contribution.i18n.json b/i18n/rus/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThrough.contribution.i18n.json index 4e3bb29b2c..67ca28ab71 100644 --- a/i18n/rus/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThrough.contribution.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThrough.contribution.i18n.json @@ -7,6 +7,5 @@ "Do not edit this file. It is machine generated." ], "walkThrough.editor.label": "Интерактивная площадка", - "help": "Справка", - "interactivePlayground": "Интерактивная площадка" + "help": "Справка" } \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/services/bulkEdit/electron-browser/bulkEditService.i18n.json b/i18n/rus/src/vs/workbench/services/bulkEdit/electron-browser/bulkEditService.i18n.json new file mode 100644 index 0000000000..a2b4834bea --- /dev/null +++ b/i18n/rus/src/vs/workbench/services/bulkEdit/electron-browser/bulkEditService.i18n.json @@ -0,0 +1,13 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "summary.0": "Нет изменений", + "summary.nm": "Сделано изменений {0} в {1} файлах", + "summary.n0": "Сделано изменений {0} в одном файле", + "conflict": "Следующие файлы были изменены: {0}" +} \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/services/configuration/common/configurationExtensionPoint.i18n.json b/i18n/rus/src/vs/workbench/services/configuration/common/configurationExtensionPoint.i18n.json index a09bcd64b7..2e2f360041 100644 --- a/i18n/rus/src/vs/workbench/services/configuration/common/configurationExtensionPoint.i18n.json +++ b/i18n/rus/src/vs/workbench/services/configuration/common/configurationExtensionPoint.i18n.json @@ -16,6 +16,7 @@ "vscode.extension.contributes.configuration": "Добавляет параметры конфигурации.", "invalid.title": "configuration.title должно быть строкой", "invalid.properties": "configuration.properties должно быть объектом", + "invalid.property": "Параметр 'configuration.property' должен быть объектом", "invalid.allOf": "Параметр 'configuration.allOf' является устаревшим, и использовать его не рекомендуется. Вместо этого передайте несколько параметров в виде массива в точку вклада 'configuration'.", "workspaceConfig.folders.description": "Список папок, которые будут загружены в рабочую область.", "workspaceConfig.path.description": "Путь к файлу, например, \"/root/folderA\" или \"./folderA\" для пути по отношению к файлу рабочей области.", diff --git a/i18n/rus/src/vs/workbench/services/configurationResolver/electron-browser/configurationResolverService.i18n.json b/i18n/rus/src/vs/workbench/services/configurationResolver/electron-browser/configurationResolverService.i18n.json index 35229bd669..200628838f 100644 --- a/i18n/rus/src/vs/workbench/services/configurationResolver/electron-browser/configurationResolverService.i18n.json +++ b/i18n/rus/src/vs/workbench/services/configurationResolver/electron-browser/configurationResolverService.i18n.json @@ -5,5 +5,6 @@ "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." - ] + ], + "stringsOnlySupported": "Команда {0} не возвратила строку. Команды, используемые для замены переменных, могут возвращать только строковые значения." } \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/services/files/electron-browser/remoteFileService.i18n.json b/i18n/rus/src/vs/workbench/services/files/electron-browser/remoteFileService.i18n.json index 21140f4d50..d6dddbb30d 100644 --- a/i18n/rus/src/vs/workbench/services/files/electron-browser/remoteFileService.i18n.json +++ b/i18n/rus/src/vs/workbench/services/files/electron-browser/remoteFileService.i18n.json @@ -6,6 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "invalidPath": "Путь к ресурсу '{0}' должен быть абсолютным", "fileNotFoundError": "Файл не найден ({0})", "fileIsDirectoryError": "Файл является каталогом", "fileNotModifiedError": "undefined", diff --git a/i18n/rus/src/vs/workbench/services/themes/common/fileIconThemeSchema.i18n.json b/i18n/rus/src/vs/workbench/services/themes/common/fileIconThemeSchema.i18n.json index e8e74238e7..ac1d7b964d 100644 --- a/i18n/rus/src/vs/workbench/services/themes/common/fileIconThemeSchema.i18n.json +++ b/i18n/rus/src/vs/workbench/services/themes/common/fileIconThemeSchema.i18n.json @@ -21,7 +21,7 @@ "schema.languageId": "Идентификатор определения значка для сопоставления.", "schema.fonts": "Шрифты, используемые в определениях значков.", "schema.id": "Идентификатор шрифта.", - "schema.src": "Расположения шрифта.", + "schema.src": "Расположение шрифта.", "schema.font-path": "Путь к шрифту относительно текущего файла темы значка.", "schema.font-format": "Формат шрифта.", "schema.font-weight": "Насыщенность шрифта.", diff --git a/i18n/trk/extensions/configuration-editing/out/extension.i18n.json b/i18n/trk/extensions/configuration-editing/out/extension.i18n.json index 74b97dd40f..1f79bc867a 100644 --- a/i18n/trk/extensions/configuration-editing/out/extension.i18n.json +++ b/i18n/trk/extensions/configuration-editing/out/extension.i18n.json @@ -6,5 +6,16 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "workspaceFolder": "VS Code'da açık olan klasörün yolu", + "workspaceFolderBasename": "VS Code'da açık olan klasörün hiçbir eğik çizgi (/) içermeyen yolu", + "relativeFile": "Şu an açık olan dosyanın ${workspaceFolder} klasörüne göreli yolu", + "file": "Şu an açık olan dosya", + "cwd": "Görev çalıştırıcısının şu an geçerli olan başlangıçtaki çalışma dizini", + "lineNumber": "Aktif dosyadaki şu an seçili olan satır numarası", + "selectedText": "Aktif dosyadaki şu an seçili metin", + "fileDirname": "Şu an açık olan dosyanın bulunduğu dizinin adı", + "fileExtname": "Şu an açık olan dosyanın uzantısı", + "fileBasename": "Şu an açık olan dosyanın adı", + "fileBasenameNoExtension": "Şu an açık olan dosyanın uzantı içermeyen adı", "exampleExtension": "Örnek" } \ No newline at end of file diff --git a/i18n/trk/extensions/emmet/package.i18n.json b/i18n/trk/extensions/emmet/package.i18n.json index b25d2ee3ad..da0ca75d8c 100644 --- a/i18n/trk/extensions/emmet/package.i18n.json +++ b/i18n/trk/extensions/emmet/package.i18n.json @@ -2,7 +2,7 @@ "": [ "--------------------------------------------------------------------------------------------", "Copyright (c) Microsoft Corporation. All rights reserved.", - "Licensed under the Source EULA. See License.txt in the project root for license information.", + "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], @@ -48,10 +48,10 @@ "emmetPreferencesSassBetween": "Sass dosyalarında CSS kısaltmaları genişletilirken CSS özelliği ve değerinin arasına koyulacak sembol", "emmetPreferencesStylusBetween": "Stylus dosyalarında CSS kısaltmaları genişletilirken CSS özelliği ve değerinin arasına koyulacak sembol", "emmetShowSuggestionsAsSnippets": "Doğruysa, Emmet önerileri, editor.snippetSuggestions ayarı ile sıralayabilmenizi sağlayan parçacıklar olarak gösterilir.", - "emmetPreferencesBemElementSeparator": "BEM filtresi kullanırken sınıflar için kullanılacak öğe ayrıcı", + "emmetPreferencesBemElementSeparator": "BEM filtresi kullanırken sınıflar için kullanılacak öge ayrıcı", "emmetPreferencesBemModifierSeparator": "BEM filtresi kullanırken sınıflar için kullanılacak niteleyici ayrıcı", - "emmetPreferencesFilterCommentBefore": "Yorum filtresi uygulandığında eşleşen öğenin önüne yerleştirilmesi gereken yorumun tanımı.", - "emmetPreferencesFilterCommentAfter": "Yorum filtresi uygulandığında eşleşen öğenin ardına yerleştirilmesi gereken yorumun tanımı.", + "emmetPreferencesFilterCommentBefore": "Yorum filtresi uygulandığında eşleşen ögenin önüne konulması gereken yorumun tanımı.", + "emmetPreferencesFilterCommentAfter": "Yorum filtresi uygulandığında eşleşen ögenin ardına konulması gereken yorumun tanımı.", "emmetPreferencesFilterCommentTrigger": "Yorum filterinin uygulanması için kısaltmada bulunması gereken virgülle ayrılmış öznitelik adları listesi", "emmetPreferencesFormatNoIndentTags": "İçe girintilenmemesi gereken bir etiket adları dizisi", "emmetPreferencesFormatForceIndentTags": "Her zaman içe girintilenmesi gereken bir etiket adları dizisi", diff --git a/i18n/trk/extensions/git/out/commands.i18n.json b/i18n/trk/extensions/git/out/commands.i18n.json index 114eaf858a..6794dc4934 100644 --- a/i18n/trk/extensions/git/out/commands.i18n.json +++ b/i18n/trk/extensions/git/out/commands.i18n.json @@ -2,7 +2,7 @@ "": [ "--------------------------------------------------------------------------------------------", "Copyright (c) Microsoft Corporation. All rights reserved.", - "Licensed under the Source EULA. See License.txt in the project root for license information.", + "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], @@ -10,10 +10,12 @@ "remote branch at": "{0} üzerindeki uzak dal", "create branch": "$(plus) Yeni dal oluştur", "repourl": "Depo URL'si", - "parent": "Üst Klasör", + "selectFolder": "Depo Konumunu Seç", "cloning": "'{0}' git deposu kopyalanıyor...", - "openrepo": "Depoyu Aç", "proposeopen": "Kopyalanan depoyu açmak ister misiniz?", + "openrepo": "Depoyu Aç", + "add": "Çalışma Alanına Ekle", + "proposeopen2": "Kopyalanan depoyu açmak veya geçerli çalışma alanına eklemek ister misiniz?", "init": "Git deposunun oluşturulacağı çalışma alanı klasörünü seçin", "init repo": "Depo Oluştur", "create repo": "Depo Oluştur", diff --git a/i18n/trk/extensions/npm/out/npmView.i18n.json b/i18n/trk/extensions/npm/out/npmView.i18n.json index a032c07941..88033f3227 100644 --- a/i18n/trk/extensions/npm/out/npmView.i18n.json +++ b/i18n/trk/extensions/npm/out/npmView.i18n.json @@ -6,6 +6,9 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "npm.noDebugOptions": "Betiklerde node hata ayıklama seçeneği(ör. \"--inspect-brk\") eksik olduğundan hata ayıklamak için \"{0}\" başlatılamadı.", - "npm.scriptInvalid": "\"{0}\" betik dosyası bulunamadı. Görünümü yenilemeyi deneyin." + "noScripts": "Betik bulunamadı", + "noDebugOptions": "Betiklerde node hata ayıklama seçeneği(ör. \"--inspect-brk\") eksik olduğundan hata ayıklamak için \"{0}\" başlatılamadı.", + "learnMore": "Daha Fazla Bilgi Edin", + "ok": "Tamam", + "scriptInvalid": "\"{0}\" betik dosyası bulunamadı. Görünümü yenilemeyi deneyin." } \ No newline at end of file diff --git a/i18n/trk/extensions/npm/package.i18n.json b/i18n/trk/extensions/npm/package.i18n.json index b1dbbb9d92..2139346855 100644 --- a/i18n/trk/extensions/npm/package.i18n.json +++ b/i18n/trk/extensions/npm/package.i18n.json @@ -12,15 +12,15 @@ "config.npm.runSilent": "npm komutlarını `--silent`(sessiz) seçeneğiyle çalıştır.", "config.npm.packageManager": "Betikleri çalıştırmada kullanılacak paket yöneticisi.", "config.npm.exclude": "Otomatik betik algılamadan hariç tutulacak klasörler için glob desenlerini yapılandırın.", - "config.npm.enableScriptExplorer": "Çalışma alanı bir 'package.json' dosyası içerdiğinde, npm betikleri için gezgin görünümünü etkinleştir.", + "config.npm.enableScriptExplorer": "npm betikleri için gezgin görünümünü etkinleştir.", + "config.npm.scriptExplorerAction": "Betik gezgininde kullanılan varsayılan tıklama eylemi: 'open' (aç) veya 'run' (çalıştır), varsayılan 'open'dır.", "npm.parseError": "Npm görev algılama: {0} dosyası ayrıştırılamadı", "taskdef.script": "Özelleştirilecek npm betiği.", "taskdef.path": "Betiği sağlayan package.json dosyasını içeren klasör yolu. Atlanabilir.", "view.name": "Npm Betikleri", "command.refresh": "Yenile", "command.run": "Çalıştır", - "command.debug": "Hata Ayıklama", + "command.debug": "Hata Ayıkla", "command.openScript": "Aç", - "npm.scriptInvalid": "'{0}' betik dosyası bulunamadı. Görünümü yenilemeyi deneyin.", - "npm.noDebugOptions": "Betiklerde node hata ayıklama seçeneği(ör. '--inspect-brk') eksik olduğundan hata ayıklamak için '{0}' başlatılamadı." + "command.runInstall": "Kurulumu Çalıştır" } \ No newline at end of file diff --git a/i18n/trk/extensions/search-rg/package.i18n.json b/i18n/trk/extensions/search-rg/package.i18n.json new file mode 100644 index 0000000000..9cf48637cb --- /dev/null +++ b/i18n/trk/extensions/search-rg/package.i18n.json @@ -0,0 +1,11 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "displayName": "Ara (ripgrep)", + "description": "Ripgrep kullanarak aramayı sağlar." +} \ No newline at end of file diff --git a/i18n/trk/extensions/typescript-language-features/out/features/updatePathsOnRename.i18n.json b/i18n/trk/extensions/typescript-language-features/out/features/updatePathsOnRename.i18n.json new file mode 100644 index 0000000000..28226fe1ad --- /dev/null +++ b/i18n/trk/extensions/typescript-language-features/out/features/updatePathsOnRename.i18n.json @@ -0,0 +1,14 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "prompt": "Taşınan dosya için içe aktarımlar otomatik olarak güncellensin mi: '{0}'?", + "reject.title": "Hayır", + "accept.title": "Evet", + "always.title": "Evet, her zaman içe aktarımları güncelle", + "never.title": "Hayır, hiçbir zaman içe aktarımları güncelleme" +} \ No newline at end of file diff --git a/i18n/trk/extensions/typescript-language-features/package.i18n.json b/i18n/trk/extensions/typescript-language-features/package.i18n.json index 1adbd875cd..fd84f31341 100644 --- a/i18n/trk/extensions/typescript-language-features/package.i18n.json +++ b/i18n/trk/extensions/typescript-language-features/package.i18n.json @@ -8,8 +8,7 @@ ], "displayName": "TypeScript ve JavaScript Dili Özellikleri", "description": "JavaScript ve TypeScript için zengin dil desteği sağlar.", - "typescript.reloadProjects.title": "Projeyi Yeniden Yükle", - "javascript.reloadProjects.title": "Projeyi Yeniden Yükle", + "reloadProjects.title": "Projeyi Yeniden Yükle", "configuration.typescript": "TypeScript", "typescript.useCodeSnippetsOnMethodSuggest.dec": "İşlevleri parametre imzalarıyla tamamlayın.", "typescript.tsdk.desc": "Kullanılacak tsserver ve lib*.d.ts dosyalarını içeren klasör yolunu belirtir.", @@ -37,8 +36,7 @@ "format.placeOpenBraceOnNewLineForFunctions": "Fonksiyonlarda bir açılış ayracının yeni satıra koyulup koyulmayacağını tanımlar.", "format.placeOpenBraceOnNewLineForControlBlocks": "Kontrol bloklarında bir açılış ayracının yeni satıra koyulup koyulmayacağını tanımlar.", "javascript.validate.enable": "JavaScript doğrulamasını etkinleştir veya devre dışı bırak.", - "typescript.goToProjectConfig.title": "Proje Yapılandırmasına Git", - "javascript.goToProjectConfig.title": "Proje Yapılandırmasına Git", + "goToProjectConfig.title": "Proje Yapılandırmasına Git", "javascript.referencesCodeLens.enabled": "JavaScript dosyalarında başvuru kod objektifini etkinleştir veya devre dışı bırak.", "typescript.referencesCodeLens.enabled": "TypeScript dosyalarında başvuru kod objektifini etkinleştir veya devre dışı bırak. TypeScript >= 2.0.6 gerektirir.", "typescript.implementationsCodeLens.enabled": "Uygulama kod objektifini etkinleştir veya devre dışı bırak. TypeScript >= 2.2.0 gerektirir.", @@ -55,11 +53,15 @@ "typescript.problemMatchers.tsc.label": "TypeScript sorunları", "typescript.problemMatchers.tscWatch.label": "TypeScript sorunları (izleme modu)", "typescript.quickSuggestionsForPaths": "Bir içe aktarım yolu girerken hızlı önerileri etkinleştir/devre dışı bırak.", - "typescript.locale": "TypeScript hatalarını bildirirken kullanılarak dili(bölgeyi) ayarlar. TypeScript >= 2.6.0 gerektirir. 'null' varsayılanı, TypeScript hataları için VS Code'un dil(bölge) ayarlarını kullanır.", + "typescript.locale": "JavaScript ve TypeScript hatalarını bildirirken kullanılarak dili(bölgeyi) ayarlar. TypeScript >= 2.6.0 gerektirir. varsayılan değer 'null', VS Code'un dil(bölge) ayarlarını kullanır.", "javascript.implicitProjectConfig.experimentalDecorators": "Bir projenin parçası olmayan JavaScript dosyaları için deneysel dekoratörler ('experimentalDecorators') özelliğini etkinleştir veya devre dışı bırak. Mevcut jsconfig.json veya tsconfig.json dosyaları bu ayarı geçersiz kılar. TypeScript >= 2.3.1 gerektirir.", "typescript.autoImportSuggestions.enabled": "Otomatik içe aktarım önerilerini etkinleştir/devre dışı bırak. TypeScript >= 2.6.1 gerektirir.", "typescript.experimental.syntaxFolding": "Sözdimine duyarlı katlama işaretleyicilerini etkinleştirin/devre dışı bırakın.", "taskDefinition.tsconfig.description": "TS derlemesini tanımlayan tsconfig dosyası.", "javascript.suggestionActions.enabled": "Düzenleyicideki JavaScript dosyalarında öneri tanılamayı etkinleştir veya devre dışı bırak. TypeScript >= 2.8 gerektirir.", - "typescript.suggestionActions.enabled": "Düzenleyicideki TypeScript dosyalarında öneri tanılamayı etkinleştir veya devre dışı bırak. TypeScript >= 2.8 gerektirir." + "typescript.suggestionActions.enabled": "Düzenleyicideki TypeScript dosyalarında öneri tanılamayı etkinleştir veya devre dışı bırak. TypeScript >= 2.8 gerektirir.", + "typescript.preferences.quoteStyle": "Hızlı düzeltmeler için tercih edilen tırnak stili: Tek tırnak için 'single', çift tırnak için 'double', veya mevcut olan içe aktarımlardan tespit etmek için 'auto'. TypeScript >= 2.9 gerektirir.", + "typescript.preferences.importModuleSpecifier": "Otomatik içe aktaırmlar için tercih edilen yol stili:\n- \"relative\" dosya konumuna göreli yol.\n- \"non-relative\" 'jsconfig.json' / 'tsconfig.json' dosyanızda yapılandırdığınız 'baseUrl' ayarına göre yol.\n- \"auto\" en kısa yol türü.\nTypeScript >= 2.9 gerektirir.", + "typescript.showUnused": "Koddaki kullanılmayan değişkenlerin vurgulanmasını etkinleştir veya devre dışı bırak. TypeScript >= 2.9 gerektirir.", + "typescript.updateImportsOnFileMove.enabled": "VS Code'da bir dosyanın adını değiştirdiğinizde veya dosyayı taşıdığınızda içe aktarımların otomatik güncellenmesini etkinleştirin veya devre dışı bırakın. Olası değerler: tüm yeniden adlandırmalarda onay için 'prompt', her zaman yolların otomatik olarak güncellenmesi için 'always', yolların hiçbir zaman değişmemesi ve hiçbir zaman onay istenmemesi için 'never'. TypeScript >= 2.9 gerektirir." } \ No newline at end of file diff --git a/i18n/trk/src/vs/base/node/zip.i18n.json b/i18n/trk/src/vs/base/node/zip.i18n.json index 2e3412b9ed..d3dbd75d2e 100644 --- a/i18n/trk/src/vs/base/node/zip.i18n.json +++ b/i18n/trk/src/vs/base/node/zip.i18n.json @@ -2,10 +2,10 @@ "": [ "--------------------------------------------------------------------------------------------", "Copyright (c) Microsoft Corporation. All rights reserved.", - "Licensed under the Source EULA. See License.txt in the project root for license information.", + "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "incompleteExtract": "Tamamlanamadı. {1} girdiden {0} tanesi çıkarıldı", + "incompleteExtract": "Tamamlanmamış. {1} girdinin {0} tanesi bulundu. ", "notFound": "{0}, zip içerisinde bulunamadı." } \ No newline at end of file diff --git a/i18n/trk/src/vs/code/electron-browser/issue/issueReporterMain.i18n.json b/i18n/trk/src/vs/code/electron-browser/issue/issueReporterMain.i18n.json index b3174c22b7..1998afc436 100644 --- a/i18n/trk/src/vs/code/electron-browser/issue/issueReporterMain.i18n.json +++ b/i18n/trk/src/vs/code/electron-browser/issue/issueReporterMain.i18n.json @@ -6,6 +6,8 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "hide": "gizle", + "show": "göster", "previewOnGitHub": "GitHub'da Önizle", "loadingData": "Veri yükleniyor...", "rateLimited": "GitHub sorgu sınırı aşıldı. Lütfen bekleyin.", diff --git a/i18n/trk/src/vs/code/electron-browser/issue/issueReporterPage.i18n.json b/i18n/trk/src/vs/code/electron-browser/issue/issueReporterPage.i18n.json index e80a0b446f..cc635c3213 100644 --- a/i18n/trk/src/vs/code/electron-browser/issue/issueReporterPage.i18n.json +++ b/i18n/trk/src/vs/code/electron-browser/issue/issueReporterPage.i18n.json @@ -8,20 +8,21 @@ ], "completeInEnglish": "Lütfen formu İngilizce olarak doldurunuz.", "issueTypeLabel": "Bu bir", + "issueSourceLabel": "Dosya konumu: ", "vscode": "Visual Studio Code", "extension": "Eklenti", + "disableExtensionsLabelText": "Sorunu {0} sonrasında yeniden oluşturmaya çalışın. Sorun sadece eklentiler aktifken yeniden oluşturulabiliyorsa, büyük olasılıkla eklenti ile ilgili bir sorundur.", "disableExtensions": "tüm eklentileri devre dışı bırakıp pencereyi yeniden yükleyin", "chooseExtension": "Eklenti", "issueTitleLabel": "Başlık", "issueTitleRequired": "Lütfen bir başlık girin.", "titleLengthValidation": "Başlık çok uzun.", - "systemInfo": "Sistem Bilgilerim", - "sendData": "Verilerimi gönder", - "processes": "Şu Anda Çalışan İşlemler", - "workspaceStats": "Çalışma Alanı İstatistiklerim", - "extensions": "Eklentilerim", - "searchedExtensions": "Aranan Eklentiler", - "settingsSearchDetails": "Ayar Arama Detayları", "details": "Lütfen detayları giriniz.", - "loadingData": "Veri yükleniyor..." + "sendSystemInfo": "Sistem bilgilerimi dahil et ({0})", + "show": "göster", + "sendProcessInfo": "Şu anda çalışan işlemlerimi dahil et ({0})", + "sendWorkspaceInfo": "Çalışma alanımın meta verilerini dahil et ({0})", + "sendExtensions": " Aktif eklentilerimi dahil et ({0})", + "sendSearchedExtensions": "Aranan eklentileri gönder ({0})", + "sendSettingsSearchDetails": "Ayar arama detaylarını gönder ({0})" } \ No newline at end of file diff --git a/i18n/trk/src/vs/code/electron-browser/processExplorer/processExplorerMain.i18n.json b/i18n/trk/src/vs/code/electron-browser/processExplorer/processExplorerMain.i18n.json index 9e32cb61fb..3e8bfd40d9 100644 --- a/i18n/trk/src/vs/code/electron-browser/processExplorer/processExplorerMain.i18n.json +++ b/i18n/trk/src/vs/code/electron-browser/processExplorer/processExplorerMain.i18n.json @@ -11,5 +11,7 @@ "pid": "pid", "name": "Adı", "killProcess": "İşlemi Sonlandır", - "forceKillProcess": "İşlemi Sonlanmaya Zorla" + "forceKillProcess": "İşlemi Sonlanmaya Zorla", + "copy": "Kopyala", + "copyAll": "Tümünü Kopyala" } \ No newline at end of file diff --git a/i18n/trk/src/vs/code/electron-main/menus.i18n.json b/i18n/trk/src/vs/code/electron-main/menus.i18n.json index fc5e43d9d3..ac0e48c3cd 100644 --- a/i18n/trk/src/vs/code/electron-main/menus.i18n.json +++ b/i18n/trk/src/vs/code/electron-main/menus.i18n.json @@ -18,10 +18,10 @@ "miNewWindow": "Yeni &&Pencere", "mAbout": "{0} Hakkında", "mServices": "Hizmetler", - "mHide": "{0} öğesini gizle", + "mHide": "{0} ögesini gizle", "mHideOthers": "Diğerlerini Gizle", "mShowAll": "Tümünü Göster", - "miQuit": "{0} Öğesinden Çık", + "miQuit": "{0} Ögesinden Çık", "miNewFile": "&&Yeni Dosya", "miOpen": "&&Aç...", "miOpenWorkspace": "Ça&&lışma Alanı Aç...", @@ -88,7 +88,6 @@ "miToggleDebugConsole": "Hata &&Ayıklama Konsolu", "miToggleIntegratedTerminal": "Entegre &&Terminal", "miMarker": "S&&orunlar", - "miAdditionalViews": "&&Ek Görünümler", "miCommandPalette": "Komut &&Paleti...", "miOpenView": "&&Görünümü Aç...", "miToggleFullScreen": "Tam Ekra&&nı Aç/Kapat", @@ -144,7 +143,6 @@ "miContinue": "De&&vam Et", "miToggleBreakpoint": "Kesme &&Noktası Ekle/Kaldır", "miConditionalBreakpoint": "&&Koşullu Kesme Noktası...", - "miColumnBreakpoint": "&&Sütun Kesme Noktası", "miFunctionBreakpoint": "&&Fonksiyon Kesme Noktası", "miLogPoint": "&&Günlük Noktası...", "miNewBreakpoint": "&&Yeni Kesme Noktası", diff --git a/i18n/trk/src/vs/editor/browser/widget/codeEditorWidget.i18n.json b/i18n/trk/src/vs/editor/browser/widget/codeEditorWidget.i18n.json new file mode 100644 index 0000000000..782a6d9ff8 --- /dev/null +++ b/i18n/trk/src/vs/editor/browser/widget/codeEditorWidget.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "cursors.maximum": "İmleç sayısı {0} ile sınırlandırılmış durumda." +} \ No newline at end of file diff --git a/i18n/trk/src/vs/editor/common/config/commonEditorConfig.i18n.json b/i18n/trk/src/vs/editor/common/config/commonEditorConfig.i18n.json index b756815007..13cd502c7c 100644 --- a/i18n/trk/src/vs/editor/common/config/commonEditorConfig.i18n.json +++ b/i18n/trk/src/vs/editor/common/config/commonEditorConfig.i18n.json @@ -26,6 +26,7 @@ "detectIndentation": "Bir dosyayı açarken, `editor.tabSize` ve `editor.insertSpaces` dosya içeriğine bağlı olarak algılanır.", "roundedSelection": "Seçimlerin köşelerinin yuvarlak olup olmayacağını denetler", "scrollBeyondLastLine": "Düzenleyicinin son satırın ötesine ilerleyip ilerlemeyeceğini denetler", + "scrollBeyondLastColumn": "Düzenleyicinin yatay olarak kaydıracağına ek karakter sayısı", "smoothScrolling": "Düzenleyicinin bir animasyon kullanarak kaydırıp kaydırmayacağını denetler", "minimap.enabled": "Mini haritanın gösterilip gösterilmeyeceğini denetler", "minimap.side": "Mini haritanın görüntüleneceği tarafı denetler.", @@ -41,7 +42,7 @@ "wordWrap.bounded": "Satırlar en düşük görüntü alanı genişliğinde ve `editor.wordWrapColumn` değerinde bir sonraki satıra kaydırılacak.", "wordWrap": "Satırların bir sonraki satıra nasıl kaydırılacağını denetler. Seçenekler:\n - 'off' (kaydırmayı devre dışı bırak),\n - 'on' (görüntü alanında kaydır),\n - 'wordWrapColumn' (`editor.wordWrapColumn` değerinde kaydır) veya\n - 'bounded' (en düşük görüntü alanı genişliğinde ve `editor.wordWrapColumn` değerinde kaydır).", "wordWrapColumn": "`editor.wordWrap` ögesi, 'wordWrapColumn' veya 'bounded' iken düzenleyicinin kaydırma sütununu denetler.", - "wrappingIndent": "Kaydırılan satır girintisini denetler. 'none', 'same' veya 'indent' değerlerinden biri olabilir.", + "wrappingIndent": "Kaydırılan satır girintisini denetler. 'none', 'same', 'indent' veya 'deepIndent' değerlerinden biri olabilir.", "mouseWheelScrollSensitivity": "Fare tekerleği kaydırma olaylarında `deltaX` ve `deltaY` üzerinde kullanılan bir çarpan", "multiCursorModifier.ctrlCmd": "Windows ve Linux'da `Control` ve macOS'de `Command` ile eşleşir.", "multiCursorModifier.alt": "Windows ve Linux'da `Alt` ve macOS'de `Option` ile eşleşir.", diff --git a/i18n/trk/src/vs/editor/common/view/editorColorRegistry.i18n.json b/i18n/trk/src/vs/editor/common/view/editorColorRegistry.i18n.json index 30d2f3364e..a37177ea7b 100644 --- a/i18n/trk/src/vs/editor/common/view/editorColorRegistry.i18n.json +++ b/i18n/trk/src/vs/editor/common/view/editorColorRegistry.i18n.json @@ -32,6 +32,7 @@ "infoBorder": "Düzenleyicideki bilgilendirme karalamalarının kenarlık rengi.", "hintForeground": "Düzenleyicideki ipucu karalamalarının ön plan rengi.", "hintBorder": "Düzenleyicideki ipucu karalamalarının kenarlık rengi.", + "unnecessaryForeground": "Düzenleyicide gereksiz kodun ön plan rengi.", "overviewRulerRangeHighlight": "Aralık vurguları için genel bakış cetvelinin işaretleyici rengi. Altta yer alan süslemeleri gizlememek için renk opak olmamalıdır.", "overviewRuleError": "Hatalar için genel bakış cetvelinin işaretleyici rengi.", "overviewRuleWarning": "Uyarılar için genel bakış cetvelinin işaretleyici rengi.", diff --git a/i18n/trk/src/vs/editor/contrib/fontZoom/fontZoom.i18n.json b/i18n/trk/src/vs/editor/contrib/fontZoom/fontZoom.i18n.json new file mode 100644 index 0000000000..d3b04670fb --- /dev/null +++ b/i18n/trk/src/vs/editor/contrib/fontZoom/fontZoom.i18n.json @@ -0,0 +1,12 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "EditorFontZoomIn.label": "Editör Yazı Tipi Yakınlaştır", + "EditorFontZoomOut.label": "Editör Yazı Tipi Küçült", + "EditorFontZoomReset.label": "Editör Yazı Tipi Sıfırla" +} \ No newline at end of file diff --git a/i18n/trk/src/vs/editor/contrib/goToDefinition/goToDefinitionCommands.i18n.json b/i18n/trk/src/vs/editor/contrib/goToDefinition/goToDefinitionCommands.i18n.json new file mode 100644 index 0000000000..34c727b413 --- /dev/null +++ b/i18n/trk/src/vs/editor/contrib/goToDefinition/goToDefinitionCommands.i18n.json @@ -0,0 +1,25 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "noResultWord": "'{0}' için tanım bulunamadı", + "generic.noResults": "Tanım bulunamadı", + "meta.title": " – {0} tanım", + "actions.goToDecl.label": "Tanıma Git", + "actions.goToDeclToSide.label": "Tanımı Yana Aç", + "actions.previewDecl.label": "Tanıma Göz At", + "goToImplementation.noResultWord": "'{0}' için uygulama bulunamadı", + "goToImplementation.generic.noResults": "Uygulama bulunamadı", + "meta.implementations.title": " – {0} uygulama", + "actions.goToImplementation.label": "Uygulamaya Git", + "actions.peekImplementation.label": "Uygulamaya Göz At", + "goToTypeDefinition.noResultWord": "'{0}' için tür tanımı bulunamadı", + "goToTypeDefinition.generic.noResults": "Tür tanımı bulunamadı", + "meta.typeDefinitions.title": " – {0} tür tanımı", + "actions.goToTypeDefinition.label": "Tür Tanımına Git", + "actions.peekTypeDefinition.label": "Tür Tanımına Göz At" +} \ No newline at end of file diff --git a/i18n/trk/src/vs/editor/contrib/goToDefinition/goToDefinitionMouse.i18n.json b/i18n/trk/src/vs/editor/contrib/goToDefinition/goToDefinitionMouse.i18n.json new file mode 100644 index 0000000000..0fbfea46ae --- /dev/null +++ b/i18n/trk/src/vs/editor/contrib/goToDefinition/goToDefinitionMouse.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "multipleResults": "{0} tanımı göstermek için tıklayın." +} \ No newline at end of file diff --git a/i18n/trk/src/vs/editor/contrib/gotoError/gotoError.i18n.json b/i18n/trk/src/vs/editor/contrib/gotoError/gotoError.i18n.json index e4387458b0..15bf46370d 100644 --- a/i18n/trk/src/vs/editor/contrib/gotoError/gotoError.i18n.json +++ b/i18n/trk/src/vs/editor/contrib/gotoError/gotoError.i18n.json @@ -7,5 +7,7 @@ "Do not edit this file. It is machine generated." ], "markerAction.next.label": "Sonraki Soruna Git (Hata, Uyarı, Bilgi)", - "markerAction.previous.label": "Önceki Soruna Git (Hata, Uyarı, Bilgi)" + "markerAction.previous.label": "Önceki Soruna Git (Hata, Uyarı, Bilgi)", + "markerAction.nextInFiles.label": "Dosyalarda Sonraki Soruna Git (Hata, Uyarı, Bilgi)", + "markerAction.previousInFiles.label": "Dosyalarda Önceki Soruna Git (Hata, Uyarı, Bilgi)" } \ No newline at end of file diff --git a/i18n/trk/src/vs/editor/contrib/indentation/indentation.i18n.json b/i18n/trk/src/vs/editor/contrib/indentation/indentation.i18n.json index 7b4a62d3a7..37f095ef87 100644 --- a/i18n/trk/src/vs/editor/contrib/indentation/indentation.i18n.json +++ b/i18n/trk/src/vs/editor/contrib/indentation/indentation.i18n.json @@ -13,5 +13,6 @@ "indentUsingTabs": "Sekme Kullanarak Girintile", "indentUsingSpaces": "Boşluk Kullanarak Girintile", "detectIndentation": "Girintiyi, İçeriği Kontrol Ederek Algıla", - "editor.reindentlines": "Satır Girintilerini Yeniden Ayarla" + "editor.reindentlines": "Satır Girintilerini Yeniden Ayarla", + "editor.reindentselectedlines": "Seçili Satırların Girintilerini Yeniden Ayarla" } \ No newline at end of file diff --git a/i18n/trk/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json b/i18n/trk/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json index 281e824753..8beb681b33 100644 --- a/i18n/trk/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json +++ b/i18n/trk/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json @@ -25,8 +25,6 @@ "uninstallDependeciesConfirmation": "Yalnızca '{0}' eklentisini mi yoksa bağımlılıklarını da kaldırmak ister misiniz?", "uninstallOnly": "Sadece Eklenti", "uninstallAll": "Tümünü Kaldır", - "uninstallConfirmation": "'{0}' eklentisini kaldırmak istediğinizden emin misiniz?", - "ok": "Tamam", "singleDependentError": "'{0}' eklentisi kaldırılamıyor. '{1}' eklentisi buna bağlı.", "twoDependentsError": "'{0}' eklentisi kaldırılamıyor. '{1}' ve '{2}' eklentileri buna bağlı.", "multipleDependentsError": "'{0}' eklentisi kaldırılamıyor. '{1}, '{2}' eklentileri ve diğerleri buna bağlı.", diff --git a/i18n/trk/src/vs/platform/keybinding/common/abstractKeybindingService.i18n.json b/i18n/trk/src/vs/platform/keybinding/common/abstractKeybindingService.i18n.json index f14d52c128..da9795e7d9 100644 --- a/i18n/trk/src/vs/platform/keybinding/common/abstractKeybindingService.i18n.json +++ b/i18n/trk/src/vs/platform/keybinding/common/abstractKeybindingService.i18n.json @@ -6,6 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "first.chord": "({0}) öğesine basıldı. Akorun ikinci tuşu bekleniyor...", + "first.chord": "({0}) tuşuna basıldı. İkinci tuş bekleniyor...", "missing.chord": "({0}, {1}) tuş bileşimi bir komut değil." } \ No newline at end of file diff --git a/i18n/trk/src/vs/platform/node/minimalTranslations.i18n.json b/i18n/trk/src/vs/platform/node/minimalTranslations.i18n.json new file mode 100644 index 0000000000..210da6e06a --- /dev/null +++ b/i18n/trk/src/vs/platform/node/minimalTranslations.i18n.json @@ -0,0 +1,13 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "showLanguagePackExtensions": "VS Code {0} dilinde mevcuttur. Başlamak için Market'te dil paketlerini arayın.", + "searchMarketplace": "Marketi Ara", + "installAndRestartMessage": "VS Code {0} dilinde mevcuttur. Başlamak için dil paketini yükleyin. Yeniden başlatma gerektirir.", + "installAndRestart": "Yükle ve Yeniden Başlat" +} \ No newline at end of file diff --git a/i18n/trk/src/vs/platform/theme/common/colorRegistry.i18n.json b/i18n/trk/src/vs/platform/theme/common/colorRegistry.i18n.json index 46aedee276..fdc69c2c9e 100644 --- a/i18n/trk/src/vs/platform/theme/common/colorRegistry.i18n.json +++ b/i18n/trk/src/vs/platform/theme/common/colorRegistry.i18n.json @@ -2,7 +2,7 @@ "": [ "--------------------------------------------------------------------------------------------", "Copyright (c) Microsoft Corporation. All rights reserved.", - "Licensed under the Source EULA. See License.txt in the project root for license information.", + "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], @@ -16,7 +16,7 @@ "selectionBackground": "Çalışma ekranındaki metin seçimlerinin arka plan rengi(örneğin girdi alanları veya metin alanları). Bunun, düzenleyicideki seçimlere uygulanmayacağını unutmayın.", "textSeparatorForeground": "Metin ayırıcıların rengi.", "textLinkForeground": "Metindeki bağlantıların ön plan rengi.", - "textLinkActiveForeground": "Metindeki aktif bağlantıların ön plan rengi.", + "textLinkActiveForeground": "Tıklandığında ve fareyle üzerine gelindiğinde metinlerdeki bağlantılar için ön plan rengi.", "textPreformatForeground": "Önceden biçimlendirilmiş metin parçalarının ön plan rengi.", "textBlockQuoteBackground": "Metindeki alıntı bloklarının arka plan rengi.", "textBlockQuoteBorder": "Metindeki alıntı bloklarının kenarlık rengi.", @@ -48,6 +48,8 @@ "listDropBackground": "Fare ile ögeler taşınırken Liste/Ağaç sürükle ve bırak arka planı.", "highlight": "Liste/Ağaç içinde arama yaparken eşleşme vurgularının Liste/Ağaç ön plan rengi.", "invalidItemForeground": "Gezginde çözümlenmemiş bir kök klasör gibi geçersiz ögeler için Liste/Ağaç ön plan rengi.", + "listErrorForeground": "Hata içeren liste ögelerinin ön plan rengi.", + "listWarningForeground": "Uyarı içeren liste ögelerinin ön plan rengi.", "pickerGroupForeground": "Gruplama etiketleri için hızlı seçici rengi.", "pickerGroupBorder": "Gruplama kenarlıkları için hızlı seçici rengi.", "buttonForeground": "Buton ön plan rengi.", @@ -58,7 +60,7 @@ "scrollbarShadow": "Görünümün kaydırıldığını belirtmek için kaydırma çubuğu gölgesi.", "scrollbarSliderBackground": "Kaydırma çubuğu kaydıracının arka plan rengi.", "scrollbarSliderHoverBackground": "Fareyle üzerine gelindiğinde kaydırma çubuğu kaydıracının arka plan rengi.", - "scrollbarSliderActiveBackground": "Kaydırma çubuğu kaydıracının aktif iken arka plan rengi.", + "scrollbarSliderActiveBackground": "Tıklandığında kaydırma çubuğu kaydırıcısı arka plan rengi.", "progressBarBackground": "Uzun süren işlemleri gösterebilen ilerleme çubuğunun arka plan rengi.", "editorBackground": "Düzenleyici arka plan rengi.", "editorForeground": "Düzenleyici varsayılan ön plan rengi.", @@ -75,6 +77,7 @@ "editorFindMatchBorder": "Geçerli arama eşleşmesinin kenarlık rengi.", "findMatchHighlightBorder": "Diğer arama eşleşmelerinin kenarlık rengi.", "findRangeHighlightBorder": "Aramayı sınırlandıran aralığın kenarlık rengi. Altta yer alan süslemeleri gizlememek için renk opak olmamalıdır.", + "findWidgetResizeBorder": "Gereç bulmak için yeniden boyutlandırma çubuğunun kenarlık rengi.", "hoverHighlight": "Sözcüğün altında yer alan bağlantı vurgusu. Altta yer alan süslemeleri gizlememek için renk opak olmamalıdır.", "hoverBackground": "Düzenleyici bağlantı vurgusunun arka plan rengi.", "hoverBorder": "Düzenleyici bağlantı vurgusunun kenarlık rengi.", diff --git a/i18n/trk/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.i18n.json b/i18n/trk/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.i18n.json index 034d05ed9f..c4def8b43b 100644 --- a/i18n/trk/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.i18n.json +++ b/i18n/trk/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.i18n.json @@ -6,5 +6,5 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "confirmUrl": "{0} eklentisine aşağıdaki URL'i açması için izin vermek istiyor musunuz?" + "confirmUrl": "Bir uzantının bu URL'yi açmasına izin verilsin mi?" } \ No newline at end of file diff --git a/i18n/trk/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json b/i18n/trk/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json index 7253cd5ae1..b527b7de84 100644 --- a/i18n/trk/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json +++ b/i18n/trk/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json @@ -6,12 +6,14 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "vscode.extension.contributes.views.containers.id": "'views' (görünümler) ekleme noktası kullanılarak ekleme yapılabilecek görünümlerde, kapsayıcıyı tanımlamakta kullanılacak benzersiz ID", "vscode.extension.contributes.views.containers.title": "Kapsayıcıda gösterilecek insanlar tarafından okunabilir dize", - "vscode.extension.contributes.views.containers.icon": "Kapsayıcı simgesinin yolu. Simgeler, 50x40'lık bir dörtgen içinde 24x24 olarak ortalanmış ve 'rgb(215, 218, 224)' veya '#d7dae0' dolgu rengine sahiptir. Simgelerin SVG formatında olması tavsiye edilir ancak herhangi bir resim dosyası türü kabul edilir.", + "vscode.extension.contributes.views.containers.icon": "Kapsayıcı simgesinin yolu. Simgeler, 50x40'lık bir blok içinde 24x24 olarak ortalanmış ve 'rgb(215, 218, 224)' veya '#d7dae0' dolgu rengine sahiptir. Simgelerin SVG formatında olması tavsiye edilir ancak herhangi bir resim dosyası türü kabul edilir.", "vscode.extension.contributes.viewsContainers": "Görünüm kapsayıcılarını düzenleyiciye ekler.", "views.container.activitybar": "Etkinlik Çubuğu'na görünüm kapsayıcıları ekle", "test": "Test", "requirearray": "görünüm kapsayıcıları bir dizi olmalıdır", + "requireidstring": "`{0}` özelliği zorunludur ve `string` türünde olmalıdır. Sadece abecesayısal(alphanumeric), '_', ve '-' karakterlerine izin verilir.", "requirestring": "`{0}` özelliği zorunludur ve `string` türünde olmalıdır", "showViewlet": "{0}'i Göster", "view": "Görüntüle" diff --git a/i18n/trk/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json b/i18n/trk/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json index 1130991fdf..3c92c8ee5f 100644 --- a/i18n/trk/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json +++ b/i18n/trk/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json @@ -2,7 +2,7 @@ "": [ "--------------------------------------------------------------------------------------------", "Copyright (c) Microsoft Corporation. All rights reserved.", - "Licensed under the Source EULA. See License.txt in the project root for license information.", + "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], @@ -18,6 +18,7 @@ "views.scm": "Etkinlik Çubuğu'ndaki SCM kapsayıcısına görünümler ekler", "views.test": "Etkinlik Çubuğu'ndaki Test kapsayıcısına görünümler ekler", "views.contributed": "Görünümleri katkıda bulunan görünümü kapsayıcısına ekler", + "ViewContainerDoesnotExist": "'{0}' görünüm kapsayıcısı mevcut değil ve ona kayıtlı tüm görünümler 'Explorer'a eklenecektir.", "duplicateView1": "`{1}` konumunda aynı `{0}` id'sine sahip birden çok görünüm kaydedilemiyor", "duplicateView2": "`{0}` id'sine sahip bir görünüm `{1}` konumunda zaten kayıtlı" } \ No newline at end of file diff --git a/i18n/trk/src/vs/workbench/browser/actions/workspaceActions.i18n.json b/i18n/trk/src/vs/workbench/browser/actions/workspaceActions.i18n.json index 9305ffc01c..c5cfab87fb 100644 --- a/i18n/trk/src/vs/workbench/browser/actions/workspaceActions.i18n.json +++ b/i18n/trk/src/vs/workbench/browser/actions/workspaceActions.i18n.json @@ -14,6 +14,5 @@ "save": "&&Kaydet", "saveWorkspace": "Çalışma Alanını Kaydet", "openWorkspaceAction": "Çalışma Alanı Aç...", - "openWorkspaceConfigFile": "Çalışma Alanı Yapılandırma Dosyasını Aç", - "openFolderAsWorkspaceInNewWindow": "Klasörü Yeni Pencerede Çalışma Alanı Olarak Aç" + "openWorkspaceConfigFile": "Çalışma Alanı Yapılandırma Dosyasını Aç" } \ No newline at end of file diff --git a/i18n/trk/src/vs/workbench/browser/parts/panel/panelPart.i18n.json b/i18n/trk/src/vs/workbench/browser/parts/panel/panelPart.i18n.json index 0046cd3bf7..cf7847169c 100644 --- a/i18n/trk/src/vs/workbench/browser/parts/panel/panelPart.i18n.json +++ b/i18n/trk/src/vs/workbench/browser/parts/panel/panelPart.i18n.json @@ -1,8 +1,10 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the Source EULA. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ -// Do not edit this file. It is machine generated. { - "panelSwitcherBarAriaLabel": "Aktif Panel Değiştirici" + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "hidePanel": "Paneli Gizle" } \ No newline at end of file diff --git a/i18n/trk/src/vs/workbench/browser/parts/quickopen/quickOpenController.i18n.json b/i18n/trk/src/vs/workbench/browser/parts/quickopen/quickOpenController.i18n.json index a43295e447..d988780fd6 100644 --- a/i18n/trk/src/vs/workbench/browser/parts/quickopen/quickOpenController.i18n.json +++ b/i18n/trk/src/vs/workbench/browser/parts/quickopen/quickOpenController.i18n.json @@ -6,8 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "inputModeEntryDescription": "{0} (Onaylamak için 'Enter' veya iptal etmek için 'Escape' tuşuna basın)", - "inputModeEntry": "Girdinizi onaylamak için 'Enter' veya iptal etmek için 'Escape' tuşuna basın", "emptyPicks": "Seçilecek girdi yok", "quickOpenInput": "Buradan gerçekleştirebileceğiniz eylemler hakkında yardım almak için '?' yazın", "historyMatches": "yakınlarda açıldı", diff --git a/i18n/trk/src/vs/workbench/common/theme.i18n.json b/i18n/trk/src/vs/workbench/common/theme.i18n.json index 362cc4aaff..2b354ac909 100644 --- a/i18n/trk/src/vs/workbench/common/theme.i18n.json +++ b/i18n/trk/src/vs/workbench/common/theme.i18n.json @@ -11,8 +11,10 @@ "tabHoverBackground": "Fareyle üzerine gelindiğinde sekme arka plan rengi. Sekmeler, düzenleyici alanındaki düzenleyicilerin kapsayıcılarıdır. Bir düzenleyici grubunda birden fazla sekme açılabilir. Birden fazla düzenleyici grupları var olabilir.", "tabUnfocusedHoverBackground": "Fareyle üzerine gelindiğinde odaklanılmamış bir gruptaki aktif sekmenin arka plan rengi. Sekmeler, düzenleyici alanındaki düzenleyicilerin kapsayıcılarıdır. Bir düzenleyici grubunda birden fazla sekme açılabilir. Birden fazla düzenleyici grupları var olabilir.", "tabBorder": "Sekmeleri birbirinden ayıran kenarlığın rengi. Sekmeler, düzenleyici alanındaki düzenleyicilerin kapsayıcılarıdır. Bir düzenleyici grubunda birden fazla sekme açılabilir. Birden fazla düzenleyici grupları var olabilir.", - "tabActiveBorder": "Aktif sekmeleri vurgulayacak kenarlık. Sekmeler, düzenleyici alanındaki düzenleyicilerin kapsayıcılarıdır. Bir düzenleyici grubunda birden fazla sekme açılabilir. Birden fazla düzenleyici grupları var olabilir.", - "tabActiveUnfocusedBorder": "Odaklanılmamış bir gruptaki aktif sekmeleri vurgulayacak kenarlık. Sekmeler, düzenleyici alanındaki düzenleyicilerin kapsayıcılarıdır. Bir düzenleyici grubunda birden fazla sekme açılabilir. Birden fazla düzenleyici grupları var olabilir.", + "tabActiveBorder": "Aktif bir sekmenin altındaki kenarlık. Sekmeler, düzenleyici alanındaki düzenleyicilerin kapsayıcılarıdır. Bir düzenleyici grubunda birden fazla sekme açılabilir. Birden fazla düzenleyici grupları var olabilir.", + "tabActiveBorderTop": "Aktif bir sekmenin üstündeki kenarlık. Sekmeler, düzenleyici alanındaki düzenleyicilerin kapsayıcılarıdır. Bir düzenleyici grubunda birden fazla sekme açılabilir. Birden fazla düzenleyici grupları var olabilir.", + "tabActiveUnfocusedBorder": "Odaklanılmamış bir gruptaki aktif bir sekmenin altındaki kenarlık. Sekmeler, düzenleyici alanındaki düzenleyicilerin kapsayıcılarıdır. Bir düzenleyici grubunda birden fazla sekme açılabilir. Birden fazla düzenleyici grupları var olabilir.", + "tabActiveUnfocusedBorderTop": "Odaklanılmamış bir gruptaki aktif bir sekmenin üstündeki kenarlık. Sekmeler, düzenleyici alanındaki düzenleyicilerin kapsayıcılarıdır. Bir düzenleyici grubunda birden fazla sekme açılabilir. Birden fazla düzenleyici grupları var olabilir.", "tabHoverBorder": "Fareyle üzerine gelindiğinde sekmeleri vurgulayacak kenarlık. Sekmeler, düzenleyici alanındaki düzenleyicilerin kapsayıcılarıdır. Bir düzenleyici grubunda birden fazla sekme açılabilir. Birden fazla düzenleyici grupları var olabilir.", "tabUnfocusedHoverBorder": "Fareyle üzerine gelindiğinde odaklanılmamış bir gruptaki sekmeleri vurgulayacak kenarlık. Sekmeler, düzenleyici alanındaki düzenleyicilerin kapsayıcılarıdır. Bir düzenleyici grubunda birden fazla sekme açılabilir. Birden fazla düzenleyici grupları var olabilir.", "tabActiveForeground": "Aktif bir gruptaki aktif sekmenin ön plan rengi. Sekmeler, düzenleyici alanındaki düzenleyicilerin kapsayıcılarıdır. Bir düzenleyici grubunda birden fazla sekme açılabilir. Birden fazla düzenleyici grupları var olabilir.", diff --git a/i18n/trk/src/vs/workbench/parts/codeEditor/electron-browser/largeFileOptimizations.i18n.json b/i18n/trk/src/vs/workbench/parts/codeEditor/electron-browser/largeFileOptimizations.i18n.json new file mode 100644 index 0000000000..5eadf9a5ef --- /dev/null +++ b/i18n/trk/src/vs/workbench/parts/codeEditor/electron-browser/largeFileOptimizations.i18n.json @@ -0,0 +1,12 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "neverShowAgain": "Tamam. Tekrar Gösterme", + "removeOptimizations": "Özellikleri zorla etkinleştir", + "reopenFilePrompt": "Bu ayarın yürürlüğe girmesi için lütfen dosyayı yeniden açın." +} \ No newline at end of file diff --git a/i18n/trk/src/vs/workbench/parts/debug/browser/debugActions.i18n.json b/i18n/trk/src/vs/workbench/parts/debug/browser/debugActions.i18n.json index bf42a32abf..a627a9262d 100644 --- a/i18n/trk/src/vs/workbench/parts/debug/browser/debugActions.i18n.json +++ b/i18n/trk/src/vs/workbench/parts/debug/browser/debugActions.i18n.json @@ -41,7 +41,7 @@ "debugConsoleAction": "Hata Ayıklama Konsolu", "unreadOutput": "Hata Ayıklama Konsolunda Yeni Çıktı", "debugFocusConsole": "Hata Ayıklama Konsoluna Odakla", - "focusProcess": "İşleme Odakla", + "focusSession": "Oturuma Odakla", "stepBackDebug": "Geri Adım At", "reverseContinue": "Tersine Çevir" } \ No newline at end of file diff --git a/i18n/trk/src/vs/workbench/parts/debug/browser/debugCommands.i18n.json b/i18n/trk/src/vs/workbench/parts/debug/browser/debugCommands.i18n.json index a951b8fb53..7cbdf7c11b 100644 --- a/i18n/trk/src/vs/workbench/parts/debug/browser/debugCommands.i18n.json +++ b/i18n/trk/src/vs/workbench/parts/debug/browser/debugCommands.i18n.json @@ -7,7 +7,7 @@ "Do not edit this file. It is machine generated." ], "noFolderDebugConfig": "Gelişmiş hata ayıklama yapılandırması yapmak için lütfen ilk olarak bir klasör açın.", - "columnBreakpoint": "Sütun Kesme Noktası", + "inlineBreakpoint": "Satır İçi Kesme Noktası", "debug": "Hata Ayıklama", - "addColumnBreakpoint": "Sütun Kesme Noktası Ekle" + "addInlineBreakpoint": "Satır İçi Kesme Noktası Ekle" } \ No newline at end of file diff --git a/i18n/trk/src/vs/workbench/parts/debug/browser/debugEditorActions.i18n.json b/i18n/trk/src/vs/workbench/parts/debug/browser/debugEditorActions.i18n.json index 5f05d35542..b79928cc5f 100644 --- a/i18n/trk/src/vs/workbench/parts/debug/browser/debugEditorActions.i18n.json +++ b/i18n/trk/src/vs/workbench/parts/debug/browser/debugEditorActions.i18n.json @@ -12,5 +12,7 @@ "runToCursor": "İmlece Kadar Çalıştır", "debugEvaluate": "Hata Ayıklama: Değerlendir", "debugAddToWatch": "Hata Ayıklama: İzlemeye Ekle", - "showDebugHover": "Hata Ayıklama: Bağlantı Vurgusunu Göster" + "showDebugHover": "Hata Ayıklama: Bağlantı Vurgusunu Göster", + "goToNextBreakpoint": "Hata Ayıklama: Sonraki Kesme Noktasına Git", + "goToPreviousBreakpoint": "Hata Ayıklama: Önceki Kesme Noktasına Git" } \ No newline at end of file diff --git a/i18n/trk/src/vs/workbench/parts/debug/browser/debugViewlet.i18n.json b/i18n/trk/src/vs/workbench/parts/debug/browser/debugViewlet.i18n.json index 197d83ee9b..b041b7cbc0 100644 --- a/i18n/trk/src/vs/workbench/parts/debug/browser/debugViewlet.i18n.json +++ b/i18n/trk/src/vs/workbench/parts/debug/browser/debugViewlet.i18n.json @@ -6,6 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "startAdditionalSession": "Ek Oturum Başlat", "debugFocusVariablesView": "Değişkenlere Odakla", "debugFocusWatchView": "İzlemeye Odakla", "debugFocusCallStackView": "Çağrı Yığınına Odakla", diff --git a/i18n/trk/src/vs/workbench/parts/debug/common/debugSchemas.i18n.json b/i18n/trk/src/vs/workbench/parts/debug/common/debugSchemas.i18n.json new file mode 100644 index 0000000000..003dff404d --- /dev/null +++ b/i18n/trk/src/vs/workbench/parts/debug/common/debugSchemas.i18n.json @@ -0,0 +1,38 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "vscode.extension.contributes.debuggers": "Hata ayıklama bağdaştırıcılarına ekleme yapar.", + "vscode.extension.contributes.debuggers.type": "Bu hata ayıklama bağdaştırıcısnın benzersiz tanımlayıcısı.", + "vscode.extension.contributes.debuggers.label": "Bu hata ayıklama bağdaştırıcısnın görünen adı.", + "vscode.extension.contributes.debuggers.program": "Hata ayıklama bağdaştırıcı programının yolu. Yol, ya mutlak ya da eklenti klasörüne görelidir.", + "vscode.extension.contributes.debuggers.args": "Bağdaştırıcıya iletilecek ek argümanlar.", + "vscode.extension.contributes.debuggers.runtime": "Program özniteliğinin yürütülebilir olmadığı halde bir çalışma zamanını gerektirmesi durumu için isteğe bağlı çalışma zamanı.", + "vscode.extension.contributes.debuggers.runtimeArgs": "İsteğe bağlı çalışma zamanı argümanları.", + "vscode.extension.contributes.debuggers.variables": "`launch.json` dosyasındaki interaktif değişkenlerin (ör. ${action.pickProcess}) bir komuta eşlenmesi.", + "vscode.extension.contributes.debuggers.initialConfigurations": "İlk 'launch.json' dosyasının üretimi için yapılandırmalar.", + "vscode.extension.contributes.debuggers.languages": "Hata ayıklama eklentisinin, \"varsayılan hata ayıklayıcı\" olarak değerlendirilebileceği diller listesi.", + "vscode.extension.contributes.debuggers.adapterExecutableCommand": "Belirtilirse; VS Code, hata ayıklama bağdaştırıcısı yürütülebilir dosyasının yolunu ve ona gönderilecek argümanları belirlemek için bu komutu çağırır.", + "vscode.extension.contributes.debuggers.configurationSnippets": "'launch.json' dosyasına yeni yapılandırmalar ekleme parçacıkları.", + "vscode.extension.contributes.debuggers.configurationAttributes": "'launch.json' dosyasını doğrulayacak JSON şema yapılandırmaları.", + "vscode.extension.contributes.debuggers.windows": "Windows'a özel ayarlar.", + "vscode.extension.contributes.debuggers.windows.runtime": "Windows'da kullanılacak çalışma zamanı.", + "vscode.extension.contributes.debuggers.osx": "macOS'e özel ayarlar.", + "vscode.extension.contributes.debuggers.osx.runtime": "macOS'de kullanılacak çalışma zamanı.", + "vscode.extension.contributes.debuggers.linux": "Linux'a özel ayarlar.", + "vscode.extension.contributes.debuggers.linux.runtime": "Linux'da kullanılacak çalışma zamanı.", + "vscode.extension.contributes.breakpoints": "Kesme noktalarına ekleme yapar.", + "vscode.extension.contributes.breakpoints.language": "Bu dil için kesme noktalarını etkinleştir.", + "app.launch.json.title": "Başlat", + "app.launch.json.version": "Bu dosya biçiminin sürümü.", + "app.launch.json.configurations": "Yapılandırma listesi. IntelliSense kullanarak yeni yapılandırmalar ekleyin veya mevcut olanları düzenleyin.", + "app.launch.json.compounds": "Bileşikler listesi. Her bileşik, birlikte çalıştırılacak birden çok yapılandırmaya başvurur.", + "app.launch.json.compound.name": "Bileşiğin adı. Başlatma yapılandırması açılır kutu menüsünde görünür.", + "useUniqueNames": "Lütfen benzersiz yapılandırma adları kullanın.", + "app.launch.json.compound.folder": "Bileşiğin bulunduğu klasörün adı.", + "app.launch.json.compounds.configurations": "Bu bileşiğin parçası olarak başlatılacak yapılandırmaların adları." +} \ No newline at end of file diff --git a/i18n/trk/src/vs/workbench/parts/debug/electron-browser/breakpointWidget.i18n.json b/i18n/trk/src/vs/workbench/parts/debug/electron-browser/breakpointWidget.i18n.json index d8d0b352bf..6f0d63fe4b 100644 --- a/i18n/trk/src/vs/workbench/parts/debug/electron-browser/breakpointWidget.i18n.json +++ b/i18n/trk/src/vs/workbench/parts/debug/electron-browser/breakpointWidget.i18n.json @@ -6,6 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "breakpointWidgetLogMessagePlaceholder": "Bu kesme noktası isabet aldığında günlüğe kaydedilecek mesaj. {} arasındaki ifadeler hesaplanmaktadır. Kabul etmek için 'Enter', iptal etmek için 'Esc' tuşuna basın.", "breakpointWidgetHitCountPlaceholder": "İsabet sayısı koşulu sağlandığında mola ver. Kabul etmek için 'Enter', iptal etmek için 'Esc' tuşuna basın.", "breakpointWidgetExpressionPlaceholder": "İfade değerlendirmesi doğru olduğunda mola ver. Kabul etmek için 'Enter', iptal etmek için 'Esc' tuşuna basın.", "expression": "İfade", diff --git a/i18n/trk/src/vs/workbench/parts/debug/electron-browser/callStackView.i18n.json b/i18n/trk/src/vs/workbench/parts/debug/electron-browser/callStackView.i18n.json index dcf3e4ca85..e21b494ace 100644 --- a/i18n/trk/src/vs/workbench/parts/debug/electron-browser/callStackView.i18n.json +++ b/i18n/trk/src/vs/workbench/parts/debug/electron-browser/callStackView.i18n.json @@ -9,7 +9,7 @@ "callstackSection": "Çağrı Yığını Bölümü", "debugStopped": "{0} Üzerinde Duraklatıldı", "callStackAriaLabel": "Hata Ayıklama Çağrı Yığını", - "process": "İşlem", + "session": "Oturum", "paused": "Duraklatıldı", "running": "Çalışıyor", "thread": "İş Parçacığı", diff --git a/i18n/trk/src/vs/workbench/parts/debug/electron-browser/debug.contribution.i18n.json b/i18n/trk/src/vs/workbench/parts/debug/electron-browser/debug.contribution.i18n.json index adfc7a384a..a99cc8408e 100644 --- a/i18n/trk/src/vs/workbench/parts/debug/electron-browser/debug.contribution.i18n.json +++ b/i18n/trk/src/vs/workbench/parts/debug/electron-browser/debug.contribution.i18n.json @@ -21,7 +21,6 @@ "allowBreakpointsEverywhere": "Herhangi bir dosyada kesme noktası ayarlamaya izin verir", "openExplorerOnEnd": "Bir hata ayıklama oturumunun sonunda otomatik olarak gezgin görünümünü açın", "inlineValues": "Hata ayıklama sırasında değişken değerlerini düzenleyicide satır içinde göster", - "hideActionBar": "Dolaştırılabilir hata ayıklama eylem çubuğunun gizlenip gizlenmeyeceğini denetler", "never": "Hata ayıklamayı durum çubuğunda asla gösterme", "always": "Hata ayıklamayı durum çubuğunda her zaman göster", "onFirstSessionStart": "Hata ayıklamayı sadece ilk kez başladıktan sonra durum çubuğunda göster", diff --git a/i18n/trk/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.i18n.json b/i18n/trk/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.i18n.json index 01b1df13d2..60d165f693 100644 --- a/i18n/trk/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.i18n.json +++ b/i18n/trk/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.i18n.json @@ -2,39 +2,10 @@ "": [ "--------------------------------------------------------------------------------------------", "Copyright (c) Microsoft Corporation. All rights reserved.", - "Licensed under the Source EULA. See License.txt in the project root for license information.", + "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "vscode.extension.contributes.debuggers": "Hata ayıklama bağdaştırıcılarına ekleme yapar.", - "vscode.extension.contributes.debuggers.type": "Bu hata ayıklama bağdaştırıcısnın benzersiz tanımlayıcısı.", - "vscode.extension.contributes.debuggers.label": "Bu hata ayıklama bağdaştırıcısnın görünen adı.", - "vscode.extension.contributes.debuggers.program": "Hata ayıklama bağdaştırıcı programının yolu. Yol, ya mutlak ya da eklenti klasörüne görelidir.", - "vscode.extension.contributes.debuggers.args": "Bağdaştırıcıya iletilecek ek argümanlar.", - "vscode.extension.contributes.debuggers.runtime": "Program özniteliğinin yürütülebilir olmadığı halde bir çalışma zamanını gerektirmesi durumu için isteğe bağlı çalışma zamanı.", - "vscode.extension.contributes.debuggers.runtimeArgs": "İsteğe bağlı çalışma zamanı argümanları.", - "vscode.extension.contributes.debuggers.variables": "`launch.json` dosyasındaki interaktif değişkenlerin (ör. ${action.pickProcess}) bir komuta eşlenmesi.", - "vscode.extension.contributes.debuggers.initialConfigurations": "İlk 'launch.json' dosyasının üretimi için yapılandırmalar.", - "vscode.extension.contributes.debuggers.languages": "Hata ayıklama eklentisinin, \"varsayılan hata ayıklayıcı\" olarak değerlendirilebileceği diller listesi.", - "vscode.extension.contributes.debuggers.adapterExecutableCommand": "Belirtilirse; VS Code, hata ayıklama bağdaştırıcısı yürütülebilir dosyasının yolunu ve ona gönderilecek argümanları belirlemek için bu komutu çağırır.", - "vscode.extension.contributes.debuggers.configurationSnippets": "'launch.json' dosyasına yeni yapılandırmalar ekleme parçacıkları.", - "vscode.extension.contributes.debuggers.configurationAttributes": "'launch.json' dosyasını doğrulayacak JSON şema yapılandırmaları.", - "vscode.extension.contributes.debuggers.windows": "Windows'a özel ayarlar.", - "vscode.extension.contributes.debuggers.windows.runtime": "Windows'da kullanılacak çalışma zamanı.", - "vscode.extension.contributes.debuggers.osx": "macOS'e özel ayarlar.", - "vscode.extension.contributes.debuggers.osx.runtime": "macOS'de kullanılacak çalışma zamanı.", - "vscode.extension.contributes.debuggers.linux": "Linux'a özel ayarlar.", - "vscode.extension.contributes.debuggers.linux.runtime": "Linux'da kullanılacak çalışma zamanı.", - "vscode.extension.contributes.breakpoints": "Kesme noktalarına ekleme yapar.", - "vscode.extension.contributes.breakpoints.language": "Bu dil için kesme noktalarını etkinleştir.", - "app.launch.json.title": "Başlat", - "app.launch.json.version": "Bu dosya biçiminin sürümü.", - "app.launch.json.configurations": "Yapılandırma listesi. IntelliSense kullanarak yeni yapılandırmalar ekleyin veya mevcut olanları düzenleyin.", - "app.launch.json.compounds": "Bileşikler listesi. Her bileşik, birlikte çalıştırılacak birden çok yapılandırmaya başvurur.", - "app.launch.json.compound.name": "Bileşiğin adı. Başlatma yapılandırması açılır kutu menüsünde görünür.", - "useUniqueNames": "Lütfen benzersiz yapılandırma adları kullanın.", - "app.launch.json.compound.folder": "Bileşiğin bulunduğu klasörün adı.", - "app.launch.json.compounds.configurations": "Bu bileşiğin parçası olarak başlatılacak yapılandırmaların adları.", "debugNoType": "Hata ayıklayıcının 'type' ögesi atlanamaz ve 'dize' türünde olmalıdır.", "selectDebug": "Ortam Seçin", "DebugConfig.failed": " '.vscode' klasörü içinde 'launch.json' dosyası oluşturulamıyor ({0}).", diff --git a/i18n/trk/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json b/i18n/trk/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json index 0744bfd32d..37a431b186 100644 --- a/i18n/trk/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json +++ b/i18n/trk/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json @@ -2,7 +2,7 @@ "": [ "--------------------------------------------------------------------------------------------", "Copyright (c) Microsoft Corporation. All rights reserved.", - "Licensed under the Source EULA. See License.txt in the project root for license information.", + "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], @@ -13,19 +13,19 @@ "disableBreakpoint": "Devre Dışı Bırak: {0}", "enableBreakpoint": "Etkinleştir: {0}", "removeBreakpoints": "Kesme Noktalarını Kaldır", - "removeBreakpointOnColumn": "{0}. Sütundaki Kesme Noktasını Kaldır", + "removeInlineBreakpointOnColumn": "{0}. Sütundaki Satır İçi Kesme Noktasını Kaldır", "removeLineBreakpoint": "Satır Kesme Noktasını Kaldır", "editBreakpoints": "Kesme Noktalarını Düzenle", - "editBreakpointOnColumn": "{0}. Sütundaki Kesme Noktasını Düzenle", + "editInlineBreakpointOnColumn": "{0}. Sütundaki Satır İçi Kesme Noktasını Düzenle", "editLineBrekapoint": "Satır Kesme Noktasını Düzenle", "enableDisableBreakpoints": "Kesme Noktalarını Etkinleştir/Devre Dışı Bırak", - "disableColumnBreakpoint": "{0}. Sütundaki Kesme Noktasını Devre Dışı Bırak", + "disableInlineColumnBreakpoint": "{0}. Sütundaki Satır İçi Kesme Noktasını Devre Dışı Bırak", "disableBreakpointOnLine": "Satır Kesme Noktasını Devre Dışı Bırak", - "enableBreakpoints": "{0}. Sütundaki Kesme Noktasını Etkinleştir", "enableBreakpointOnLine": "Satır Kesme Noktasını Etkinleştir", "addBreakpoint": "Kesme Noktası Ekle", "addConditionalBreakpoint": "Koşullu Kesme Noktası Ekle...", "addLogPoint": "Günlük Noktası Ekle...", + "breakpointHasCondition": "Bu {0}, kaldırıldığında kaybolacak bir {1}'e sahip. Bunun yerine {0}'i kaldırmayı düşünün.", "message": "mesaj", "condition": "koşul", "removeLogPoint": "Kaldır: {0}", diff --git a/i18n/trk/src/vs/workbench/parts/debug/node/debugger.i18n.json b/i18n/trk/src/vs/workbench/parts/debug/node/debugger.i18n.json index 7c6fe0bcc3..46a2a813e1 100644 --- a/i18n/trk/src/vs/workbench/parts/debug/node/debugger.i18n.json +++ b/i18n/trk/src/vs/workbench/parts/debug/node/debugger.i18n.json @@ -16,6 +16,7 @@ "debugRequest": "Yapılandırmanın istek türü. \"launch\" veya \"attach\" olabilir.", "debugServer": "Sadece eklenti geliştirme hata ayıklaması için: eğer port belirtildiyse; Vs Code, bir hata ayıklama bağdaştırıcısına sunucu modunda bağlanmayı dener", "debugPrelaunchTask": "Hata ayıklama oturumu başlamadan önce çalıştırılacak görev.", + "debugPostDebugTask": "Hata ayıklama oturumu bittikten sonra çalıştırılacak görev.", "debugWindowsConfiguration": "Windows'a özel başlangıç yapılandırması öznitelikleri.", "debugOSXConfiguration": "OS X'e özel başlangıç yapılandırması öznitelikleri.", "debugLinuxConfiguration": "Linux'a özel başlangıç yapılandırması öznitelikleri.", diff --git a/i18n/trk/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.i18n.json b/i18n/trk/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.i18n.json index fc22fcd9e4..5f574d5497 100644 --- a/i18n/trk/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.i18n.json +++ b/i18n/trk/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.i18n.json @@ -19,6 +19,7 @@ "contributions": "Eklemeler", "changelog": "Değişim Günlüğü", "dependencies": "Bağımlılıklar", + "dependenciestooltip": "Bu eklentinin bağımlı olduğu eklentileri listele", "noReadme": "README dosyası yok.", "noChangelog": "Değişim günlüğü yok.", "noContributions": "Hiçbir Ekleme Yapmıyor", @@ -30,6 +31,9 @@ "debuggers": "Hata Ayıklayıcılar ({0})", "debugger name": "Adı", "debugger type": "Tür", + "view container id": "ID", + "view container title": "Başlık", + "view container location": "Yeri", "views": "Görünümler ({0})", "view id": "ID", "view name": "Adı", diff --git a/i18n/trk/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json b/i18n/trk/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json index e2418ac41c..909bc5b9ac 100644 --- a/i18n/trk/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json +++ b/i18n/trk/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json @@ -8,7 +8,6 @@ ], "neverShowAgain": "Tekrar Gösterme", "searchMarketplace": "Marketi Ara", - "showLanguagePackExtensions": "Markette VS Code'un '{0}' diline çevrilmesine yardımcı olabilecek eklentiler bulunuyor", "dynamicWorkspaceRecommendation": "Bu eklenti {0} deposundaki kullanıcılar arasında popüler olduğu için ilginizi çekebilir.", "exeBasedRecommendation": "Bu eklenti, sizde {0} kurulu olduğu için tavsiye ediliyor.", "fileBasedRecommendation": "Bu eklenti yakınlarda açtığınız dosyalara dayanarak tavsiye ediliyor.", diff --git a/i18n/trk/src/vs/workbench/parts/extensions/node/extensionsWorkbenchService.i18n.json b/i18n/trk/src/vs/workbench/parts/extensions/node/extensionsWorkbenchService.i18n.json index a5d3c57387..c431c97418 100644 --- a/i18n/trk/src/vs/workbench/parts/extensions/node/extensionsWorkbenchService.i18n.json +++ b/i18n/trk/src/vs/workbench/parts/extensions/node/extensionsWorkbenchService.i18n.json @@ -10,12 +10,12 @@ "malicious": "Bu eklentinin sorunlu olduğu bildirildi.", "installingMarketPlaceExtension": "Marketten eklenti yükleniyor...", "uninstallingExtension": "Eklenti kaldırılıyor...", - "enableDependeciesConfirmation": "'{0}' eklentisini etkinleştirdiğinizde onun bağımlılıkları da etkinleştirilir. Devam etmek istiyor musunuz?", + "enableDependeciesConfirmation": "Bir eklentiyi etkinleştirdiğinizde onun bağımlılıkları da etkinleştirilir. Devam etmek istiyor musunuz?", "enable": "Evet", "doNotEnable": "Hayır", - "disableDependeciesConfirmation": "Yalnızca '{0}' eklentisini mi devre dışı bırakmak istersiniz yoksa bağımlılıklarını da devre dışı bırakmak ister misiniz?", - "disableOnly": "Sadece Eklenti", - "disableAll": "Tümü", + "disableDependeciesConfirmation": "Eklentinin bağımlılıklarını da devre dışı bırakmak ister misiniz?", + "yes": "Evet", + "no": "Hayır", "cancel": "İptal", "singleDependentError": "'{0}' eklentisi devre dışı bırakılamıyor. '{1}' eklentisi buna bağlı.", "twoDependentsError": "'{0}' eklentisi devre dışı bırakılamıyor. '{1}' ve '{2}' eklentileri buna bağlı.", diff --git a/i18n/trk/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json b/i18n/trk/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json index dce58d397e..43e3bf4348 100644 --- a/i18n/trk/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json +++ b/i18n/trk/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json @@ -2,7 +2,7 @@ "": [ "--------------------------------------------------------------------------------------------", "Copyright (c) Microsoft Corporation. All rights reserved.", - "Licensed under the Source EULA. See License.txt in the project root for license information.", + "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], @@ -13,6 +13,7 @@ "copyFile": "Kopyala", "pasteFile": "Yapıştır", "retry": "Yeniden Dene", + "renameWhenSourcePathIsParentOfTargetError": "Var olan bir klasöre dosya veya klasör eklemek için lütfen 'Yeni Klasör' veya 'Yeni Dosya' komutunu kullanın", "newUntitledFile": "Yeni İsimsiz Dosya", "createNewFile": "Yeni Dosya", "createNewFolder": "Yeni Klasör", @@ -36,12 +37,12 @@ "confirmMoveTrashMessageMultipleDirectories": "Aşağıdaki {0} dizini ve içindekileri silmek istediğinizden emin misiniz?", "confirmMoveTrashMessageMultiple": "Aşağıdaki {0} dosyayı silmek istediğinizden emin misiniz?", "confirmMoveTrashMessageFolder": "'{0}' ve içindekileri silmek istediğinizden emin misiniz?", - "confirmMoveTrashMessageFile": "'{0}' öğesini silmek istediğinize emin misiniz?", + "confirmMoveTrashMessageFile": "'{0}' ögesini silmek istediğinizden emin misiniz?", "confirmDeleteMessageFilesAndDirectories": "Aşağıdaki {0} dosyayı/dizini ve içindekileri kalıcı olarak silmek istediğinizden emin misiniz?", "confirmDeleteMessageMultipleDirectories": "Aşağıdaki {0} dizini ve içindekileri kalıcı olarak silmek istediğinizden emin misiniz?", "confirmDeleteMessageMultiple": "Aşağıdaki {0} dosyayı kalıcı olarak silmek istediğinizden emin misiniz?", - "confirmDeleteMessageFolder": "'{0}' öğesini ve içindekileri kalıcı olarak silmek istediğinizden emin misiniz?", - "confirmDeleteMessageFile": "'{0}' öğesini kalıcı olarak silmek istediğinizden emin misiniz?", + "confirmDeleteMessageFolder": "'{0}' ögesini ve içindekileri kalıcı olarak silmek istediğinizden emin misiniz?", + "confirmDeleteMessageFile": "'{0}' ögesini kalıcı olarak silmek istediğinizden emin misiniz?", "addFiles": "Dosya Ekle", "confirmOverwrite": "Hedef klasörde aynı ada sahip bir dosya veya klasör zaten var. Değiştirmek istiyor musunuz?", "replaceButtonLabel": "&&Değiştir", diff --git a/i18n/trk/src/vs/workbench/parts/files/electron-browser/files.contribution.i18n.json b/i18n/trk/src/vs/workbench/parts/files/electron-browser/files.contribution.i18n.json index 21c84bf545..8617d78ad6 100644 --- a/i18n/trk/src/vs/workbench/parts/files/electron-browser/files.contribution.i18n.json +++ b/i18n/trk/src/vs/workbench/parts/files/electron-browser/files.contribution.i18n.json @@ -35,6 +35,7 @@ "hotExit": "Oturumlar arasında kaydedilmemiş dosyaların hatırlanıp hatırlanmayacağını denetler, düzenleyiciden çıkarken kaydetmek için izin istenmesi atlanacaktır.", "useExperimentalFileWatcher": "Yeni deneysel dosya izleyicisini kullanın.", "defaultLanguage": "Yeni dosyalara atanan varsayılan dil modu.", + "maxMemoryForLargeFilesMB": "Büyük dosyaları açmaya çalışırken, yeniden başlatma sonrası VS Code için mevcut olacak bellek miktarını denetler. Komut satırında belirtilen --max-memory=YENİBOYUT ile aynı etkiyi gösterir.", "editorConfigurationTitle": "Düzenleyici", "formatOnSave": "Dosyayı kaydederken biçimlendir. Bir biçimlendirici mevcut olmalıdır, dosya otomatik olarak kaydedilmemelidir, ve düzenleyici kapanmıyor olmalıdır.", "formatOnSaveTimeout": "Dosyayı kaydederken biçimlendirme zaman aşımı. formatOnSave komutlarında kullanılacak milisaniye cinsinden zaman limiti. Belirtilen zaman aşımından daha uzun süren komutlar iptal edilecektir.", diff --git a/i18n/trk/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.i18n.json b/i18n/trk/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.i18n.json index d5d15cb8ed..af5f75f59c 100644 --- a/i18n/trk/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.i18n.json +++ b/i18n/trk/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.i18n.json @@ -2,12 +2,14 @@ "": [ "--------------------------------------------------------------------------------------------", "Copyright (c) Microsoft Corporation. All rights reserved.", - "Licensed under the Source EULA. See License.txt in the project root for license information.", + "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], "fileInputAriaLabel": "Dosya adı girin. Onaylamak için Enter'a, iptal etmek için Escape tuşuna basın.", - "constructedPath": "**{1}** içinde {0} oluştur", + "createFileFromExplorerInfoMessage": "**{1}** konumunda **{0}** adlı dosya oluştur", + "renameFileFromExplorerInfoMessage": "Taşı ve **{0}** olarak yeniden adlandır", + "createFolderFromExplorerInfoMessage": "**{1}** konumunda **{0}** adlı klasör oluştur", "filesExplorerViewerAriaLabel": "{0}, Dosya Gezgini", "dropFolders": "Klasörleri çalışma alanına eklemek istiyor musunuz?", "dropFolder": "Klasörü çalışma alanına eklemek istiyor musunuz?", diff --git a/i18n/trk/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.i18n.json b/i18n/trk/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.i18n.json index 60cd3a5c2b..0e5a1f747b 100644 --- a/i18n/trk/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.i18n.json +++ b/i18n/trk/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.i18n.json @@ -7,6 +7,7 @@ "Do not edit this file. It is machine generated." ], "updateLocale": "VS Code'un kullanıcı arayüzü dilini {0} olarak değiştirip yeniden başlatmak ister misiniz?", + "activateLanguagePack": "Az önce yüklenen dil paketini etkinleştirmek için VS Code'u yeniden başlatmak ister misiniz?", "yes": "Evet", "no": "Hayır", "neverAgain": "Tekrar Gösterme", diff --git a/i18n/trk/src/vs/workbench/parts/localizations/electron-browser/localizationsActions.i18n.json b/i18n/trk/src/vs/workbench/parts/localizations/electron-browser/localizationsActions.i18n.json index 9cd3515ce9..25c7d2f27b 100644 --- a/i18n/trk/src/vs/workbench/parts/localizations/electron-browser/localizationsActions.i18n.json +++ b/i18n/trk/src/vs/workbench/parts/localizations/electron-browser/localizationsActions.i18n.json @@ -6,7 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "configureLocale": "Dili Yapılandır", + "configureLocale": "Görüntüleme Dilini Yapılandır", "displayLanguage": "VSCode'un görüntüleme dilini tanımlar.", "doc": "Desteklenen dillerin listesi için göz atın: {0}", "restart": "Değeri değiştirirseniz VSCode'u yeniden başlatmanız gerekir.", diff --git a/i18n/trk/src/vs/workbench/parts/outline/electron-browser/outline.contribution.i18n.json b/i18n/trk/src/vs/workbench/parts/outline/electron-browser/outline.contribution.i18n.json new file mode 100644 index 0000000000..5ee6f82386 --- /dev/null +++ b/i18n/trk/src/vs/workbench/parts/outline/electron-browser/outline.contribution.i18n.json @@ -0,0 +1,12 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "name": "Ana Hat", + "category.focus": "Dosya", + "label.focus": "Ana Hata Odakla" +} \ No newline at end of file diff --git a/i18n/trk/src/vs/workbench/parts/outline/electron-browser/outlinePanel.i18n.json b/i18n/trk/src/vs/workbench/parts/outline/electron-browser/outlinePanel.i18n.json new file mode 100644 index 0000000000..b87f59f807 --- /dev/null +++ b/i18n/trk/src/vs/workbench/parts/outline/electron-browser/outlinePanel.i18n.json @@ -0,0 +1,17 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "filter": "Filtre", + "collapse": "Tümünü Daralt", + "sortByPosition": "Sırala: Konuma Göre", + "sortByName": "Sırala: Ada Göre", + "sortByKind": "Sırala: Türe Göre", + "live": "İmleci İzle", + "no-editor": "Ana hat bilgisi sağlayabilecek açık bir düzenleyici yok.", + "too-many-symbols": "Üzgünüz, ancak bu dosya bir ana hat göstermek için çok büyük." +} \ No newline at end of file diff --git a/i18n/trk/src/vs/workbench/parts/outline/electron-browser/outlineTree.i18n.json b/i18n/trk/src/vs/workbench/parts/outline/electron-browser/outlineTree.i18n.json new file mode 100644 index 0000000000..35229bd669 --- /dev/null +++ b/i18n/trk/src/vs/workbench/parts/outline/electron-browser/outlineTree.i18n.json @@ -0,0 +1,9 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ] +} \ No newline at end of file diff --git a/i18n/trk/src/vs/workbench/parts/output/browser/outputPanel.i18n.json b/i18n/trk/src/vs/workbench/parts/output/browser/outputPanel.i18n.json index 33142c4948..0afa9c180a 100644 --- a/i18n/trk/src/vs/workbench/parts/output/browser/outputPanel.i18n.json +++ b/i18n/trk/src/vs/workbench/parts/output/browser/outputPanel.i18n.json @@ -6,6 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "output": "Çıktı", "outputPanelWithInputAriaLabel": "{0}, Çıktı paneli", "outputPanelAriaLabel": "Çıktı paneli" } \ No newline at end of file diff --git a/i18n/trk/src/vs/workbench/parts/preferences/browser/keybindingWidgets.i18n.json b/i18n/trk/src/vs/workbench/parts/preferences/browser/keybindingWidgets.i18n.json index 4dbb16becc..f0b5cc67cd 100644 --- a/i18n/trk/src/vs/workbench/parts/preferences/browser/keybindingWidgets.i18n.json +++ b/i18n/trk/src/vs/workbench/parts/preferences/browser/keybindingWidgets.i18n.json @@ -6,6 +6,8 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "defineKeybinding.oneExists": "Bu tuş bağına sahip 1 mevcut komut var", + "defineKeybinding.existing": "Bu tuş bağına sahip {0} mevcut komut var", "defineKeybinding.initial": "İstenen tuş kombinasyonuna basın ve daha sonra ENTER'a basın.", "defineKeybinding.chordsTo": "ardından" } \ No newline at end of file diff --git a/i18n/trk/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json b/i18n/trk/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json index d6cb9139a7..3e1329adaa 100644 --- a/i18n/trk/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json +++ b/i18n/trk/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json @@ -7,6 +7,7 @@ "Do not edit this file. It is machine generated." ], "openRawDefaultSettings": "Ham Varsayılan Ayarları Aç", + "openSettings2": "Ayarları Aç (Önizleme)", "openSettings": "Ayarları Aç", "openGlobalSettings": "Kullanıcı Ayarlarını Aç", "openGlobalKeybindings": "Klavye Kısayollarını Aç", diff --git a/i18n/trk/src/vs/workbench/parts/preferences/browser/settingsEditor2.i18n.json b/i18n/trk/src/vs/workbench/parts/preferences/browser/settingsEditor2.i18n.json new file mode 100644 index 0000000000..0149502b36 --- /dev/null +++ b/i18n/trk/src/vs/workbench/parts/preferences/browser/settingsEditor2.i18n.json @@ -0,0 +1,18 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "previewWarning": "Önizleme", + "previewLabel": "Bu yeni ayar düzenleyicimizin bir önizlemesidir", + "SearchSettings.AriaLabel": "Ayarları ara", + "SearchSettings.Placeholder": "Ayarları ara", + "advancedCustomizationLabel": "Gelişmiş özelleştirmeler için açın ve düzenleyin:", + "openSettingsLabel": "settings.json", + "showOverriddenOnly": "Sadece değiştirilmişleri göster", + "treeAriaLabel": "Ayarlar", + "feedbackButtonLabel": "Geri Bildirim Verin" +} \ No newline at end of file diff --git a/i18n/trk/src/vs/workbench/parts/preferences/browser/settingsTree.i18n.json b/i18n/trk/src/vs/workbench/parts/preferences/browser/settingsTree.i18n.json new file mode 100644 index 0000000000..a144e79e60 --- /dev/null +++ b/i18n/trk/src/vs/workbench/parts/preferences/browser/settingsTree.i18n.json @@ -0,0 +1,14 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "workspace": "Çalışma Alanı", + "user": "Kullanıcı", + "configured": "Değiştirilmiş", + "settingRowAriaLabel": "{0} {1}, Ayar", + "groupRowAriaLabel": "{0}, grup" +} \ No newline at end of file diff --git a/i18n/trk/src/vs/workbench/parts/preferences/electron-browser/preferences.contribution.i18n.json b/i18n/trk/src/vs/workbench/parts/preferences/electron-browser/preferences.contribution.i18n.json index 806a7b4c66..e9b406b734 100644 --- a/i18n/trk/src/vs/workbench/parts/preferences/electron-browser/preferences.contribution.i18n.json +++ b/i18n/trk/src/vs/workbench/parts/preferences/electron-browser/preferences.contribution.i18n.json @@ -7,6 +7,7 @@ "Do not edit this file. It is machine generated." ], "defaultPreferencesEditor": "Varsayılan Tercihler Düzenleyicisi", + "settingsEditor2": "Ayar Düzenleyici 2", "keybindingsEditor": "Tuş Bağları Düzenleyicisi", "preferences": "Tercihler" } \ No newline at end of file diff --git a/i18n/trk/src/vs/workbench/parts/search/browser/searchWidget.i18n.json b/i18n/trk/src/vs/workbench/parts/search/browser/searchWidget.i18n.json index aa319aa310..97fc626d74 100644 --- a/i18n/trk/src/vs/workbench/parts/search/browser/searchWidget.i18n.json +++ b/i18n/trk/src/vs/workbench/parts/search/browser/searchWidget.i18n.json @@ -13,6 +13,6 @@ "search.placeHolder": "Ara", "label.Replace": "Değiştir: Değiştirme terimini girin ve önizlemek için Enter'a, iptal etmek için Escape tuşuna basın", "search.replace.placeHolder": "Değiştir", - "regexp.validationFailure": "İfade her öğe ile eşleşiyor", + "regexp.validationFailure": "İfade her öge ile eşleşiyor", "regexp.backreferenceValidationFailure": "Geribaşvurular desteklenmiyor" } \ No newline at end of file diff --git a/i18n/trk/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json b/i18n/trk/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json index 33b0d22cf5..9e04840f3e 100644 --- a/i18n/trk/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json +++ b/i18n/trk/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json @@ -30,5 +30,6 @@ "search.quickOpen.includeSymbols": "Dosya sonuçlarındaki bir global sembol aramasının sonuçlarının Hızlı Aç'a dahil edilip edilmeyeceğini yapılandırın.", "search.followSymlinks": "Arama yaparken sembolik linklerin takip edilip edilmeyeceğini denetler.", "search.smartCase": "Örüntü tamamen küçük harflerden oluşuyorsa büyük küçük harf duyarlılığı olmadan arar, diğer durumda ise büyük küçük harf duyarlılığı ile arar", - "search.globalFindClipboard": "macOS'de arama görünümünün paylaşılan panoyu okuyup okumamasını veya değiştirip değiştirmemesini denetler" + "search.globalFindClipboard": "macOS'de arama görünümünün paylaşılan panoyu okuyup okumamasını veya değiştirip değiştirmemesini denetler", + "search.location": "Aramanın kenar çubuğunda bir görünüm olarak mı yoksa daha fazla yatay boşluk için panel alanında bir panel olarak mı gösterileceğini denetler." } \ No newline at end of file diff --git a/i18n/trk/src/vs/workbench/parts/tasks/common/problemMatcher.i18n.json b/i18n/trk/src/vs/workbench/parts/tasks/common/problemMatcher.i18n.json index 6cce3760b9..7b4e399d97 100644 --- a/i18n/trk/src/vs/workbench/parts/tasks/common/problemMatcher.i18n.json +++ b/i18n/trk/src/vs/workbench/parts/tasks/common/problemMatcher.i18n.json @@ -7,7 +7,7 @@ "Do not edit this file. It is machine generated." ], "ProblemPatternParser.loopProperty.notLast": "Döngü özelliği yalnızca son satır eşleştiricisinde desteklenir.", - "ProblemPatternParser.problemPattern.kindProperty.notFirst": "Problem şablonu geçersiz. Tür özelliği yalnızca birinci öğede sağlanmalıdır.", + "ProblemPatternParser.problemPattern.kindProperty.notFirst": "Problem şablonu geçersiz. Tür özelliği yalnızca ilk ögede belirtilmelidir.", "ProblemPatternParser.problemPattern.missingRegExp": "Sorun modelinde bir düzenli ifade eksik.", "ProblemPatternParser.problemPattern.missingProperty": "Problem şablonu geçersiz. En az bir dosya ve mesaj bulundurmalıdır.", "ProblemPatternParser.problemPattern.missingLocation": "Problem şablonu geçersiz. Ya \"dosya\" ya satır ya da konum eşleşme grubu, türlerinden birini bulundurmalıdır.", diff --git a/i18n/trk/src/vs/workbench/parts/tasks/common/taskDefinitionRegistry.i18n.json b/i18n/trk/src/vs/workbench/parts/tasks/common/taskDefinitionRegistry.i18n.json index 0af21b9e00..e7582c8087 100644 --- a/i18n/trk/src/vs/workbench/parts/tasks/common/taskDefinitionRegistry.i18n.json +++ b/i18n/trk/src/vs/workbench/parts/tasks/common/taskDefinitionRegistry.i18n.json @@ -2,10 +2,11 @@ "": [ "--------------------------------------------------------------------------------------------", "Copyright (c) Microsoft Corporation. All rights reserved.", - "Licensed under the Source EULA. See License.txt in the project root for license information.", + "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "TaskDefinition.description": "Gerçek görev türü. '$' ile başlayan türlerin dahili kullanım için ayrılmış olduğunu unutmayın.", "TaskDefinition.properties": "Görev türünün ek özellikleri", "TaskTypeConfiguration.noType": "Görev türü yapılandırmasında gerekli olan 'taskType' özelliği eksik", "TaskDefinitionExtPoint": "Görev türlerine ekleme yapar" diff --git a/i18n/trk/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json b/i18n/trk/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json index 19ebebef07..d266928557 100644 --- a/i18n/trk/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json +++ b/i18n/trk/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json @@ -31,6 +31,8 @@ "selectProblemMatcher": "Görev çıktısında taranacak hata ve uyarı türlerini seçin", "customizeParseErrors": "Geçerli görev yapılandırmasında hatalar var. Lütfen, bir görevi özelleştirmeden önce ilk olarak hataları düzeltin.", "moreThanOneBuildTask": "tasks.json dosyasında tanımlı çok fazla derleme görevi var. İlk görev çalıştırılıyor.", + "TaskSystem.activeSame.background": "'{0}' görevi zaten aktif ve arka plan modunda.", + "TaskSystem.activeSame.noBackground": "'{0}' görevi zaten aktif.", "terminateTask": "Görevi Sonlandır", "restartTask": "Görevi Yeniden Başlat", "TaskSystem.active": "Çalışan bir görev zaten var. Bir başkasını çalıştırmadan önce bu görevi sonlandırın.", diff --git a/i18n/trk/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.i18n.json b/i18n/trk/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.i18n.json index f5dc1a78d4..1f10ca399e 100644 --- a/i18n/trk/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.i18n.json +++ b/i18n/trk/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.i18n.json @@ -2,7 +2,7 @@ "": [ "--------------------------------------------------------------------------------------------", "Copyright (c) Microsoft Corporation. All rights reserved.", - "Licensed under the Source EULA. See License.txt in the project root for license information.", + "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], @@ -11,5 +11,6 @@ "TerminalTaskSystem.terminalName": "Görev - {0}", "closeTerminal": "Terminali kapatmak için lütfen bir tuşa basın.", "reuseTerminal": "Terminal görevler tarafından tekrar kullanılacak, kapatmak için herhangi bir tuşa basın.", + "TerminalTaskSystem": "cmd.exe kullanarak UNC sürücüsünde kabuk komutu yürütülemiyor.", "unkownProblemMatcher": "{0} sorun eşleştirici çözümlenemiyor. Eşleştirici yok sayılacaktır." } \ No newline at end of file diff --git a/i18n/trk/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.i18n.json b/i18n/trk/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.i18n.json index 28b472411b..a39f753b0a 100644 --- a/i18n/trk/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.i18n.json +++ b/i18n/trk/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.i18n.json @@ -26,7 +26,7 @@ "terminal.integrated.cursorStyle": "Terminaldeki imlecin stilini denetler.", "terminal.integrated.scrollback": "Terminalin tamponunda tuttuğu maksimum satır sayısını denetler.", "terminal.integrated.setLocaleVariables": "Terminal başlangıcında yereli içeren değişkenlerin ayarlanıp ayarlanmayacağını denetler; bu, OS X'de varsayılan olarak açıktır, diğer platformlarda kapalıdır.", - "terminal.integrated.rightClickBehavior": "Terminalin sağ tıklamaya nasıl tepki vereceğini denetler, olası değerler 'default', 'copyPaste' ve 'selectWord'dür. 'default' bağlam menüsünü gösterir, 'copyPaste' bir seçim varsa kopyalar yoksa yapıştırır, 'selectWord' imlecin altındaki sözcüğü seçer ve bağlam menüsünü gösterir.", + "terminal.integrated.rightClickBehavior": "Terminalin sağ tıklamaya nasıl tepki vereceğini denetler, olası değerler \"default\", \"copyPaste\" ve \"selectWord\"dür. \"default\" bağlam menüsünü gösterir, \"copyPaste\" bir seçim varsa kopyalar yoksa yapıştırır, \"selectWord\" imlecin altındaki sözcüğü seçer ve bağlam menüsünü gösterir.", "terminal.integrated.cwd": "Terminalin nerede başlatılacağına ait açık bir yol; bu, kabuk işlemleri için geçerli çalışma klasörü (cwd) olarak kullanılır. Bu, çalışma alanı ayarlarında kök dizini uygun bir cwd değilse özellikle yararlı olabilir.", "terminal.integrated.confirmOnExit": "Aktif terminal oturumları varken çıkışta onay istenip istenmeyeceği.", "terminal.integrated.enableBell": "Terminal zilinin etkin olup olmadığı.", diff --git a/i18n/trk/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json b/i18n/trk/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json index b6b76fec0b..31ba0e2b06 100644 --- a/i18n/trk/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json +++ b/i18n/trk/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json @@ -21,6 +21,7 @@ "workbench.action.terminal.newWorkspacePlaceholder": "Yeni terminal için geçerli çalışma dizinini seçin", "workbench.action.terminal.newInActiveWorkspace": "(Aktif Çalışma Alanında) Yeni Entegre Terminal Oluştur", "workbench.action.terminal.split": "Terminali Böl", + "workbench.action.terminal.splitInActiveWorkspace": "(Aktif Çalışma Alanında) Terminali Böl", "workbench.action.terminal.focusPreviousPane": "Önceki Bölmeye Odakla", "workbench.action.terminal.focusNextPane": "Sonraki Bölmeye Odakla", "workbench.action.terminal.resizePaneLeft": "Bölmeyi Sola Doğru Yeniden Boyutlandır", @@ -56,5 +57,7 @@ "workbench.action.terminal.scrollToPreviousCommand": "Önceki Komuta Kadar Kaydır", "workbench.action.terminal.scrollToNextCommand": "Sonraki Komuta Kadar Kaydır", "workbench.action.terminal.selectToPreviousCommand": "Önceki Komuta Kadar Seç", - "workbench.action.terminal.selectToNextCommand": "Sonraki Komuta Kadar Seç" + "workbench.action.terminal.selectToNextCommand": "Sonraki Komuta Kadar Seç", + "workbench.action.terminal.selectToPreviousLine": "Önceki Satıra Kadar Seç", + "workbench.action.terminal.selectToNextLine": "Sonraki Satıra Kadar Seç" } \ No newline at end of file diff --git a/i18n/trk/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.i18n.json b/i18n/trk/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.i18n.json index 84d34a2e7b..70f914664c 100644 --- a/i18n/trk/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.i18n.json +++ b/i18n/trk/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.i18n.json @@ -9,8 +9,12 @@ "terminal.integrated.a11yBlankLine": "Boş satır", "terminal.integrated.a11yPromptLabel": "Terminal girdisi", "terminal.integrated.a11yTooMuchOutput": "Gösterilecek çok fazla çıktı var, okumak için satırları manuel olarak gezin.", + "yes": "Evet", + "no": "Hayır", + "dontShowAgain": "Tekrar Gösterme", "terminal.integrated.copySelection.noSelection": "Terminalde kopyalanacak bir seçim bulunmuyor", "terminal.integrated.exitedWithCode": "Terminal işlemi şu çıkış koduyla sonlandı: {0}", "terminal.integrated.waitOnExit": "Terminali kapatmak için lütfen bir tuşa basın", - "terminal.integrated.launchFailed": "Terminal işlem komutu '{0}{1}' başlatılamadı (çıkış kodu: {2})" + "terminal.integrated.launchFailed": "Terminal işlem komutu '{0}{1}' başlatılamadı (çıkış kodu: {2})", + "terminal.integrated.launchFailedExtHost": "Terminal işlemi başlatılamadı (çıkış kodu: {0})" } \ No newline at end of file diff --git a/i18n/trk/src/vs/workbench/parts/terminal/electron-browser/terminalPanel.i18n.json b/i18n/trk/src/vs/workbench/parts/terminal/electron-browser/terminalPanel.i18n.json index 1a6d3d9b9b..f534aa3ef7 100644 --- a/i18n/trk/src/vs/workbench/parts/terminal/electron-browser/terminalPanel.i18n.json +++ b/i18n/trk/src/vs/workbench/parts/terminal/electron-browser/terminalPanel.i18n.json @@ -6,6 +6,8 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "terminal.useMonospace": "'monospace' (tek aralıklı) kullan", + "terminal.monospaceOnly": "Terminal sadece tek aralıklı yazı tiplerini destekliyor.", "copy": "Kopyala", "split": "Böl", "paste": "Yapıştır", diff --git a/i18n/trk/src/vs/workbench/parts/trust/electron-browser/unsupportedWorkspaceSettings.contribution.i18n.json b/i18n/trk/src/vs/workbench/parts/trust/electron-browser/unsupportedWorkspaceSettings.contribution.i18n.json index 930a02cde2..fceacee58e 100644 --- a/i18n/trk/src/vs/workbench/parts/trust/electron-browser/unsupportedWorkspaceSettings.contribution.i18n.json +++ b/i18n/trk/src/vs/workbench/parts/trust/electron-browser/unsupportedWorkspaceSettings.contribution.i18n.json @@ -6,7 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "unsupportedWorkspaceSettings": "Bu çalışma alanı sadece Kullanıcı Ayarları'nda ayarlanabilen ayarlar içeriyor. ({0}). Daha fazla bilgi almak için [buraya]({0}) tıklayın.", "openWorkspaceSettings": "Çalışma Alanı Ayarlarını Aç", "dontShowAgain": "Tekrar Gösterme", "unsupportedWorkspaceSettings": "Bu çalışma alanı sadece Kullanıcı Ayarları'nda ayarlanabilen ayarlar içeriyor. ({0}). Daha fazla bilgi almak için [buraya]({0}) tıklayın." diff --git a/i18n/trk/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThrough.contribution.i18n.json b/i18n/trk/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThrough.contribution.i18n.json index ec7fa517d6..79419b1c45 100644 --- a/i18n/trk/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThrough.contribution.i18n.json +++ b/i18n/trk/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThrough.contribution.i18n.json @@ -7,6 +7,5 @@ "Do not edit this file. It is machine generated." ], "walkThrough.editor.label": "İnteraktif Oyun Alanı", - "help": "Yardım", - "interactivePlayground": "İnteraktif Oyun Alanı" + "help": "Yardım" } \ No newline at end of file diff --git a/i18n/trk/src/vs/workbench/services/bulkEdit/electron-browser/bulkEditService.i18n.json b/i18n/trk/src/vs/workbench/services/bulkEdit/electron-browser/bulkEditService.i18n.json new file mode 100644 index 0000000000..bdfef4d2c9 --- /dev/null +++ b/i18n/trk/src/vs/workbench/services/bulkEdit/electron-browser/bulkEditService.i18n.json @@ -0,0 +1,13 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "summary.0": "Düzenleme yapılmadı", + "summary.nm": "{1} dosyada {0} metin düzenlemesi yapıldı", + "summary.n0": "Bir dosyada {0} metin düzenlemesi yapıldı", + "conflict": "Bu dosyalar bu arada değiştirildi: {0}" +} \ No newline at end of file diff --git a/i18n/trk/src/vs/workbench/services/configuration/common/configurationExtensionPoint.i18n.json b/i18n/trk/src/vs/workbench/services/configuration/common/configurationExtensionPoint.i18n.json index dff454ac71..3c039bf2be 100644 --- a/i18n/trk/src/vs/workbench/services/configuration/common/configurationExtensionPoint.i18n.json +++ b/i18n/trk/src/vs/workbench/services/configuration/common/configurationExtensionPoint.i18n.json @@ -16,6 +16,7 @@ "vscode.extension.contributes.configuration": "Yapılandırma ayarlarına ekleme yapar.", "invalid.title": "'configuration.title' bir dize olmalıdır", "invalid.properties": "'configuration.properties' bir nesne olmalıdır", + "invalid.property": "'configuration.property' bir nesne olmalıdır", "invalid.allOf": "'configuration.allOf' kullanım dışıdır ve artık kullanılmamalıdır. Bunun yerine, birden çok yapılandırma bölümlerini bir dizi olarak 'configuration' ekleme noktasına geçirin.", "workspaceConfig.folders.description": "Çalışma alanına yüklenecek klasörler listesi.", "workspaceConfig.path.description": "Bir dosya yolu. ör. `/root/folderA` veya çalışma alanı dosyasının konumuna karşı çözümlenecek göreceli bir yol için `./folderA`.", diff --git a/i18n/trk/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json b/i18n/trk/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json index bd08ea60e7..32907fc809 100644 --- a/i18n/trk/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json +++ b/i18n/trk/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json @@ -11,6 +11,7 @@ "open": "Ayarları Aç", "saveAndRetry": "Kaydet ve Yeniden Dene", "errorUnknownKey": "{0} dosyasına, {1} kayıtlı bir yapılandırma olmadığı için yazılamıyor.", + "errorInvalidWorkspaceConfigurationApplication": "{0}, Çalışma Alanı Ayarları'na yazılamadı. Bu ayar, sadece Kullanıcı Ayarları'na yazılabilir.", "errorInvalidFolderConfiguration": "{0}, klasör kaynak kapsamını desteklemediği için klasör ayarlarına yazılamıyor.", "errorInvalidUserTarget": "{0}, global kapsamı desteklemediği için kullanıcı ayarlarına yazılamıyor.", "errorInvalidWorkspaceTarget": "{0}, birden çok klasörlü çalışma alanında çalışma alanı kapsamını desteklemediği için Çalışma Alanı Ayarları'na yazılamıyor.", diff --git a/i18n/trk/src/vs/workbench/services/configuration/node/configurationService.i18n.json b/i18n/trk/src/vs/workbench/services/configuration/node/configurationService.i18n.json index 67d3a3db21..830ee439bd 100644 --- a/i18n/trk/src/vs/workbench/services/configuration/node/configurationService.i18n.json +++ b/i18n/trk/src/vs/workbench/services/configuration/node/configurationService.i18n.json @@ -6,5 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "unsupportedApplicationSetting": "Bu ayar, sadece Kullanıcı Ayarları'nda uygulanabilir.", "unsupportedWindowSetting": "Bu ayar şu an uygulanamıyor. Ayar, bu klasörü açtığınızda uygulanacaktır." } \ No newline at end of file diff --git a/i18n/trk/src/vs/workbench/services/configurationResolver/electron-browser/configurationResolverService.i18n.json b/i18n/trk/src/vs/workbench/services/configurationResolver/electron-browser/configurationResolverService.i18n.json index 35229bd669..b0bba1118f 100644 --- a/i18n/trk/src/vs/workbench/services/configurationResolver/electron-browser/configurationResolverService.i18n.json +++ b/i18n/trk/src/vs/workbench/services/configurationResolver/electron-browser/configurationResolverService.i18n.json @@ -5,5 +5,6 @@ "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." - ] + ], + "stringsOnlySupported": "{0} komutu bir dize değeri döndürmedi. Değişken yer değiştirmesi için kullanılan komutların sonuçlarında sadece dizeler desteklenir." } \ No newline at end of file diff --git a/i18n/trk/src/vs/workbench/services/configurationResolver/node/variableResolver.i18n.json b/i18n/trk/src/vs/workbench/services/configurationResolver/node/variableResolver.i18n.json index c8bec6ed14..a36997f7e1 100644 --- a/i18n/trk/src/vs/workbench/services/configurationResolver/node/variableResolver.i18n.json +++ b/i18n/trk/src/vs/workbench/services/configurationResolver/node/variableResolver.i18n.json @@ -8,9 +8,12 @@ ], "missingEnvVarName": "Hiçbir ortam değişkeni adı belirtilmediği için '{0}' çözümlenemiyor.", "configNotFound": "'{1}' ayarı bulunamadığı için '{0}' çözümlenemiyor.", - "configNoString": "'{1}' yapılandırılmış bir değer olduğu için '{0}' çözümlenemiyor.", "missingConfigName": "Hiçbir ayar adı belirtilmediği için '{0}' çözümlenemiyor.", + "noValueForCommand": "Komut değer içermediği için '{0}' çözümlenemiyor.", "canNotFindFolder": "'{0}' çözümlenemiyor. '{1}' klasörü yok.", + "canNotResolveWorkspaceFolderMultiRoot": "'{0}', birden çok klasörlü çalışma alanında çözümlenemiyor. ':' ve bir çalışma alanı klasörü adı kullanarak bu değişkeni test edin.", "canNotResolveWorkspaceFolder": "'{0}' çözümlenemiyor. Lütfen bir klasör açın.", - "canNotResolveFile": "'{0}' çözümlenemiyor. Lütfen bir düzenleyici açın." + "canNotResolveFile": "'{0}' çözümlenemiyor. Lütfen bir düzenleyici açın.", + "canNotResolveLineNumber": "'{0}' çözümlenemiyor. Lütfen aktif düzenleyicide bir satırın seçili olduğundan emin olun.", + "canNotResolveSelectedText": "'{0}' çözümlenemiyor. Lütfen aktif düzenleyicide seçili metin olduğundan emin olun." } \ No newline at end of file diff --git a/i18n/trk/src/vs/workbench/services/decorations/browser/decorationsService.i18n.json b/i18n/trk/src/vs/workbench/services/decorations/browser/decorationsService.i18n.json index cd6257cb15..6df4e3c5f9 100644 --- a/i18n/trk/src/vs/workbench/services/decorations/browser/decorationsService.i18n.json +++ b/i18n/trk/src/vs/workbench/services/decorations/browser/decorationsService.i18n.json @@ -6,5 +6,5 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "bubbleTitle": "Vurgulanan öğeler içeriyor" + "bubbleTitle": "Vurgulanan ögeler içeriyor" } \ No newline at end of file diff --git a/i18n/trk/src/vs/workbench/services/extensions/common/extensionsRegistry.i18n.json b/i18n/trk/src/vs/workbench/services/extensions/common/extensionsRegistry.i18n.json index fe49bf93f4..f8d156be1a 100644 --- a/i18n/trk/src/vs/workbench/services/extensions/common/extensionsRegistry.i18n.json +++ b/i18n/trk/src/vs/workbench/services/extensions/common/extensionsRegistry.i18n.json @@ -25,11 +25,14 @@ "vscode.extension.activationEvents.onDebugResolve": "Belirtilen türde bir hata ayıklama oturumu başlamaya yaklaştığında (ve buna karşılık gelen bir resolveDebugConfiguration metodunun çağrılması gerektiğinde) bir etkinleştirme olayı yayınlanır.", "vscode.extension.activationEvents.workspaceContains": "Belirtilen glob deseni ile eşleşen en az bir dosya içeren bir klasör her açıldığında bir etkinleştirme olayı yayınlanır.", "vscode.extension.activationEvents.onView": "Belirtilen görünüm her genişletildiğinde bir etkinleştirme olayı yayınlanır.", + "vscode.extension.activationEvents.onUri": "Sistem genelinde bu uzantıya yönelik bir Uri her açıldığında bir etkinleştirme olayı yayınlanır.", "vscode.extension.activationEvents.star": "VS Code başlatıldığında yayılan etkinleştirme olayı. Mükemmel bir son kullanıcı deneyimi sağlandığından emin olmak için, lütfen bu etkinleştirme olayını eklentinizde sadece kullanım durumunuzda başka hiçbir aktivasyon olayı kombinasyonu çalışmıyorsa kullanın.", "vscode.extension.badges": "Marketin eklenti sayfasının kenar çubuğunda görüntülenecek göstergeler dizisi.", "vscode.extension.badges.url": "Gösterge resmi URL'si.", "vscode.extension.badges.href": "Gösterge bağlantısı.", "vscode.extension.badges.description": "Gösterge açıklaması.", + "vscode.extension.markdown": "Markette kullanılan Markdown render motorunu denetler. github (varsayılan) veya standard olabilir.", + "vscode.extension.qna": "Marketteki soru-cevap bağlantısını denetler. Varsayılan market soru-cevap sitesini etkinleştirmek için 'marketplace' değerini atayın. Özel bir soru-cevap sitesinin URL'ini sağlamak için bir dize değeri atayın. Soru-cevabı tamamen devre dışı bırakmak için 'false' değerini atayın.", "vscode.extension.extensionDependencies": "Diğer uzantılara bağımlılıklar. Bir uzantının tanımlayıcısı her zaman ${publisher}.${name} biçimindedir. Örneğin: vscode.csharp.", "vscode.extension.scripts.prepublish": "Paket, bir VS Code eklentisi olarak yayımlamadan önce çalıştırılacak betik.", "vscode.extension.scripts.uninstall": "VS Code eklentisi için kaldırma betiği. VS Code, eklenti kaldırıldıktan sonra yeniden başlatıldığında (kapatıp açma) ve eklenti tamamen kaldırıldığında çalıştırılacak betik. Sadece Node betikleri desteklenir.", diff --git a/i18n/trk/src/vs/workbench/services/files/electron-browser/remoteFileService.i18n.json b/i18n/trk/src/vs/workbench/services/files/electron-browser/remoteFileService.i18n.json index c973084e79..e3c3cbb61e 100644 --- a/i18n/trk/src/vs/workbench/services/files/electron-browser/remoteFileService.i18n.json +++ b/i18n/trk/src/vs/workbench/services/files/electron-browser/remoteFileService.i18n.json @@ -6,6 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "invalidPath": "'{0}' kaynağının yolu mutlak olmalıdır", "fileNotFoundError": "Dosya bulunamadı ({0})", "fileIsDirectoryError": "Dosya bir dizindir", "fileNotModifiedError": "Dosya şu tarihten beri değiştirilmemiş:", diff --git a/i18n/trk/src/vs/workbench/services/themes/common/fileIconThemeSchema.i18n.json b/i18n/trk/src/vs/workbench/services/themes/common/fileIconThemeSchema.i18n.json index 314fabbe4a..531b1487c2 100644 --- a/i18n/trk/src/vs/workbench/services/themes/common/fileIconThemeSchema.i18n.json +++ b/i18n/trk/src/vs/workbench/services/themes/common/fileIconThemeSchema.i18n.json @@ -21,7 +21,7 @@ "schema.languageId": "İlişkilendirilecek simge tanımı ID'si.", "schema.fonts": "Simge tanımlarında kullanılacak yazı tipleri.", "schema.id": "Yazı tipinin ID'si.", - "schema.src": "Yazı tipinin konumları.", + "schema.src": "Yazı tipinin konumu.", "schema.font-path": "Yazı tipi yolu, geçerli simge teması dosyasına göreli yol.", "schema.font-format": "Yazı tipinin biçimi.", "schema.font-weight": "Yazı tipinin kalınlığı.", diff --git a/package.json b/package.json index e49dc8354f..404d5b1fae 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "sqlops", - "version": "0.32.7", + "version": "0.33.1", "distro": "8c3e97e3425cc9814496472ab73e076de2ba99ee", "author": { "name": "Microsoft Corporation" @@ -11,16 +11,19 @@ "test": "mocha", "preinstall": "node build/npm/preinstall.js", "postinstall": "node build/npm/postinstall.js", - "compile": "gulp compile --max_old_space_size=4096", - "watch": "gulp watch --max_old_space_size=4096", + "compile": "gulp compile --max_old_space_size=4095", + "watch": "gulp watch --max_old_space_size=4095", + "watch-client": "gulp watch-client --max_old_space_size=4095", "monaco-editor-test": "mocha --only-monaco-editor", "precommit": "node build/gulpfile.hygiene.js", - "gulp": "gulp --max_old_space_size=4096", + "gulp": "gulp --max_old_space_size=4095", "7z": "7z", "update-grammars": "node build/npm/update-all-grammars.js", "update-localization-extension": "node build/npm/update-localization-extension.js", - "smoketest": "cd test/smoke && mocha", - "monaco-compile-check": "tsc -p src/tsconfig.monaco.json --noEmit" + "smoketest": "cd test/smoke && node test/index.js", + "monaco-compile-check": "tsc -p src/tsconfig.monaco.json --noEmit", + "download-builtin-extensions": "node build/lib/builtInExtensions.js", + "check-monaco-editor-compilation": "tsc -p src/tsconfig.monaco.json --noEmit" }, "dependencies": { "@angular/animations": "~4.1.3", @@ -33,7 +36,6 @@ "@angular/platform-browser-dynamic": "~4.1.3", "@angular/router": "~4.1.3", "@angular/upgrade": "~4.1.3", - "@types/chart.js": "^2.7.31", "angular2-grid": "2.0.6", "angular2-slickgrid": "github:Microsoft/angular2-slickgrid#1.4.4", "applicationinsights": "0.18.0", @@ -41,39 +43,39 @@ "fast-plist": "0.1.2", "fs-extra": "^3.0.1", "gc-signals": "^0.0.1", - "getmac": "1.0.7", + "getmac": "1.4.1", "graceful-fs": "4.1.11", "html-query-plan": "git://github.com/anthonydresser/html-query-plan.git#2.4", "http-proxy-agent": "^2.1.0", "https-proxy-agent": "^2.2.1", - "iconv-lite": "0.4.19", + "iconv-lite": "0.4.23", "jquery": "3.1.0", "jschardet": "1.6.0", - "keytar": "^4.0.5", + "keytar": "4.2.1", "minimist": "1.2.0", "native-is-elevated": "^0.2.1", "native-keymap": "1.2.5", "native-watchdog": "0.3.0", "ng2-charts": "^1.6.0", - "node-pty": "0.7.4", + "node-pty": "0.7.6", "nsfw": "1.0.16", "pretty-data": "^0.40.0", "reflect-metadata": "^0.1.8", "rxjs": "5.4.0", - "semver": "4.3.6", - "slickgrid": "github:anthonydresser/SlickGrid#2.3.27", - "spdlog": "0.6.0", - "sudo-prompt": "^8.0.0", + "semver": "^5.5.0", + "slickgrid": "github:anthonydresser/SlickGrid#2.3.25", + "spdlog": "0.7.1", + "sudo-prompt": "8.2.0", "svg.js": "^2.2.5", - "v8-inspect-profiler": "^0.0.7", + "v8-inspect-profiler": "^0.0.8", "vscode-chokidar": "1.6.2", - "vscode-debugprotocol": "1.28.0", + "vscode-debugprotocol": "1.31.0", "vscode-nsfw": "1.0.17", - "vscode-ripgrep": "^0.8.1", - "vscode-textmate": "^3.3.3", - "vscode-xterm": "3.4.0-beta3", - "winreg": "1.2.0", - "yauzl": "2.8.0", + "vscode-ripgrep": "^1.0.1", + "vscode-textmate": "^4.0.1", + "vscode-xterm": "3.6.0-beta13", + "winreg": "^1.2.4", + "yauzl": "^2.9.1", "zone.js": "^0.8.4" }, "devDependencies": { @@ -132,7 +134,7 @@ "minimatch": "^2.0.10", "mkdirp": "^0.5.0", "mocha": "^2.2.5", - "mocha-junit-reporter": "^1.13.0", + "mocha-junit-reporter": "^1.17.0", "object-assign": "^4.0.1", "optimist": "0.3.5", "p-all": "^1.0.0", @@ -144,7 +146,7 @@ "source-map": "^0.4.4", "tslint": "^5.9.1", "typemoq": "^0.3.2", - "typescript": "2.8.1", + "typescript": "2.9.2", "typescript-formatter": "7.1.0", "uglify-es": "^3.0.18", "underscore": "^1.8.3", diff --git a/product.json b/product.json index 2fa7d7fb18..51d773b62f 100644 --- a/product.json +++ b/product.json @@ -11,6 +11,8 @@ "win32RegValueName": "sqlops", "win32AppId": "{{E34003BB-9E10-4501-8C11-1234AA83F23F}", "win32x64AppId": "{{EA457B21-9E10-494C-ACAB-1234DE069978}", + "win32UserAppId": "{{C6065F05-9603-4FC4-8101-B9781A25D88E}", + "win32x64UserAppId": "{{C6065F05-9603-4FC4-8101-B9781A25D88E}", "win32AppUserModelId": "Microsoft.sqlops", "win32ShellNameShort": "SQL Operations Studio", "darwinBundleIdentifier": "com.sqlopsstudio.oss", @@ -30,7 +32,7 @@ "gettingStartedUrl": "https://go.microsoft.com/fwlink/?linkid=862039", "releaseNotesUrl": "https://go.microsoft.com/fwlink/?linkid=875578", "documentationUrl": "https://go.microsoft.com/fwlink/?linkid=862277", - "vscodeVersion": "1.23.1", + "vscodeVersion": "1.26.1", "commit": "9ca6200018fc206d67a47229f991901a8a453781", "date": "2017-12-15T12:00:00.000Z", "recommendedExtensions": [ diff --git a/resources/linux/debian/control.template b/resources/linux/debian/control.template index f7ce86e62e..25ec0093f3 100644 --- a/resources/linux/debian/control.template +++ b/resources/linux/debian/control.template @@ -1,7 +1,7 @@ Package: @@NAME@@ Version: @@VERSION@@ Section: devel -Depends: libnotify4, libnss3, gnupg, apt, libxkbfile1, libgconf-2-4, libsecret-1-0, libunwind8 +Depends: libnotify4, libnss3 (>= 2:3.26), gnupg, apt, libxkbfile1, libgconf-2-4, libsecret-1-0, libgtk-3-0 (>= 3.10.0), libunwind8 Priority: optional Architecture: @@ARCHITECTURE@@ Maintainer: Microsoft Corporation diff --git a/resources/linux/rpm/dependencies.json b/resources/linux/rpm/dependencies.json index e78bf4f85c..c2ae8b8fe3 100644 --- a/resources/linux/rpm/dependencies.json +++ b/resources/linux/rpm/dependencies.json @@ -4,7 +4,7 @@ "libpthread.so.0(GLIBC_2.2.5)(64bit)", "libpthread.so.0(GLIBC_2.3.2)(64bit)", "libpthread.so.0(GLIBC_2.3.3)(64bit)", - "libgtk-x11-2.0.so.0()(64bit)", + "libgtk-3.so.0()(64bit)", "libgdk-x11-2.0.so.0()(64bit)", "libatk-1.0.so.0()(64bit)", "libgio-2.0.so.0()(64bit)", @@ -114,7 +114,7 @@ "libglib-2.0.so.0", "libgmodule-2.0.so.0", "libgobject-2.0.so.0", - "libgtk-x11-2.0.so.0", + "libgtk-3.so.0", "libm.so.6", "libm.so.6(GLIBC_2.0)", "libm.so.6(GLIBC_2.1)", diff --git a/resources/win32/bin/code.sh b/resources/win32/bin/code.sh index f6338a227d..b95bf7983b 100644 --- a/resources/win32/bin/code.sh +++ b/resources/win32/bin/code.sh @@ -7,14 +7,20 @@ NAME="@@NAME@@" VSCODE_PATH="$(dirname "$(dirname "$(realpath "$0")")")" ELECTRON="$VSCODE_PATH/$NAME.exe" if grep -q Microsoft /proc/version; then - # If running under WSL don't pass cli.js to Electron as environment vars - # cannot be transferred from WSL to Windows - # See: https://github.com/Microsoft/BashOnWindows/issues/1363 - # https://github.com/Microsoft/BashOnWindows/issues/1494 - "$ELECTRON" "$@" - exit $? -fi -if [ "$(expr substr $(uname -s) 1 9)" == "CYGWIN_NT" ]; then + if [ -x /bin/wslpath ]; then + # On recent WSL builds, we just need to set WSLENV so that + # ELECTRON_RUN_AS_NODE is visible to the win32 process + export WSLENV=ELECTRON_RUN_AS_NODE/w:$WSLENV + CLI=$(wslpath -m "$VSCODE_PATH/resources/app/out/cli.js") + else + # If running under older WSL, don't pass cli.js to Electron as + # environment vars cannot be transferred from WSL to Windows + # See: https://github.com/Microsoft/BashOnWindows/issues/1363 + # https://github.com/Microsoft/BashOnWindows/issues/1494 + "$ELECTRON" "$@" + exit $? + fi +elif [ "$(expr substr $(uname -s) 1 9)" == "CYGWIN_NT" ]; then CLI=$(cygpath -m "$VSCODE_PATH/resources/app/out/cli.js") else CLI="$VSCODE_PATH/resources/app/out/cli.js" diff --git a/scripts/code-cli.bat b/scripts/code-cli.bat index f08ddb744e..7bca260314 100644 --- a/scripts/code-cli.bat +++ b/scripts/code-cli.bat @@ -29,7 +29,7 @@ set ELECTRON_ENABLE_LOGGING=1 set ELECTRON_ENABLE_STACK_DUMPING=1 :: Launch Code -%CODE% --debug=5874 out\cli.js . %* +%CODE% --inspect=5874 out\cli.js . %* popd endlocal diff --git a/scripts/code-cli.sh b/scripts/code-cli.sh index 89e518322f..ba2121d9bb 100755 --- a/scripts/code-cli.sh +++ b/scripts/code-cli.sh @@ -32,7 +32,7 @@ function code() { VSCODE_DEV=1 \ ELECTRON_ENABLE_LOGGING=1 \ ELECTRON_ENABLE_STACK_DUMPING=1 \ - "$CODE" --debug=5874 "$ROOT/out/cli.js" . "$@" + "$CODE" --inspect=5874 "$ROOT/out/cli.js" . "$@" } code "$@" diff --git a/scripts/code.sh b/scripts/code.sh index f6d103ceda..26332faea6 100755 --- a/scripts/code.sh +++ b/scripts/code.sh @@ -3,6 +3,10 @@ if [[ "$OSTYPE" == "darwin"* ]]; then realpath() { [[ $1 = /* ]] && echo "$1" || echo "$PWD/${1#./}"; } ROOT=$(dirname "$(dirname "$(realpath "$0")")") + + # On Linux with Electron 2.0.x running out of a VM causes + # a freeze so we only enable this flag on macOS + export ELECTRON_ENABLE_LOGGING=1 else ROOT=$(dirname "$(dirname "$(readlink -f $0)")") fi @@ -40,7 +44,6 @@ function code() { export NODE_ENV=development export VSCODE_DEV=1 export VSCODE_CLI=1 - export ELECTRON_ENABLE_LOGGING=1 export ELECTRON_ENABLE_STACK_DUMPING=1 # Launch Code diff --git a/scripts/monaco-editor-setup.js b/scripts/monaco-editor-setup.js deleted file mode 100644 index c656306d5c..0000000000 --- a/scripts/monaco-editor-setup.js +++ /dev/null @@ -1,38 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the Source EULA. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -'use strict'; - -var fs = require('fs'); -var cp = require('child_process'); -var path = require('path'); - -var ROOT = path.join(__dirname, '..'); -var ROOT_NODE_MODULES_PATH = path.join(ROOT, 'node_modules'); -var EDITOR_ROOT = path.join(ROOT, 'build/monaco') -var EDITOR_NODE_MODULES_PATH = path.join(EDITOR_ROOT, 'node_modules') - -var cmd = `npm install`; -cp.execSync(cmd, { - cwd: EDITOR_ROOT, - stdio:[0,1,2] -}); - -if (!fs.existsSync(ROOT_NODE_MODULES_PATH)) { - fs.mkdirSync(ROOT_NODE_MODULES_PATH); -} - -// Move deps over -var modules = fs.readdirSync(EDITOR_NODE_MODULES_PATH); -modules.forEach(function(module) { - var src = path.join(EDITOR_NODE_MODULES_PATH, module); - var dst = path.join(ROOT_NODE_MODULES_PATH, module); - if (!fs.existsSync(dst)) { - console.log('Moving ' + module + '...'); - fs.renameSync(src, dst); - } else { - console.log('Skipping moving ' + module + '.'); - } -}); diff --git a/scripts/node-electron.sh b/scripts/node-electron.sh index febdb7cb89..7216e92a6c 100644 --- a/scripts/node-electron.sh +++ b/scripts/node-electron.sh @@ -7,26 +7,28 @@ else ROOT=$(dirname $(dirname $(readlink -f $0))) fi -cd $ROOT +pushd $ROOT if [[ "$OSTYPE" == "darwin"* ]]; then NAME=`node -p "require('./product.json').nameLong"` - CODE="./.build/electron/$NAME.app/Contents/MacOS/Electron" + CODE="$ROOT/.build/electron/$NAME.app/Contents/MacOS/Electron" else NAME=`node -p "require('./product.json').applicationName"` - CODE=".build/electron/$NAME" + CODE="$ROOT/.build/electron/$NAME" fi # Get electron node build/lib/electron.js || ./node_modules/.bin/gulp electron +popd + export VSCODE_DEV=1 if [[ "$OSTYPE" == "darwin"* ]]; then - cd $ROOT ; ulimit -n 4096 ; ELECTRON_RUN_AS_NODE=1 \ + ulimit -n 4096 ; ELECTRON_RUN_AS_NODE=1 \ "$CODE" \ "$@" else - cd $ROOT ; ELECTRON_RUN_AS_NODE=1 \ + ELECTRON_RUN_AS_NODE=1 \ "$CODE" \ "$@" fi diff --git a/scripts/test-electron.bat b/scripts/test-electron.bat deleted file mode 100644 index 0f7ce8e9a8..0000000000 --- a/scripts/test-electron.bat +++ /dev/null @@ -1,19 +0,0 @@ -@echo off -setlocal - -set ELECTRON_RUN_AS_NODE= - -pushd %~dp0\.. - -for /f "tokens=2 delims=:," %%a in ('findstr /R /C:"\"nameShort\":.*" product.json') do set NAMESHORT=%%~a -set NAMESHORT=%NAMESHORT: "=% -set NAMESHORT=%NAMESHORT:"=%.exe -set CODE=".build\electron\%NAMESHORT%" - -rem Run tests in electron -%CODE% .\test\electron\index.js %* - -popd - -endlocal -exit /b %errorlevel% diff --git a/scripts/test-electron.sh b/scripts/test-electron.sh deleted file mode 100755 index c8318a434d..0000000000 --- a/scripts/test-electron.sh +++ /dev/null @@ -1,42 +0,0 @@ -#!/bin/bash - -if [[ "$OSTYPE" == "darwin"* ]]; then - realpath() { [[ $1 = /* ]] && echo "$1" || echo "$PWD/${1#./}"; } - ROOT=$(dirname $(dirname $(realpath "$0"))) -else - ROOT=$(dirname $(dirname $(readlink -f $0))) -fi - -cd $ROOT - -if [[ "$OSTYPE" == "darwin"* ]]; then - NAME=`node -p "require('./product.json').nameLong"` - CODE="./.build/electron/$NAME.app/Contents/MacOS/Electron" -else - NAME=`node -p "require('./product.json').applicationName"` - CODE=".build/electron/$NAME" -fi - -INTENDED_VERSION="v`node -p "require('./package.json').electronVersion"`" -INSTALLED_VERSION=$(cat .build/electron/version 2> /dev/null) - -# Node modules -test -d node_modules || ./scripts/npm.sh install - -# Get electron -(test -f "$CODE" && [ $INTENDED_VERSION == $INSTALLED_VERSION ]) || ./node_modules/.bin/gulp electron - -# Build -test -d out || ./node_modules/.bin/gulp compile -echo "code $CODE" -# Unit Tests -export VSCODE_DEV=1 -if [[ "$OSTYPE" == "darwin"* ]]; then - cd $ROOT ; ulimit -n 4096 ; \ - "$CODE" \ - test/electron/index.js "$@" -else - cd $ROOT ; \ - "$CODE" \ - test/electron/index.js "$@" -fi diff --git a/scripts/test-int-mocha.bat b/scripts/test-int-mocha.bat deleted file mode 100644 index 482aadc5bd..0000000000 --- a/scripts/test-int-mocha.bat +++ /dev/null @@ -1 +0,0 @@ -.\scripts\test.bat --runGlob **\*.integrationTest.js -g integration %* diff --git a/scripts/test-int-mocha.sh b/scripts/test-int-mocha.sh deleted file mode 100755 index c0a8913886..0000000000 --- a/scripts/test-int-mocha.sh +++ /dev/null @@ -1 +0,0 @@ -./scripts/test.sh --runGlob **/*.integrationTest.js -g integration "$@" \ No newline at end of file diff --git a/scripts/test-integration.bat b/scripts/test-integration.bat index 11bddffa8d..929b92b9bc 100644 --- a/scripts/test-integration.bat +++ b/scripts/test-integration.bat @@ -3,9 +3,6 @@ setlocal pushd %~dp0\.. -if not "%APPVEYOR%" == "" ( - set ELECTRON_RUN_AS_NODE= -) set VSCODEUSERDATADIR=%TMP%\vscodeuserfolder-%RANDOM%-%TIME:~6,5% :: Tests in the extension host diff --git a/scripts/test-integration.sh b/scripts/test-integration.sh index 070c972cb4..a48257ad4f 100755 --- a/scripts/test-integration.sh +++ b/scripts/test-integration.sh @@ -15,6 +15,8 @@ cd $ROOT # Tests in the extension host ./scripts/code.sh $ROOT/extensions/vscode-api-tests/testWorkspace --extensionDevelopmentPath=$ROOT/extensions/vscode-api-tests --extensionTestsPath=$ROOT/extensions/vscode-api-tests/out --disableExtensions --user-data-dir=$VSCODEUSERDATADIR --skip-getting-started ./scripts/code.sh $ROOT/extensions/vscode-colorize-tests/test --extensionDevelopmentPath=$ROOT/extensions/vscode-colorize-tests --extensionTestsPath=$ROOT/extensions/vscode-colorize-tests/out --disableExtensions --user-data-dir=$VSCODEUSERDATADIR --skip-getting-started +./scripts/code.sh $ROOT/extensions/markdown-language-features/test-fixtures --extensionDevelopmentPath=$ROOT/extensions/markdown-language-features --extensionTestsPath=$ROOT/extensions/markdown-language-features/out/test --disableExtensions --user-data-dir=$VSCODEUSERDATADIR --skip-getting-started + mkdir $ROOT/extensions/emmet/test-fixtures ./scripts/code.sh $ROOT/extensions/emmet/test-fixtures --extensionDevelopmentPath=$ROOT/extensions/emmet --extensionTestsPath=$ROOT/extensions/emmet/out/test --disableExtensions --user-data-dir=$VSCODEUSERDATADIR --skip-getting-started . rm -r $ROOT/extensions/emmet/test-fixtures @@ -22,7 +24,8 @@ rm -r $ROOT/extensions/emmet/test-fixtures # Integration tests in AMD ./scripts/test.sh --runGlob **/*.integrationTest.js "$@" -# Tests in commonJS (HTML, CSS, JSON language server tests...) -./scripts/node-electron.sh ./node_modules/mocha/bin/_mocha ./extensions/*/server/out/test/ +# Tests in commonJS +cd $ROOT/extensions/css-language-features/server && $ROOT/scripts/node-electron.sh test/index.js +cd $ROOT/extensions/html-language-features/server && $ROOT/scripts/node-electron.sh test/index.js rm -r $VSCODEUSERDATADIR diff --git a/scripts/test-mocha.bat b/scripts/test-mocha.bat deleted file mode 100644 index e1aa4bef47..0000000000 --- a/scripts/test-mocha.bat +++ /dev/null @@ -1,25 +0,0 @@ -@echo off -setlocal - -set ELECTRON_RUN_AS_NODE=1 - -pushd %~dp0\.. - -for /f "tokens=2 delims=:," %%a in ('findstr /R /C:"\"nameShort\":.*" product.json') do set NAMESHORT=%%~a -set NAMESHORT=%NAMESHORT: "=% -set NAMESHORT=%NAMESHORT:"=%.exe -set CODE=".build\electron\%NAMESHORT%" - -rem TFS Builds -if not "%BUILD_BUILDID%" == "" ( - %CODE% .\node_modules\mocha\bin\_mocha %* -) - -rem Otherwise -if "%BUILD_BUILDID%" == "" ( - %CODE% .\node_modules\mocha\bin\_mocha --reporter dot %* -) -popd - -endlocal -exit /b %errorlevel% \ No newline at end of file diff --git a/scripts/test-mocha.sh b/scripts/test-mocha.sh deleted file mode 100755 index 9aa16fa324..0000000000 --- a/scripts/test-mocha.sh +++ /dev/null @@ -1,42 +0,0 @@ -#!/bin/bash - -if [[ "$OSTYPE" == "darwin"* ]]; then - realpath() { [[ $1 = /* ]] && echo "$1" || echo "$PWD/${1#./}"; } - ROOT=$(dirname $(dirname $(realpath "$0"))) -else - ROOT=$(dirname $(dirname $(readlink -f $0))) -fi - -cd $ROOT - -if [[ "$OSTYPE" == "darwin"* ]]; then - NAME=`node -p "require('./product.json').nameLong"` - CODE="./.build/electron/$NAME.app/Contents/MacOS/Electron" -else - NAME=`node -p "require('./product.json').applicationName"` - CODE=".build/electron/$NAME" -fi - -INTENDED_VERSION="v`node -p "require('./package.json').electronVersion"`" -INSTALLED_VERSION=$(cat .build/electron/version 2> /dev/null) - -# Node modules -test -d node_modules || ./scripts/npm.sh install - -# Get electron -(test -f "$CODE" && [ $INTENDED_VERSION == $INSTALLED_VERSION ]) || ./node_modules/.bin/gulp electron - -# Build -test -d out || ./node_modules/.bin/gulp compile - -# Unit Tests -export VSCODE_DEV=1 -if [[ "$OSTYPE" == "darwin"* ]]; then - cd $ROOT ; ulimit -n 4096 ; ELECTRON_RUN_AS_NODE=1 \ - "$CODE" \ - node_modules/mocha/bin/_mocha "$@" -else - cd $ROOT ; ELECTRON_RUN_AS_NODE=1 \ - "$CODE" \ - node_modules/mocha/bin/_mocha "$@" -fi diff --git a/scripts/test-release.bat b/scripts/test-release.bat new file mode 100644 index 0000000000..cb9c3b205c --- /dev/null +++ b/scripts/test-release.bat @@ -0,0 +1,15 @@ +@echo off +setlocal + +pushd %~dp0\.. + +:: Endgame tests in AMD +call .\scripts\test.bat --runGlob **\*.releaseTest.js %* +if %errorlevel% neq 0 exit /b %errorlevel% + + +rmdir /s /q %VSCODEUSERDATADIR% + +popd + +endlocal diff --git a/scripts/test-release.sh b/scripts/test-release.sh new file mode 100755 index 0000000000..f7a0800dc9 --- /dev/null +++ b/scripts/test-release.sh @@ -0,0 +1,19 @@ +#!/bin/bash +set -e + +if [[ "$OSTYPE" == "darwin"* ]]; then + realpath() { [[ $1 = /* ]] && echo "$1" || echo "$PWD/${1#./}"; } + ROOT=$(dirname $(dirname $(realpath "$0"))) + VSCODEUSERDATADIR=`mktemp -d -t 'myuserdatadir'` +else + ROOT=$(dirname $(dirname $(readlink -f $0))) + VSCODEUSERDATADIR=`mktemp -d 2>/dev/null` +fi + +cd $ROOT + +# Tests in AMD +./scripts/test.sh --runGlob **/*.releaseTest.js "$@" + + +rm -r $VSCODEUSERDATADIR diff --git a/scripts/test.sh b/scripts/test.sh index 8e3d3d9046..c38bc3d110 100755 --- a/scripts/test.sh +++ b/scripts/test.sh @@ -4,6 +4,10 @@ if [[ "$OSTYPE" == "darwin"* ]]; then realpath() { [[ $1 = /* ]] && echo "$1" || echo "$PWD/${1#./}"; } ROOT=$(dirname $(dirname $(realpath "$0"))) + + # On Linux with Electron 2.0.x running out of a VM causes + # a freeze so we only enable this flag on macOS + export ELECTRON_ENABLE_LOGGING=1 else ROOT=$(dirname $(dirname $(readlink -f $0))) fi @@ -25,7 +29,6 @@ test -d node_modules || yarn node build/lib/electron.js || ./node_modules/.bin/gulp electron # Unit Tests -export ELECTRON_ENABLE_LOGGING=1 export ELECTRON_RUN_AS_NODE=1 if [[ "$OSTYPE" == "darwin"* ]]; then cd $ROOT ; ulimit -n 4096 ; \ diff --git a/src/bootstrap-amd.js b/src/bootstrap-amd.js index 193b752e42..71b5f23473 100644 --- a/src/bootstrap-amd.js +++ b/src/bootstrap-amd.js @@ -29,6 +29,8 @@ function readFile(file) { }); } +const writeFile = (file, content) => new Promise((c, e) => fs.writeFile(file, content, 'utf8', err => err ? e(err) : c())); + var rawNlsConfig = process.env['VSCODE_NLS_CONFIG']; var nlsConfig = rawNlsConfig ? JSON.parse(rawNlsConfig) : { availableLanguages: {} }; @@ -46,8 +48,15 @@ if (nlsConfig._resolvedLanguagePackCoreLocation) { let json = JSON.parse(content); bundles[bundle] = json; cb(undefined, json); - }) - .catch(cb); + }).catch((error) => { + try { + if (nlsConfig._corruptedFile) { + writeFile(nlsConfig._corruptedFile, 'corrupted').catch(function (error) { console.error(error); }); + } + } finally { + cb(error, undefined); + } + }); }; } @@ -60,6 +69,11 @@ loader.config({ nodeCachedDataDir: process.env['VSCODE_NODE_CACHED_DATA_DIR_' + process.pid] }); +if (process.env['ELECTRON_RUN_AS_NODE'] || process.versions.electron) { + // running in Electron + loader.define('fs', ['original-fs'], function (originalFS) { return originalFS; }); // replace the patched electron fs with the original node fs for all AMD code +} + if (nlsConfig.pseudo) { loader(['vs/nls'], function (nlsPlugin) { nlsPlugin.setPseudoTranslation(nlsConfig.pseudo); diff --git a/src/cli.js b/src/cli.js index 4adcbe0a7e..fb0ed70208 100644 --- a/src/cli.js +++ b/src/cli.js @@ -3,6 +3,51 @@ * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ +Error.stackTraceLimit = 100; // increase number of stack frames (from 10, https://github.com/v8/v8/wiki/Stack-Trace-API) + +const fs = require('fs'); +const path = require('path'); +const product = require('../product.json'); +const appRoot = path.dirname(__dirname); + +function getApplicationPath() { + if (process.env['VSCODE_DEV']) { + return appRoot; + } else if (process.platform === 'darwin') { + return path.dirname(path.dirname(path.dirname(appRoot))); + } else { + return path.dirname(path.dirname(appRoot)); + } +} + +function getPortableDataPath() { + if (process.env['VSCODE_PORTABLE']) { + return process.env['VSCODE_PORTABLE']; + } + + if (process.platform === 'win32' || process.platform === 'linux') { + return path.join(getApplicationPath(), 'data'); + } else { + const portableDataName = product.portable || `${product.applicationName}-portable-data`; + return path.join(path.dirname(getApplicationPath()), portableDataName); + } +} + +const portableDataPath = getPortableDataPath(); +const isPortable = fs.existsSync(portableDataPath); +const portableTempPath = path.join(portableDataPath, 'tmp'); +const isTempPortable = isPortable && fs.existsSync(portableTempPath); + +if (isPortable) { + process.env['VSCODE_PORTABLE'] = portableDataPath; +} else { + delete process.env['VSCODE_PORTABLE']; +} + +if (isTempPortable) { + process.env[process.platform === 'win32' ? 'TEMP' : 'TMPDIR'] = portableTempPath; +} + //#region Add support for using node_modules.asar (function () { const path = require('path'); diff --git a/src/main.js b/src/main.js index c16a4bde95..470acd80d2 100644 --- a/src/main.js +++ b/src/main.js @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ 'use strict'; -let perf = require('./vs/base/common/performance'); +const perf = require('./vs/base/common/performance'); perf.mark('main:started'); // Perf measurements @@ -12,6 +12,49 @@ global.perfStartTime = Date.now(); Error.stackTraceLimit = 100; // increase number of stack frames (from 10, https://github.com/v8/v8/wiki/Stack-Trace-API) +const fs = require('fs'); +const path = require('path'); +const product = require('../product.json'); +const appRoot = path.dirname(__dirname); + +function getApplicationPath() { + if (process.env['VSCODE_DEV']) { + return appRoot; + } else if (process.platform === 'darwin') { + return path.dirname(path.dirname(path.dirname(appRoot))); + } else { + return path.dirname(path.dirname(appRoot)); + } +} + +function getPortableDataPath() { + if (process.env['VSCODE_PORTABLE']) { + return process.env['VSCODE_PORTABLE']; + } + + if (process.platform === 'win32' || process.platform === 'linux') { + return path.join(getApplicationPath(), 'data'); + } else { + const portableDataName = product.portable || `${product.applicationName}-portable-data`; + return path.join(path.dirname(getApplicationPath()), portableDataName); + } +} + +const portableDataPath = getPortableDataPath(); +const isPortable = fs.existsSync(portableDataPath); +const portableTempPath = path.join(portableDataPath, 'tmp'); +const isTempPortable = isPortable && fs.existsSync(portableTempPath); + +if (isPortable) { + process.env['VSCODE_PORTABLE'] = portableDataPath; +} else { + delete process.env['VSCODE_PORTABLE']; +} + +if (isTempPortable) { + process.env[process.platform === 'win32' ? 'TEMP' : 'TMPDIR'] = portableTempPath; +} + //#region Add support for using node_modules.asar (function () { const path = require('path'); @@ -36,16 +79,41 @@ Error.stackTraceLimit = 100; // increase number of stack frames (from 10, https: })(); //#endregion -let app = require('electron').app; -let fs = require('fs'); -let path = require('path'); -let minimist = require('minimist'); -let paths = require('./paths'); +const app = require('electron').app; -let args = minimist(process.argv, { - string: ['user-data-dir', 'locale'] +// TODO@Ben Electron 2.0.x: prevent localStorage migration from SQLite to LevelDB due to issues +app.commandLine.appendSwitch('disable-mojo-local-storage'); + +// TODO@Ben Electron 2.0.x: force srgb color profile (for https://github.com/Microsoft/vscode/issues/51791) +// This also seems to fix: https://github.com/Microsoft/vscode/issues/48043 +app.commandLine.appendSwitch('force-color-profile', 'srgb'); + +const minimist = require('minimist'); +const paths = require('./paths'); + +const args = minimist(process.argv, { + string: [ + 'user-data-dir', + 'locale', + 'js-flags', + 'max-memory' + ] }); +function getUserDataPath() { + if (isPortable) { + return path.join(portableDataPath, 'user-data'); + } + + return path.resolve(args['user-data-dir'] || paths.getDefaultUserDataPath(process.platform)); +} + +const userDataPath = getUserDataPath(); + +// Set userData path before app 'ready' event and call to process.chdir +app.setPath('userData', userDataPath); + +//#region NLS function stripComments(content) { let regexp = /("(?:[^\\\"]*(?:\\.)?)*")|('(?:[^\\\']*(?:\\.)?)*')|(\/\*(?:\r?\n|.)*?\*\/)|(\/{2,}.*?(?:(?:\r?\n)|$))/g; let result = content.replace(regexp, function (match, m1, m2, m3, m4) { @@ -70,113 +138,58 @@ function stripComments(content) { return result; } -let _commit; -function getCommit() { - if (_commit) { - return _commit; - } - if (_commit === null) { - return undefined; - } - try { - let productJson = require(path.join(__dirname, '../product.json')); - if (productJson.commit) { - _commit = productJson.commit; - } else { - _commit = null; - } - } catch (exp) { - _commit = null; - } - return _commit || undefined; -} +const mkdir = dir => new Promise((c, e) => fs.mkdir(dir, err => (err && err.code !== 'EEXIST') ? e(err) : c(dir))); +const exists = file => new Promise(c => fs.exists(file, c)); +const readFile = file => new Promise((c, e) => fs.readFile(file, 'utf8', (err, data) => err ? e(err) : c(data))); +const writeFile = (file, content) => new Promise((c, e) => fs.writeFile(file, content, 'utf8', err => err ? e(err) : c())); +const touch = file => new Promise((c, e) => { const d = new Date(); fs.utimes(file, d, d, err => err ? e(err) : c()); }); +const lstat = file => new Promise((c, e) => fs.lstat(file, (err, stats) => err ? e(err) : c(stats))); +const readdir = dir => new Promise((c, e) => fs.readdir(dir, (err, files) => err ? e(err) : c(files))); +const rmdir = dir => new Promise((c, e) => fs.rmdir(dir, err => err ? e(err) : c(undefined))); +const unlink = file => new Promise((c, e) => fs.unlink(file, err => err ? e(err) : c(undefined))); function mkdirp(dir) { - return mkdir(dir) - .then(null, (err) => { - if (err && err.code === 'ENOENT') { - let parent = path.dirname(dir); - if (parent !== dir) { // if not arrived at root - return mkdirp(parent) - .then(() => { - return mkdir(dir); - }); - } - } - throw err; - }); -} + return mkdir(dir).then(null, err => { + if (err && err.code === 'ENOENT') { + const parent = path.dirname(dir); -function mkdir(dir) { - return new Promise((resolve, reject) => { - fs.mkdir(dir, (err) => { - if (err && err.code !== 'EEXIST') { - reject(err); - } else { - resolve(dir); + if (parent !== dir) { // if not arrived at root + return mkdirp(parent).then(() => mkdir(dir)); } - }); + } + + throw err; }); } -function exists(file) { - return new Promise((resolve) => { - fs.exists(file, (result) => { - resolve(result); - }); +function rimraf(location) { + return lstat(location).then(stat => { + if (stat.isDirectory() && !stat.isSymbolicLink()) { + return readdir(location) + .then(children => Promise.all(children.map(child => rimraf(path.join(location, child))))) + .then(() => rmdir(location)); + } else { + return unlink(location); + } + }, (err) => { + if (err.code === 'ENOENT') { + return void 0; + } + throw err; }); } -function readFile(file) { - return new Promise((resolve, reject) => { - fs.readFile(file, 'utf8', (err, data) => { - if (err) { - reject(err); - return; - } - resolve(data); - }); - }); -} +function resolveJSFlags(...jsFlags) { -function writeFile(file, content) { - return new Promise((resolve, reject) => { - fs.writeFile(file, content, 'utf8', (err) => { - if (err) { - reject(err); - return; - } - resolve(undefined); - }); - }); -} - -function touch(file) { - return new Promise((resolve, reject) => { - let d = new Date(); - fs.utimes(file, d, d, (err) => { - if (err) { - reject(err); - return; - } - resolve(undefined); - }); - }); -} - -function resolveJSFlags() { - let jsFlags = []; if (args['js-flags']) { jsFlags.push(args['js-flags']); } + if (args['max-memory'] && !/max_old_space_size=(\d+)/g.exec(args['js-flags'])) { jsFlags.push(`--max_old_space_size=${args['max-memory']}`); } - if (jsFlags.length > 0) { - return jsFlags.join(' '); - } else { - return null; - } + + return jsFlags.length > 0 ? jsFlags.join(' ') : null; } // Language tags are case insensitve however an amd loader is case sensitive @@ -190,8 +203,7 @@ function getUserDefinedLocale() { return Promise.resolve(locale.toLowerCase()); } - let userData = app.getPath('userData'); - let localeConfig = path.join(userData, 'User', 'locale.json'); + let localeConfig = path.join(userDataPath, 'User', 'locale.json'); return exists(localeConfig).then((result) => { if (result) { return readFile(localeConfig).then((content) => { @@ -210,8 +222,7 @@ function getUserDefinedLocale() { } function getLanguagePackConfigurations() { - let userData = app.getPath('userData'); - let configFile = path.join(userData, 'languagepacks.json'); + let configFile = path.join(userDataPath, 'languagepacks.json'); try { return require(configFile); } catch (err) { @@ -250,8 +261,6 @@ function getNLSConfiguration(locale) { return Promise.resolve({ locale: locale, availableLanguages: {} }); } - let userData = app.getPath('userData'); - // We have a built version so we have extracted nls file. Try to find // the right file to use. @@ -263,50 +272,21 @@ function getNLSConfiguration(locale) { let initialLocale = locale; - function resolveLocale(locale) { - while (locale) { - let candidate = path.join(__dirname, 'vs', 'code', 'electron-main', 'main.nls.') + locale + '.js'; - if (fs.existsSync(candidate)) { - return { locale: initialLocale, availableLanguages: { '*': locale } }; - } else { - let index = locale.lastIndexOf('-'); - if (index > 0) { - locale = locale.substring(0, index); - } else { - locale = undefined; - } - } - } - return undefined; - } - perf.mark('nlsGeneration:start'); - let defaultResult = function(locale) { - let isCoreLanguage = true; - if (locale) { - isCoreLanguage = ['de', 'es', 'fr', 'it', 'ja', 'ko', 'ru', 'zh-cn', 'zh-tw'].some((language) => { - return locale === language || locale.startsWith(language + '-'); - }); - } - if (isCoreLanguage) { - let result = resolveLocale(locale); - perf.mark('nlsGeneration:end'); - return Promise.resolve(result); - } else { - perf.mark('nlsGeneration:end'); - return Promise.resolve({ locale: locale, availableLanguages: {} }); - } + + let defaultResult = function (locale) { + perf.mark('nlsGeneration:end'); + return Promise.resolve({ locale: locale, availableLanguages: {} }); }; try { - let commit = getCommit(); + let commit = product.commit; if (!commit) { - return defaultResult(locale); + return defaultResult(initialLocale); } let configs = getLanguagePackConfigurations(); if (!configs) { - return defaultResult(locale); + return defaultResult(initialLocale); } - let initialLocale = locale; locale = resolveLanguagePackLocale(configs, locale); if (!locale) { return defaultResult(initialLocale); @@ -314,72 +294,85 @@ function getNLSConfiguration(locale) { let packConfig = configs[locale]; let mainPack; if (!packConfig || typeof packConfig.hash !== 'string' || !packConfig.translations || typeof (mainPack = packConfig.translations['vscode']) !== 'string') { - return defaultResult(locale); + return defaultResult(initialLocale); } return exists(mainPack).then((fileExists) => { if (!fileExists) { - return defaultResult(locale); + return defaultResult(initialLocale); } let packId = packConfig.hash + '.' + locale; - let cacheRoot = path.join(userData, 'clp', packId); + let cacheRoot = path.join(userDataPath, 'clp', packId); let coreLocation = path.join(cacheRoot, commit); let translationsConfigFile = path.join(cacheRoot, 'tcf.json'); + let corruptedFile = path.join(cacheRoot, 'corrupted.info'); let result = { locale: initialLocale, availableLanguages: { '*': locale }, _languagePackId: packId, _translationsConfigFile: translationsConfigFile, _cacheRoot: cacheRoot, - _resolvedLanguagePackCoreLocation: coreLocation + _resolvedLanguagePackCoreLocation: coreLocation, + _corruptedFile: corruptedFile }; - return exists(coreLocation).then((fileExists) => { - if (fileExists) { - // We don't wait for this. No big harm if we can't touch - touch(coreLocation).catch(() => {}); - perf.mark('nlsGeneration:end'); - return result; + return exists(corruptedFile).then((corrupted) => { + // The nls cache directory is corrupted. + let toDelete; + if (corrupted) { + toDelete = rimraf(cacheRoot); + } else { + toDelete = Promise.resolve(undefined); } - return mkdirp(coreLocation).then(() => { - return Promise.all([readFile(path.join(__dirname, 'nls.metadata.json')), readFile(mainPack)]); - }).then((values) => { - let metadata = JSON.parse(values[0]); - let packData = JSON.parse(values[1]).contents; - let bundles = Object.keys(metadata.bundles); - let writes = []; - for (let bundle of bundles) { - let modules = metadata.bundles[bundle]; - let target = Object.create(null); - for (let module of modules) { - let keys = metadata.keys[module]; - let defaultMessages = metadata.messages[module]; - let translations = packData[module]; - let targetStrings; - if (translations) { - targetStrings = []; - for (let i = 0; i < keys.length; i++) { - let elem = keys[i]; - let key = typeof elem === 'string' ? elem : elem.key; - let translatedMessage = translations[key]; - if (translatedMessage === undefined) { - translatedMessage = defaultMessages[i]; - } - targetStrings.push(translatedMessage); - } - } else { - targetStrings = defaultMessages; - } - target[module] = targetStrings; + return toDelete.then(() => { + return exists(coreLocation).then((fileExists) => { + if (fileExists) { + // We don't wait for this. No big harm if we can't touch + touch(coreLocation).catch(() => { }); + perf.mark('nlsGeneration:end'); + return result; } - writes.push(writeFile(path.join(coreLocation, bundle.replace(/\//g, '!') + '.nls.json'), JSON.stringify(target))); - } - writes.push(writeFile(translationsConfigFile, JSON.stringify(packConfig.translations))); - return Promise.all(writes); - }).then(() => { - perf.mark('nlsGeneration:end'); - return result; - }).catch((err) => { - console.error('Generating translation files failed.', err); - return defaultResult(locale); + return mkdirp(coreLocation).then(() => { + return Promise.all([readFile(path.join(__dirname, 'nls.metadata.json')), readFile(mainPack)]); + }).then((values) => { + let metadata = JSON.parse(values[0]); + let packData = JSON.parse(values[1]).contents; + let bundles = Object.keys(metadata.bundles); + let writes = []; + for (let bundle of bundles) { + let modules = metadata.bundles[bundle]; + let target = Object.create(null); + for (let module of modules) { + let keys = metadata.keys[module]; + let defaultMessages = metadata.messages[module]; + let translations = packData[module]; + let targetStrings; + if (translations) { + targetStrings = []; + for (let i = 0; i < keys.length; i++) { + let elem = keys[i]; + let key = typeof elem === 'string' ? elem : elem.key; + let translatedMessage = translations[key]; + if (translatedMessage === undefined) { + translatedMessage = defaultMessages[i]; + } + targetStrings.push(translatedMessage); + } + } else { + targetStrings = defaultMessages; + } + target[module] = targetStrings; + } + writes.push(writeFile(path.join(coreLocation, bundle.replace(/\//g, '!') + '.nls.json'), JSON.stringify(target))); + } + writes.push(writeFile(translationsConfigFile, JSON.stringify(packConfig.translations))); + return Promise.all(writes); + }).then(() => { + perf.mark('nlsGeneration:end'); + return result; + }).catch((err) => { + console.error('Generating translation files failed.', err); + return defaultResult(locale); + }); + }); }); }); }); @@ -388,32 +381,41 @@ function getNLSConfiguration(locale) { return defaultResult(locale); } } +//#endregion -function getNodeCachedDataDir() { - // flag to disable cached data support - if (process.argv.indexOf('--no-cached-data') > 0) { - return Promise.resolve(undefined); +//#region Cached Data Dir +const nodeCachedDataDir = new class { + + constructor() { + this.value = this._compute(); } - // IEnvironmentService.isBuilt - if (process.env['VSCODE_DEV']) { - return Promise.resolve(undefined); + jsFlags() { + return this.value ? '--nolazy' : undefined; } - // find commit id - let commit = getCommit(); - if (!commit) { - return Promise.resolve(undefined); + ensureExists() { + return mkdirp(this.value).then(() => this.value, () => { /*ignore*/ }); } - let dir = path.join(app.getPath('userData'), 'CachedData', commit); + _compute() { + if (process.argv.indexOf('--no-cached-data') > 0) { + return undefined; + } + // IEnvironmentService.isBuilt + if (process.env['VSCODE_DEV']) { + return undefined; + } + // find commit id + let commit = product.commit; + if (!commit) { + return undefined; + } + return path.join(userDataPath, 'CachedData', commit); + } +}; - return mkdirp(dir).then(undefined, function () { /*ignore*/ }); -} - -// Set userData path before app 'ready' event and call to process.chdir -let userData = path.resolve(args['user-data-dir'] || paths.getDefaultUserDataPath(process.platform)); -app.setPath('userData', userData); +//#endregion // Update cwd based on environment and platform try { @@ -449,20 +451,6 @@ global.getOpenUrls = function () { return openUrls; }; -// use '/CachedData'-directory to store -// node/v8 cached data. -let nodeCachedDataDir = getNodeCachedDataDir().then(function (value) { - if (value) { - // store the data directory - process.env['VSCODE_NODE_CACHED_DATA_DIR_' + process.pid] = value; - - // tell v8 to not be lazy when parsing JavaScript. Generally this makes startup slower - // but because we generate cached data it makes subsequent startups much faster - let existingJSFlags = resolveJSFlags(); - app.commandLine.appendSwitch('--js-flags', existingJSFlags ? existingJSFlags + ' --nolazy' : '--nolazy'); - } - return value; -}); let nlsConfiguration = undefined; let userDefinedLocale = getUserDefinedLocale(); @@ -472,7 +460,7 @@ userDefinedLocale.then((locale) => { } }); -let jsFlags = resolveJSFlags(); +let jsFlags = resolveJSFlags(nodeCachedDataDir.jsFlags()); if (jsFlags) { app.commandLine.appendSwitch('--js-flags', jsFlags); } @@ -480,8 +468,7 @@ if (jsFlags) { // Load our code once ready app.once('ready', function () { perf.mark('main:appReady'); - Promise.all([nodeCachedDataDir, userDefinedLocale]).then((values) => { - let locale = values[1]; + Promise.all([nodeCachedDataDir.ensureExists(), userDefinedLocale]).then(([cachedDataDir, locale]) => { if (locale && !nlsConfiguration) { nlsConfiguration = getNLSConfiguration(locale); } @@ -493,6 +480,7 @@ app.once('ready', function () { nlsConfiguration.then((nlsConfig) => { let boot = (nlsConfig) => { process.env['VSCODE_NLS_CONFIG'] = JSON.stringify(nlsConfig); + if (cachedDataDir) process.env['VSCODE_NODE_CACHED_DATA_DIR_' + process.pid] = cachedDataDir; require('./bootstrap-amd').bootstrap('vs/code/electron-main/main'); }; // We recevied a valid nlsConfig from a user defined locale diff --git a/src/sql/base/browser/ui/modal/modal.ts b/src/sql/base/browser/ui/modal/modal.ts index 2c657d04e0..9f4ed5a0a7 100644 --- a/src/sql/base/browser/ui/modal/modal.ts +++ b/src/sql/base/browser/ui/modal/modal.ts @@ -291,7 +291,7 @@ export abstract class Modal extends Disposable implements IThemable { */ protected show() { this._modalShowingContext.get().push(this._staticKey); - this._builder.appendTo(document.getElementById(this._partService.getWorkbenchElementId()).parentElement); + this._builder.appendTo(document.getElementById(this._partService.getWorkbenchElementId())); this.setFocusableElements(); diff --git a/src/sql/base/browser/ui/modal/optionsDialogHelper.ts b/src/sql/base/browser/ui/modal/optionsDialogHelper.ts index 764595357f..a159abfc8d 100644 --- a/src/sql/base/browser/ui/modal/optionsDialogHelper.ts +++ b/src/sql/base/browser/ui/modal/optionsDialogHelper.ts @@ -153,7 +153,7 @@ export function findElement(container: Builder, className: string): HTMLElement var elementBuilder: Builder = container; while (elementBuilder.getHTMLElement()) { var htmlElement = elementBuilder.getHTMLElement(); - if (htmlElement.className === className) { + if (htmlElement.className.startsWith(className)) { break; } elementBuilder = elementBuilder.child(0); diff --git a/src/sql/base/browser/ui/modal/webViewDialog.ts b/src/sql/base/browser/ui/modal/webViewDialog.ts index bc9d854074..3019de5b4e 100644 --- a/src/sql/base/browser/ui/modal/webViewDialog.ts +++ b/src/sql/base/browser/ui/modal/webViewDialog.ts @@ -15,13 +15,14 @@ import { IThemeService } from 'vs/platform/theme/common/themeService'; import { IPartService, Parts } from 'vs/workbench/services/part/common/partService'; import { Event, Emitter } from 'vs/base/common/event'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; -import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; +import { IContextKeyService, IContextKey } from 'vs/platform/contextkey/common/contextkey'; import { IClipboardService } from 'vs/platform/clipboard/common/clipboardService'; import { localize } from 'vs/nls'; import { IContextViewService } from 'vs/platform/contextview/browser/contextView'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { IDisposable, toDisposable } from 'vs/base/common/lifecycle'; import { WebviewElement } from 'vs/workbench/parts/webview/electron-browser/webviewElement'; +import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; export class WebViewDialog extends Modal { @@ -40,6 +41,9 @@ export class WebViewDialog extends Modal { private contentDisposables: IDisposable[] = []; private _onMessage = new Emitter(); + protected contextKey: IContextKey; + protected findInputFocusContextKey: IContextKey; + constructor( @IThemeService private _themeService: IThemeService, @IClipboardService private _clipboardService: IClipboardService, @@ -48,6 +52,7 @@ export class WebViewDialog extends Modal { @IContextKeyService contextKeyService: IContextKeyService, @IContextViewService private _contextViewService: IContextViewService, @IEnvironmentService private _environmentService: IEnvironmentService, + @IInstantiationService private _instantiationService: IInstantiationService ) { super('', TelemetryKeys.WebView, _webViewPartService, telemetryService, contextKeyService, { isFlyout: false, hasTitleIcon: true }); this._okLabel = localize('webViewDialog.ok', 'OK'); @@ -89,18 +94,16 @@ export class WebViewDialog extends Modal { protected renderBody(container: HTMLElement) { new Builder(container).div({ 'class': 'webview-dialog' }, (bodyBuilder) => { this._body = bodyBuilder.getHTMLElement(); - this._webview = new WebviewElement( + + this._webview = this._instantiationService.createInstance(WebviewElement, this._webViewPartService.getContainer(Parts.EDITOR_PART), - this._themeService, - this._environmentService, - this._contextViewService, - undefined, - undefined, + this.contextKey, + this.findInputFocusContextKey, { - allowScripts: true, - enableWrappedPostMessage: true - } - ); + enableWrappedPostMessage: true, + allowScripts: true + }); + this._webview.mountTo(this._body); this._webview.style(this._themeService.getTheme()); diff --git a/src/sql/base/browser/ui/splitview/splitview.ts b/src/sql/base/browser/ui/splitview/splitview.ts index 169f0115ae..3d170c09d2 100644 --- a/src/sql/base/browser/ui/splitview/splitview.ts +++ b/src/sql/base/browser/ui/splitview/splitview.ts @@ -16,6 +16,7 @@ import { StandardKeyboardEvent } from 'vs/base/browser/keyboardEvent'; import { KeyCode } from 'vs/base/common/keyCodes'; import { Event, Emitter } from 'vs/base/common/event'; import { Color } from 'vs/base/common/color'; +import { SashState } from 'vs/base/browser/ui/sash/sash'; export enum Orientation { VERTICAL, @@ -928,9 +929,9 @@ export class SplitView extends lifecycle.Disposable implements this.sashes.forEach((s, i) => { if ((collapsesDown[i] && expandsUp[i + 1]) || (expandsDown[i] && collapsesUp[i + 1])) { - s.enable(); + s.state = SashState.Enabled; } else { - s.disable(); + s.state = SashState.Disabled; } }); } diff --git a/src/sql/base/browser/ui/table/asyncDataView.ts b/src/sql/base/browser/ui/table/asyncDataView.ts index 98d1528ae1..9299f10e35 100644 --- a/src/sql/base/browser/ui/table/asyncDataView.ts +++ b/src/sql/base/browser/ui/table/asyncDataView.ts @@ -1,6 +1,6 @@ /*--------------------------------------------------------------------------------------------- * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. + * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ export interface IObservableCollection { diff --git a/src/sql/parts/accountManagement/common/accountListRenderer.ts b/src/sql/parts/accountManagement/common/accountListRenderer.ts index 22818b0ccd..1a6b11532f 100644 --- a/src/sql/parts/accountManagement/common/accountListRenderer.ts +++ b/src/sql/parts/accountManagement/common/accountListRenderer.ts @@ -8,7 +8,7 @@ import 'vs/css!sql/parts/accountManagement/common/media/accountListRenderer'; import 'vs/css!sql/parts/accountManagement/common/media/accountActions'; import 'vs/css!sql/media/icons/common-icons'; import * as DOM from 'vs/base/browser/dom'; -import { IDelegate, IRenderer } from 'vs/base/browser/ui/list/list'; +import { IRenderer, IVirtualDelegate } from 'vs/base/browser/ui/list/list'; import { ActionBar, IActionOptions } from 'vs/base/browser/ui/actionbar/actionbar'; import { localize } from 'vs/nls'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; @@ -17,7 +17,7 @@ import { RemoveAccountAction, RefreshAccountAction } from 'sql/parts/accountMana import * as sqlops from 'sqlops'; -export class AccountListDelegate implements IDelegate { +export class AccountListDelegate implements IVirtualDelegate { constructor( private _height: number @@ -80,6 +80,10 @@ export class AccountPickerListRenderer implements IRenderer(' if (icon) { iconClass = id; if (typeof icon === 'string') { - const path = join(extension.description.extensionFolderPath, icon); + const path = join(extension.description.extensionLocation.fsPath, icon); createCSSRule(`.icon.${iconClass}`, `background-image: url("${URI.file(path).toString()}")`); } else { - const light = join(extension.description.extensionFolderPath, icon.light); - const dark = join(extension.description.extensionFolderPath, icon.dark); + const light = join(extension.description.extensionLocation.fsPath, icon.light); + const dark = join(extension.description.extensionLocation.fsPath, icon.dark); createCSSRule(`.icon.${iconClass}`, `background-image: url("${URI.file(light).toString()}")`); createCSSRule(`.vs-dark .icon.${iconClass}, .hc-black .icon.${iconClass}`, `background-image: url("${URI.file(dark).toString()}")`); } diff --git a/src/sql/parts/admin/common/adminService.ts b/src/sql/parts/admin/common/adminService.ts index 25ef6a9220..e44f3c6b63 100644 --- a/src/sql/parts/admin/common/adminService.ts +++ b/src/sql/parts/admin/common/adminService.ts @@ -15,7 +15,7 @@ import { CreateLoginInput } from 'sql/parts/admin/security/createLoginInput'; import { TaskDialogInput } from 'sql/parts/tasks/dialog/taskDialogInput'; import { TPromise } from 'vs/base/common/winjs.base'; -import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; +import { IEditorService, ACTIVE_GROUP } from 'vs/workbench/services/editor/common/editorService'; import { IConnectionProfile } from 'sql/parts/connection/common/interfaces'; import * as sqlops from 'sqlops'; @@ -45,7 +45,7 @@ export class AdminService implements IAdminService { constructor( @IInstantiationService private _instantiationService: IInstantiationService, - @IWorkbenchEditorService private _editorService: IWorkbenchEditorService, + @IEditorService private _editorService: IEditorService, @IConnectionManagementService private _connectionService: IConnectionManagementService, @ICapabilitiesService private _capabilitiesService: ICapabilitiesService ) { @@ -69,7 +69,7 @@ export class AdminService implements IAdminService { const self = this; return new Promise((resolve, reject) => { let input: TaskDialogInput = self._instantiationService ? self._instantiationService.createInstance(TaskDialogInput, uri, connection) : undefined; - self._editorService.openEditor(input, { pinned: true }, false); + self._editorService.openEditor(input, { pinned: true }, ACTIVE_GROUP); resolve(true); }); } @@ -92,7 +92,7 @@ export class AdminService implements IAdminService { return new Promise((resolve, reject) => { let loginInput: CreateLoginInput = self._instantiationService ? self._instantiationService.createInstance(CreateLoginInput, uri, connection) : undefined; - self._editorService.openEditor(loginInput, { pinned: true }, false); + self._editorService.openEditor(loginInput, { pinned: true }, ACTIVE_GROUP); resolve(true); }); } diff --git a/src/sql/parts/admin/security/createLoginEditor.ts b/src/sql/parts/admin/security/createLoginEditor.ts index 35f6adf916..0152fc14ec 100644 --- a/src/sql/parts/admin/security/createLoginEditor.ts +++ b/src/sql/parts/admin/security/createLoginEditor.ts @@ -19,6 +19,7 @@ import { IScriptingService } from 'sql/services/scripting/scriptingService'; import { IQueryEditorService } from 'sql/parts/query/common/queryEditorService'; import { bootstrapAngular, IBootstrapParams } from 'sql/services/bootstrap/bootstrapService'; import { CREATELOGIN_SELECTOR } from 'sql/parts/admin/security/createLogin.component'; +import { CancellationToken } from 'vs/base/common/cancellation'; export class CreateLoginEditor extends BaseEditor { @@ -55,7 +56,7 @@ export class CreateLoginEditor extends BaseEditor { public layout(dimension: DOM.Dimension): void { } - public setInput(input: CreateLoginInput, options: EditorOptions): TPromise { + public setInput(input: CreateLoginInput, options: EditorOptions): Thenable { if (this.input instanceof CreateLoginInput && this.input.matches(input)) { return TPromise.as(undefined); } @@ -65,7 +66,7 @@ export class CreateLoginEditor extends BaseEditor { } this.revealElementWithTagName(input.uniqueSelector, this.getContainer()); - return super.setInput(input, options); + return super.setInput(input, options, CancellationToken.None); } /** diff --git a/src/sql/parts/common/customInputConverter.ts b/src/sql/parts/common/customInputConverter.ts index ed08fff511..90301ea6d2 100644 --- a/src/sql/parts/common/customInputConverter.ts +++ b/src/sql/parts/common/customInputConverter.ts @@ -3,14 +3,13 @@ * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { EditorInput } from 'vs/workbench/common/editor'; +import { EditorInput, IEditorInput } from 'vs/workbench/common/editor'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { UntitledEditorInput } from 'vs/workbench/common/editor/untitledEditorInput'; import { FileEditorInput } from 'vs/workbench/parts/files/common/editors/fileEditorInput'; import { QueryResultsInput } from 'sql/parts/query/common/queryResultsInput'; import { QueryInput } from 'sql/parts/query/common/queryInput'; import URI from 'vs/base/common/uri'; -import { IEditorInput } from 'vs/platform/editor/common/editor'; import { IQueryEditorOptions } from 'sql/parts/query/common/queryEditorService'; import { QueryPlanInput } from 'sql/parts/queryPlan/queryPlanInput'; diff --git a/src/sql/parts/connection/common/connectionActions.ts b/src/sql/parts/connection/common/connectionActions.ts index dd4287a308..1ff3c4582b 100644 --- a/src/sql/parts/connection/common/connectionActions.ts +++ b/src/sql/parts/connection/common/connectionActions.ts @@ -13,7 +13,7 @@ import { IConnectionManagementService } from 'sql/parts/connection/common/connec import { INotificationService, INotificationActions } from 'vs/platform/notification/common/notification'; import Severity from 'vs/base/common/severity'; import { IDialogService, IConfirmation, IConfirmationResult } from 'vs/platform/dialogs/common/dialogs'; -import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; +import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { IObjectExplorerService } from '../../objectExplorer/common/objectExplorerService'; import { QueryInput } from 'sql/parts/query/common/queryInput'; import { EditDataInput } from 'sql/parts/editData/common/editDataInput'; @@ -146,7 +146,7 @@ export class GetCurrentConnectionStringAction extends Action { id: string, label: string, @IConnectionManagementService private _connectionManagementService: IConnectionManagementService, - @IWorkbenchEditorService private _editorService: IWorkbenchEditorService, + @IEditorService private _editorService: IEditorService, @IObjectExplorerService private _objectExplorerService: IObjectExplorerService, @INotificationService private readonly _notificationService: INotificationService, @IClipboardService private _clipboardService: IClipboardService, @@ -157,7 +157,7 @@ export class GetCurrentConnectionStringAction extends Action { public run(): TPromise { return new TPromise((resolve, reject) => { - let activeInput = this._editorService.getActiveEditorInput(); + let activeInput = this._editorService.activeEditor; if (activeInput && (activeInput instanceof QueryInput || activeInput instanceof EditDataInput || activeInput instanceof DashboardInput) && this._connectionManagementService.isConnected(activeInput.uri)) { let includePassword = false; diff --git a/src/sql/parts/connection/common/connectionManagementService.ts b/src/sql/parts/connection/common/connectionManagementService.ts index 9bbf94893f..9b057aa729 100644 --- a/src/sql/parts/connection/common/connectionManagementService.ts +++ b/src/sql/parts/connection/common/connectionManagementService.ts @@ -41,7 +41,7 @@ import * as nls from 'vs/nls'; import * as errors from 'vs/base/common/errors'; import { IDisposable, dispose, Disposable } from 'vs/base/common/lifecycle'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; +import { IEditorService, ACTIVE_GROUP } from 'vs/workbench/services/editor/common/editorService'; import * as platform from 'vs/platform/registry/common/platform'; import { Memento } from 'vs/workbench/common/memento'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; @@ -52,13 +52,13 @@ import { ConfigurationEditingService } from 'vs/workbench/services/configuration import { IWorkspaceConfigurationService } from 'vs/workbench/services/configuration/common/configuration'; import { IQuickOpenService } from 'vs/platform/quickOpen/common/quickOpen'; import { Event, Emitter } from 'vs/base/common/event'; -import { IEditorGroupService } from 'vs/workbench/services/group/common/groupService'; -import { EditorGroup } from 'vs/workbench/common/editor/editorStacksModel'; +import { IEditorGroupsService } from 'vs/workbench/services/group/common/editorGroupsService'; import { EditorPart } from 'vs/workbench/browser/parts/editor/editorPart'; import * as statusbar from 'vs/workbench/browser/parts/statusbar/statusbar'; import { IViewletService } from 'vs/workbench/services/viewlet/browser/viewlet'; import { IStatusbarService } from 'vs/platform/statusbar/common/statusbar'; import { ICommandService } from 'vs/platform/commands/common/commands'; +import { EditorGroup } from 'vs/workbench/common/editor/editorGroup'; export class ConnectionManagementService extends Disposable implements IConnectionManagementService { @@ -89,7 +89,7 @@ export class ConnectionManagementService extends Disposable implements IConnecti @IServerGroupController private _serverGroupController: IServerGroupController, @ICommandService private _commandService: ICommandService, @IInstantiationService private _instantiationService: IInstantiationService, - @IWorkbenchEditorService private _editorService: IWorkbenchEditorService, + @IEditorService private _editorService: IEditorService, @IWorkspaceContextService private _contextService: IWorkspaceContextService, @IStorageService private _storageService: IStorageService, @ITelemetryService private _telemetryService: ITelemetryService, @@ -97,7 +97,7 @@ export class ConnectionManagementService extends Disposable implements IConnecti @ICredentialsService private _credentialsService: ICredentialsService, @ICapabilitiesService private _capabilitiesService: ICapabilitiesService, @IQuickOpenService private _quickOpenService: IQuickOpenService, - @IEditorGroupService private _editorGroupService: IEditorGroupService, + @IEditorGroupsService private _editorGroupService: IEditorGroupsService, @IStatusbarService private _statusBarService: IStatusbarService, @IResourceProviderService private _resourceProviderService: IResourceProviderService, @IViewletService private _viewletService: IViewletService, @@ -562,7 +562,7 @@ export class ConnectionManagementService extends Disposable implements IConnecti if (!this.focusDashboard(connectionProfile)) { let dashboardInput: DashboardInput = this._instantiationService ? this._instantiationService.createInstance(DashboardInput, connectionProfile) : undefined; return dashboardInput.initializedPromise.then(() => { - this._editorService.openEditor(dashboardInput, { pinned: true }, false); + this._editorService.openEditor(dashboardInput, { pinned: true }, ACTIVE_GROUP); }).then(() => true); } else { return Promise.resolve(true); @@ -577,54 +577,29 @@ export class ConnectionManagementService extends Disposable implements IConnecti revealInCenterIfOutsideViewport: true, pinned: true }; - let model = this._editorGroupService.getStacksModel(); - // check if editor is already present - if (model) { - model.groups.map(group => { - if (group instanceof EditorGroup) { - group.getEditors().map(editor => { - if (editor instanceof DashboardInput) { - if (DashboardInput.profileMatches(profile, editor.connectionProfile)) { - editor.connectionProfile.databaseName = profile.databaseName; - // change focus to the matched editor - let position = model.positionOfGroup(group); - this._editorGroupService.activateGroup(model.groupAt(position)); - this._editorService.openEditor(editor, options, position) - .done(() => { - this._editorGroupService.activateGroup(model.groupAt(position)); - if (!profile.databaseName || Utils.isMaster(profile)) { - this._angularEventing.sendAngularEvent(editor.uri, AngularEventType.NAV_SERVER); - } else { - this._angularEventing.sendAngularEvent(editor.uri, AngularEventType.NAV_DATABASE); - } - found = true; - }, errors.onUnexpectedError); + + this._editorService.editors.map(editor => { + if (editor instanceof DashboardInput) { + if (DashboardInput.profileMatches(profile, editor.connectionProfile)) { + editor.connectionProfile.databaseName = profile.databaseName; + this._editorService.openEditor(editor) + .done(() => { + if (!profile.databaseName || Utils.isMaster(profile)) { + this._angularEventing.sendAngularEvent(editor.uri, AngularEventType.NAV_SERVER); + } else { + this._angularEventing.sendAngularEvent(editor.uri, AngularEventType.NAV_DATABASE); } - } - }); + found = true; + }, errors.onUnexpectedError); } - }); - } + } + }); + return found; } public closeDashboard(uri: string): void { - let model = this._editorGroupService.getStacksModel(); - if (model) { - model.groups.map(group => { - if (group instanceof EditorGroup) { - group.getEditors().map(editor => { - if (editor instanceof DashboardInput) { - if (editor.uri === uri && this._editorGroupService instanceof EditorPart) { - // close matched editor - let position = model.positionOfGroup(group); - this._editorGroupService.closeEditor(position, editor); - } - } - }); - } - }); - } + } public getConnectionGroups(providers?: string[]): ConnectionProfileGroup[] { diff --git a/src/sql/parts/connection/common/connectionStatus.ts b/src/sql/parts/connection/common/connectionStatus.ts index 7bc02977d5..a741b1934e 100644 --- a/src/sql/parts/connection/common/connectionStatus.ts +++ b/src/sql/parts/connection/common/connectionStatus.ts @@ -5,13 +5,14 @@ import { $, append, show, hide } from 'vs/base/browser/dom'; import { IDisposable, combinedDisposable } from 'vs/base/common/lifecycle'; import { IStatusbarItem } from 'vs/workbench/browser/parts/statusbar/statusbar'; -import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; -import { IEditorGroupService } from 'vs/workbench/services/group/common/groupService'; +import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; +import { IEditorGroupsService } from 'vs/workbench/services/group/common/editorGroupsService'; import { IConnectionManagementService } from 'sql/parts/connection/common/connectionManagement'; import { ICapabilitiesService } from 'sql/services/capabilities/capabilitiesService'; import { IConnectionProfile } from 'sql/parts/connection/common/interfaces'; import { IObjectExplorerService } from 'sql/parts/objectExplorer/common/objectExplorerService'; import * as TaskUtilities from 'sql/workbench/common/taskUtilities'; +import { EditorServiceImpl } from 'vs/workbench/browser/parts/editor/editor'; // Connection status bar showing the current global connection export class ConnectionStatusbarItem implements IStatusbarItem { @@ -22,8 +23,8 @@ export class ConnectionStatusbarItem implements IStatusbarItem { constructor( @IConnectionManagementService private _connectionManagementService: IConnectionManagementService, - @IEditorGroupService private _editorGroupService: IEditorGroupService, - @IWorkbenchEditorService private _editorService: IWorkbenchEditorService, + @IEditorGroupsService private _editorGroupService: IEditorGroupsService, + @IEditorService private _editorService: EditorServiceImpl, @ICapabilitiesService private _capabilitiesService: ICapabilitiesService, @IObjectExplorerService private _objectExplorerService: IObjectExplorerService, ) { @@ -39,8 +40,8 @@ export class ConnectionStatusbarItem implements IStatusbarItem { this._connectionManagementService.onConnect(() => this._updateStatus()), this._connectionManagementService.onConnectionChanged(() => this._updateStatus()), this._connectionManagementService.onDisconnect(() => this._updateStatus()), - this._editorGroupService.onEditorsChanged(() => this._updateStatus()), - this._editorGroupService.getStacksModel().onEditorClosed(() => this._updateStatus()), + this._editorService.onDidVisibleEditorsChange(() => this._updateStatus()), + this._editorService.onDidCloseEditor(() => this._updateStatus()), this._objectExplorerService.onSelectionOrFocusChange(() => this._updateStatus()) ); diff --git a/src/sql/parts/dashboard/containers/dashboardNavSection.contribution.ts b/src/sql/parts/dashboard/containers/dashboardNavSection.contribution.ts index 4ccdb2d3bd..6af6840cc1 100644 --- a/src/sql/parts/dashboard/containers/dashboardNavSection.contribution.ts +++ b/src/sql/parts/dashboard/containers/dashboardNavSection.contribution.ts @@ -13,7 +13,6 @@ import { IdGenerator } from 'vs/base/common/idGenerator'; import { NavSectionConfig, IUserFriendlyIcon } from 'sql/parts/dashboard/common/dashboardWidget'; import { registerContainerType, generateNavSectionContainerTypeSchemaProperties } from 'sql/platform/dashboard/common/dashboardContainerRegistry'; import { WIDGETS_CONTAINER, validateWidgetContainerContribution } from 'sql/parts/dashboard/containers/dashboardWidgetContainer.contribution'; -import { WEBVIEW_CONTAINER } from 'sql/parts/dashboard/containers/dashboardWebviewContainer.contribution'; import { GRID_CONTAINER, validateGridContainerContribution } from 'sql/parts/dashboard/containers/dashboardGridContainer.contribution'; export const NAV_SECTION = 'nav-section'; @@ -84,11 +83,11 @@ function createCSSRuleForIcon(icon: IUserFriendlyIcon, extension: IExtensionPoin if (icon) { iconClass = ids.nextId(); if (typeof icon === 'string') { - const path = join(extension.description.extensionFolderPath, icon); + const path = join(extension.description.extensionLocation.fsPath, icon); createCSSRule(`.icon.${iconClass}`, `background-image: url("${URI.file(path).toString()}")`); } else { - const light = join(extension.description.extensionFolderPath, icon.light); - const dark = join(extension.description.extensionFolderPath, icon.dark); + const light = join(extension.description.extensionLocation.fsPath, icon.light); + const dark = join(extension.description.extensionLocation.fsPath, icon.dark); createCSSRule(`.icon.${iconClass}`, `background-image: url("${URI.file(light).toString()}")`); createCSSRule(`.vs-dark .icon.${iconClass}, .hc-black .icon.${iconClass}`, `background-image: url("${URI.file(dark).toString()}")`); } diff --git a/src/sql/parts/dashboard/contents/webviewContent.component.ts b/src/sql/parts/dashboard/contents/webviewContent.component.ts index 609568fb2c..b57be30f79 100644 --- a/src/sql/parts/dashboard/contents/webviewContent.component.ts +++ b/src/sql/parts/dashboard/contents/webviewContent.component.ts @@ -8,21 +8,21 @@ import { Component, forwardRef, Input, OnInit, Inject, ChangeDetectorRef, Elemen import { Event, Emitter } from 'vs/base/common/event'; import { Parts, IPartService } from 'vs/workbench/services/part/common/partService'; -import { IDisposable, Disposable } from 'vs/base/common/lifecycle'; +import { IDisposable } from 'vs/base/common/lifecycle'; import { addDisposableListener, EventType } from 'vs/base/browser/dom'; import { memoize } from 'vs/base/common/decorators'; import { IWorkbenchThemeService } from 'vs/workbench/services/themes/common/workbenchThemeService'; import { IContextViewService } from 'vs/platform/contextview/browser/contextView'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { WebviewElement } from 'vs/workbench/parts/webview/electron-browser/webviewElement'; - -import { TabConfig } from 'sql/parts/dashboard/common/dashboardWidget'; import { DashboardServiceInterface } from 'sql/parts/dashboard/services/dashboardServiceInterface.service'; import { CommonServiceInterface } from 'sql/services/common/commonServiceInterface.service'; import { IDashboardWebview, IDashboardViewService } from 'sql/services/dashboard/common/dashboardViewService'; import { AngularDisposable } from 'sql/base/common/lifecycle'; +import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import * as sqlops from 'sqlops'; +import { IContextKey } from 'vs/platform/contextkey/common/contextkey'; @Component({ template: '', @@ -40,15 +40,18 @@ export class WebviewContent extends AngularDisposable implements OnInit, IDashbo private _webview: WebviewElement; private _html: string; + protected contextKey: IContextKey; + protected findInputFocusContextKey: IContextKey; + constructor( @Inject(forwardRef(() => CommonServiceInterface)) private _dashboardService: DashboardServiceInterface, - @Inject(forwardRef(() => ChangeDetectorRef)) private _changeRef: ChangeDetectorRef, @Inject(forwardRef(() => ElementRef)) private _el: ElementRef, @Inject(IWorkbenchThemeService) private themeService: IWorkbenchThemeService, @Inject(IContextViewService) private contextViewService: IContextViewService, @Inject(IDashboardViewService) private dashboardViewService: IDashboardViewService, @Inject(IPartService) private partService: IPartService, - @Inject(IEnvironmentService) private environmentService: IEnvironmentService + @Inject(IEnvironmentService) private environmentService: IEnvironmentService, + @Inject(IInstantiationService) private instantiationService: IInstantiationService ) { super(); } @@ -108,18 +111,15 @@ export class WebviewContent extends AngularDisposable implements OnInit, IDashbo this._onMessageDisposable.dispose(); } - this._webview = new WebviewElement( + this._webview = this.instantiationService.createInstance(WebviewElement, this.partService.getContainer(Parts.EDITOR_PART), - this.themeService, - this.environmentService, - this.contextViewService, - undefined, - undefined, + this.contextKey, + this.findInputFocusContextKey, { - allowScripts: true, - enableWrappedPostMessage: true - } - ); + enableWrappedPostMessage: true, + allowScripts: true + }); + this._webview.mountTo(this._el.nativeElement); this._onMessageDisposable = this._webview.onMessage(e => { diff --git a/src/sql/parts/dashboard/dashboardEditor.ts b/src/sql/parts/dashboard/dashboardEditor.ts index 670855fdd2..981bdc3821 100644 --- a/src/sql/parts/dashboard/dashboardEditor.ts +++ b/src/sql/parts/dashboard/dashboardEditor.ts @@ -23,6 +23,7 @@ import { IDashboardService } from 'sql/services/dashboard/common/dashboardServic import { ConnectionProfile } from 'sql/parts/connection/common/connectionProfile'; import { IConnectionProfile } from 'sql/parts/connection/common/interfaces'; import { IConnectionManagementService } from 'sql/parts/connection/common/connectionManagement'; +import { CancellationToken } from 'vs/base/common/cancellation'; export class DashboardEditor extends BaseEditor { @@ -81,7 +82,7 @@ export class DashboardEditor extends BaseEditor { const parentElement = this.getContainer(); - super.setInput(input, options); + super.setInput(input, options, CancellationToken.None); $(parentElement).clearChildren(); diff --git a/src/sql/parts/dashboard/newDashboardTabDialog/newDashboardTabDialog.ts b/src/sql/parts/dashboard/newDashboardTabDialog/newDashboardTabDialog.ts index 5b5d5aa41e..e0d25d379c 100644 --- a/src/sql/parts/dashboard/newDashboardTabDialog/newDashboardTabDialog.ts +++ b/src/sql/parts/dashboard/newDashboardTabDialog/newDashboardTabDialog.ts @@ -20,9 +20,9 @@ import { IInstantiationService } from 'vs/platform/instantiation/common/instanti import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; -import { IDelegate, IRenderer, IListMouseEvent } from 'vs/base/browser/ui/list/list'; +import { IVirtualDelegate, IRenderer } from 'vs/base/browser/ui/list/list'; import { StandardKeyboardEvent } from 'vs/base/browser/keyboardEvent'; -import { KeyCode, KeyMod } from 'vs/base/common/keyCodes'; +import { KeyCode } from 'vs/base/common/keyCodes'; import { Button } from 'sql/base/browser/ui/button/button'; import { Modal } from 'sql/base/browser/ui/modal/modal'; @@ -33,7 +33,7 @@ import { Orientation } from 'sql/base/browser/ui/splitview/splitview'; import { NewDashboardTabViewModel, IDashboardUITab } from 'sql/parts/dashboard/newDashboardTabDialog/newDashboardTabViewModel'; import { IDashboardTab } from 'sql/platform/dashboard/common/dashboardRegistry'; -class ExtensionListDelegate implements IDelegate { +class ExtensionListDelegate implements IVirtualDelegate { constructor( private _height: number @@ -90,6 +90,10 @@ class ExtensionListRenderer implements IRenderer) { if (insight.contrib.queryFile) { - insight.contrib.queryFile = join(extension.description.extensionFolderPath, insight.contrib.queryFile); + insight.contrib.queryFile = join(extension.description.extensionLocation.fsPath, insight.contrib.queryFile); } if (insight.contrib.details && insight.contrib.details.queryFile) { - insight.contrib.details.queryFile = join(extension.description.extensionFolderPath, insight.contrib.details.queryFile); + insight.contrib.details.queryFile = join(extension.description.extensionLocation.fsPath, insight.contrib.details.queryFile); } registerNonCustomDashboardWidget(insight.id, '', insight.contrib); diff --git a/src/sql/parts/dashboard/widgets/webview/webviewWidget.component.ts b/src/sql/parts/dashboard/widgets/webview/webviewWidget.component.ts index f6235f96fe..ecdf980a7e 100644 --- a/src/sql/parts/dashboard/widgets/webview/webviewWidget.component.ts +++ b/src/sql/parts/dashboard/widgets/webview/webviewWidget.component.ts @@ -20,6 +20,9 @@ import { IWorkbenchThemeService } from 'vs/workbench/services/themes/common/work import { IContextViewService } from 'vs/platform/contextview/browser/contextView'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { WebviewElement } from 'vs/workbench/parts/webview/electron-browser/webviewElement'; +import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; +import { truncate } from 'fs'; +import { IContextKeyService, IContextKey } from 'vs/platform/contextkey/common/contextkey'; interface IWebviewWidgetConfig { id: string; @@ -40,6 +43,9 @@ export class WebviewWidget extends DashboardWidget implements IDashboardWidget, public readonly onMessage: Event = this._onMessage.event; private _onMessageDisposable: IDisposable; + protected contextKey: IContextKey; + protected findInputFocusContextKey: IContextKey; + constructor( @Inject(forwardRef(() => CommonServiceInterface)) private _dashboardService: DashboardServiceInterface, @Inject(forwardRef(() => ChangeDetectorRef)) private _changeRef: ChangeDetectorRef, @@ -49,7 +55,9 @@ export class WebviewWidget extends DashboardWidget implements IDashboardWidget, @Inject(IContextViewService) private contextViewService: IContextViewService, @Inject(IDashboardViewService) private dashboardViewService: IDashboardViewService, @Inject(IPartService) private partService: IPartService, - @Inject(IEnvironmentService) private environmentService: IEnvironmentService + @Inject(IEnvironmentService) private environmentService: IEnvironmentService, + @Inject(IInstantiationService) private instantiationService: IInstantiationService, + @Inject(IContextKeyService) contextKeyService: IContextKeyService ) { super(); this._id = (_config.widget[selector] as IWebviewWidgetConfig).id; @@ -105,18 +113,16 @@ export class WebviewWidget extends DashboardWidget implements IDashboardWidget, if (this._onMessageDisposable) { this._onMessageDisposable.dispose(); } - this._webview = new WebviewElement( + + this._webview = this.instantiationService.createInstance(WebviewElement, this.partService.getContainer(Parts.EDITOR_PART), - this.themeService, - this.environmentService, - this.contextViewService, - undefined, - undefined, + this.contextKey, + this.findInputFocusContextKey, { allowScripts: true, enableWrappedPostMessage: true - } - ); + }); + this._webview.mountTo(this._el.nativeElement); this._onMessageDisposable = this._webview.onMessage(e => { this._onMessage.fire(e); diff --git a/src/sql/parts/editData/common/editDataInput.ts b/src/sql/parts/editData/common/editDataInput.ts index ae307c332b..c53df2f445 100644 --- a/src/sql/parts/editData/common/editDataInput.ts +++ b/src/sql/parts/editData/common/editDataInput.ts @@ -32,7 +32,6 @@ export class EditDataInput extends EditorInput implements IConnectableInput { private _refreshButtonEnabled: boolean; private _stopButtonEnabled: boolean; private _setup: boolean; - private _toDispose: IDisposable[]; private _rowLimit: number; private _objectType: string; private _css: HTMLStyleElement; diff --git a/src/sql/parts/editData/editor/editDataEditor.ts b/src/sql/parts/editData/editor/editDataEditor.ts index 48e24f1963..aef6fb16f8 100644 --- a/src/sql/parts/editData/editor/editDataEditor.ts +++ b/src/sql/parts/editData/editor/editDataEditor.ts @@ -9,11 +9,9 @@ import { TPromise } from 'vs/base/common/winjs.base'; import * as strings from 'vs/base/common/strings'; import * as DOM from 'vs/base/browser/dom'; import * as nls from 'vs/nls'; -import { Builder } from 'vs/base/browser/builder'; -import { EditorOptions, EditorInput } from 'vs/workbench/common/editor'; +import { EditorOptions, EditorInput, IEditorControl, IEditor } from 'vs/workbench/common/editor'; import { BaseEditor } from 'vs/workbench/browser/parts/editor/baseEditor'; -import { Position, IEditorControl, IEditor, IEditorInput } from 'vs/platform/editor/common/editor'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IThemeService } from 'vs/platform/theme/common/themeService'; @@ -21,7 +19,7 @@ import { IInstantiationService } from 'vs/platform/instantiation/common/instanti import { EditDataInput } from 'sql/parts/editData/common/editDataInput'; -import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; +import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import * as queryContext from 'sql/parts/query/common/queryContext'; import { Taskbar, ITaskbarContent } from 'sql/base/browser/ui/taskbar/taskbar'; import { IContextMenuService } from 'vs/platform/contextview/browser/contextView'; @@ -29,22 +27,18 @@ import { IActionItem } from 'vs/base/browser/ui/actionbar/actionbar'; import { Action } from 'vs/base/common/actions'; import { IQueryModelService } from 'sql/parts/query/execution/queryModel'; import { IEditorDescriptorService } from 'sql/parts/query/editor/editorDescriptorService'; -import { IConnectionManagementService } from 'sql/parts/connection/common/connectionManagement'; import { RefreshTableAction, StopRefreshTableAction, ChangeMaxRowsAction, ChangeMaxRowsActionItem, ShowQueryPaneAction } from 'sql/parts/editData/execution/editDataActions'; import { TextResourceEditor } from 'vs/workbench/browser/parts/editor/textResourceEditor'; -import { CodeEditor } from 'vs/editor/browser/codeEditor'; +import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; import { IContextKey, IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; -import { ISelectionData } from 'sqlops'; import { UntitledEditorInput } from 'vs/workbench/common/editor/untitledEditorInput'; -import { IEditorGroupService } from 'vs/workbench/services/group/common/groupService'; -import { IFlexibleSash, VerticalFlexibleSash, HorizontalFlexibleSash } from 'sql/parts/query/views/flexibleSash'; -import { Orientation } from 'vs/base/browser/ui/sash/sash'; +import { IEditorGroup } from 'vs/workbench/services/group/common/editorGroupsService'; +import { IFlexibleSash, HorizontalFlexibleSash } from 'sql/parts/query/views/flexibleSash'; import { EditDataResultsEditor } from 'sql/parts/editData/editor/editDataResultsEditor'; import { EditDataResultsInput } from 'sql/parts/editData/common/editDataResultsInput'; -import { IEditorViewState } from 'vs/editor/common/editorCommon'; -import { Emitter } from 'vs/base/common/event'; +import { CancellationToken } from 'vs/base/common/cancellation'; /** * Editor that hosts an action bar and a resultSetInput for an edit data session @@ -85,13 +79,11 @@ export class EditDataEditor extends BaseEditor { @ITelemetryService _telemetryService: ITelemetryService, @IThemeService themeService: IThemeService, @IInstantiationService private _instantiationService: IInstantiationService, - @IWorkbenchEditorService private _editorService: IWorkbenchEditorService, + @IEditorService private _editorService: IEditorService, @IContextMenuService private _contextMenuService: IContextMenuService, @IQueryModelService private _queryModelService: IQueryModelService, @IEditorDescriptorService private _editorDescriptorService: IEditorDescriptorService, - @IEditorGroupService private _editorGroupService: IEditorGroupService, - @IContextKeyService contextKeyService: IContextKeyService, - @IConnectionManagementService private _connectionManagementService: IConnectionManagementService + @IContextKeyService contextKeyService: IContextKeyService ) { super(EditDataEditor.ID, _telemetryService, themeService); @@ -99,11 +91,12 @@ export class EditDataEditor extends BaseEditor { this._queryEditorVisible = queryContext.QueryEditorVisibleContext.bindTo(contextKeyService); } - if (_editorGroupService) { - _editorGroupService.onEditorOpening(e => { - if (this.isVisible() && (e.input !== this.input || e.position !== this.position)) { + if (_editorService) { + _editorService.overrideOpenEditor((editor, options, group) => { + if (this.isVisible() && (editor !== this.input || group !== this.group)) { this.saveEditorViewState(); } + return {}; }); } } @@ -119,19 +112,6 @@ export class EditDataEditor extends BaseEditor { input.results.visible = isVisible; } - /** - * Changes the position of the editor. - */ - public changePosition(position: Position): void { - if (this._resultsEditor) { - this._resultsEditor.changePosition(position); - } - if (this._sqlEditor) { - this._sqlEditor.changePosition(position); - } - super.changePosition(position); - } - /** * Called to indicate to the editor that the input should be cleared and resources associated with the * input should be freed. @@ -184,7 +164,7 @@ export class EditDataEditor extends BaseEditor { public getEditorText(): string { if (this._sqlEditor && this._sqlEditor.getControl()) { let control = this._sqlEditor.getControl(); - let codeEditor: CodeEditor = control; + let codeEditor: ICodeEditor = control; if (codeEditor) { let value = codeEditor.getModel().getValue(); @@ -222,15 +202,15 @@ export class EditDataEditor extends BaseEditor { /** * Sets this editor and the sub-editors to visible. */ - public setEditorVisible(visible: boolean, position: Position): void { + public setEditorVisible(visible: boolean, group: IEditorGroup): void { if (this._resultsEditor) { - this._resultsEditor.setVisible(visible, position); + this._resultsEditor.setVisible(visible, group); } if (this._sqlEditor) { - this._sqlEditor.setVisible(visible, position); + this._sqlEditor.setVisible(visible, group); } - super.setEditorVisible(visible, position); + super.setEditorVisible(visible, group); // Note: must update after calling super.setEditorVisible so that the accurate count is handled this._updateQueryEditorVisible(visible); @@ -239,7 +219,7 @@ export class EditDataEditor extends BaseEditor { /** * Sets the input data for this editor. */ - public setInput(newInput: EditDataInput, options?: EditorOptions): TPromise { + public setInput(newInput: EditDataInput, options?: EditorOptions): Thenable { let oldInput = this.input; if (!newInput.setup) { this._initialized = false; @@ -250,7 +230,7 @@ export class EditDataEditor extends BaseEditor { newInput.setupComplete(); } - return super.setInput(newInput, options) + return super.setInput(newInput, options, CancellationToken.None) .then(() => this._updateInput(oldInput, newInput, options)); } @@ -285,7 +265,7 @@ export class EditDataEditor extends BaseEditor { let editor = descriptor.instantiate(this._instantiationService); editor.create(container); - editor.setVisible(this.isVisible(), this.position); + editor.setVisible(this.isVisible(), editor.group); return TPromise.as(editor); } @@ -544,9 +524,9 @@ export class EditDataEditor extends BaseEditor { /** * Sets input for the SQL editor after it has been created. */ - private _onSqlEditorCreated(sqlEditor: TextResourceEditor, sqlInput: UntitledEditorInput, options: EditorOptions): TPromise { + private _onSqlEditorCreated(sqlEditor: TextResourceEditor, sqlInput: UntitledEditorInput, options: EditorOptions): Thenable { this._sqlEditor = sqlEditor; - return this._sqlEditor.setInput(sqlInput, options); + return this._sqlEditor.setInput(sqlInput, options, CancellationToken.None); } private _resizeGridContents(): void { @@ -591,7 +571,9 @@ export class EditDataEditor extends BaseEditor { return this._createEditor(newInput.sql, this._sqlEditorContainer); }; onEditorsCreated = (result: TextResourceEditor) => { - return this._onSqlEditorCreated(result, newInput.sql, options); + return TPromise.join([ + this._onSqlEditorCreated(result, newInput.sql, options) + ]); }; } @@ -630,7 +612,7 @@ export class EditDataEditor extends BaseEditor { return; } - this._editorGroupService.pinEditor(this.position, this.input); + //this._editorGroupService.pinEditor(this.position, this.input); let input = this.input; this._createResultsEditorContainer(); @@ -684,7 +666,7 @@ export class EditDataEditor extends BaseEditor { let visible = currentEditorIsVisible; if (!currentEditorIsVisible) { // Current editor is closing but still tracked as visible. Check if any other editor is visible - const candidates = [...this._editorService.getVisibleEditors()].filter(e => { + const candidates = [...this._editorService.visibleControls].filter(e => { if (e && e.getId) { return e.getId() === EditDataEditor.ID; } diff --git a/src/sql/parts/editData/editor/editDataResultsEditor.ts b/src/sql/parts/editData/editor/editDataResultsEditor.ts index ebe28e1c52..43cf8cfb45 100644 --- a/src/sql/parts/editData/editor/editDataResultsEditor.ts +++ b/src/sql/parts/editData/editor/editDataResultsEditor.ts @@ -24,6 +24,7 @@ import { EditDataModule } from 'sql/parts/grid/views/editData/editData.module'; import { EDITDATA_SELECTOR } from 'sql/parts/grid/views/editData/editData.component'; import { EditDataResultsInput } from 'sql/parts/editData/common/editDataResultsInput'; import { Event } from 'vs/base/common/event'; +import { CancellationToken } from 'vs/base/common/cancellation'; export class EditDataResultsEditor extends BaseEditor { @@ -64,7 +65,7 @@ export class EditDataResultsEditor extends BaseEditor { } public setInput(input: EditDataResultsInput, options: EditorOptions): TPromise { - super.setInput(input, options); + super.setInput(input, options, CancellationToken.None); this._applySettings(); if (!input.hasBootstrapped) { this._bootstrapAngular(); diff --git a/src/sql/parts/fileBrowser/fileBrowserRenderer.ts b/src/sql/parts/fileBrowser/fileBrowserRenderer.ts index c747f4dc86..c87b9f73a4 100644 --- a/src/sql/parts/fileBrowser/fileBrowserRenderer.ts +++ b/src/sql/parts/fileBrowser/fileBrowserRenderer.ts @@ -11,7 +11,9 @@ import URI from 'vs/base/common/uri'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { FileLabel } from 'vs/workbench/browser/labels'; import { IFileTemplateData } from 'vs/workbench/parts/files/electron-browser/views/explorerViewer'; -import { empty as EmptyDisposable } from 'vs/base/common/lifecycle'; +import { toDisposable } from 'vs/base/common/lifecycle'; + +const EmptyDisposable = toDisposable(() => null); /** * Renders the tree items. diff --git a/src/sql/parts/grid/views/gridCommands.ts b/src/sql/parts/grid/views/gridCommands.ts index 7d7f1a4432..2a987c61ed 100644 --- a/src/sql/parts/grid/views/gridCommands.ts +++ b/src/sql/parts/grid/views/gridCommands.ts @@ -11,11 +11,11 @@ import { QueryEditor } from 'sql/parts/query/editor/queryEditor'; import { EditDataEditor } from 'sql/parts/editData/editor/editDataEditor'; import { ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; -import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; +import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; function runActionOnActiveResultsEditor (accessor: ServicesAccessor, eventName: string): void { - let editorService = accessor.get(IWorkbenchEditorService); - const candidates = [editorService.getActiveEditor(), ...editorService.getVisibleEditors()].filter(e => { + let editorService = accessor.get(IEditorService); + const candidates = [editorService.activeControl, ...editorService.visibleControls].filter(e => { if (e) { let id = e.getId(); if (id === QueryEditor.ID || id === EditDataEditor.ID) { diff --git a/src/sql/parts/grid/views/query/chartViewer.component.ts b/src/sql/parts/grid/views/query/chartViewer.component.ts index 108c288749..8b79d772a5 100644 --- a/src/sql/parts/grid/views/query/chartViewer.component.ts +++ b/src/sql/parts/grid/views/query/chartViewer.component.ts @@ -45,7 +45,7 @@ import { IContextMenuService } from 'vs/platform/contextview/browser/contextView import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IWindowsService, IWindowService } from 'vs/platform/windows/common/windows'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; -import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; +import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; const insightRegistry = Registry.as(Extensions.InsightContribution); @@ -106,7 +106,7 @@ export class ChartViewerComponent implements OnInit, OnDestroy, IChartViewAction @Inject(IWorkspaceContextService) private workspaceContextService: IWorkspaceContextService, @Inject(IWindowService) private windowService: IWindowService, @Inject(IQueryModelService) private queryModelService: IQueryModelService, - @Inject(IWorkbenchEditorService) private editorService: IWorkbenchEditorService + @Inject(IEditorService) private editorService: IEditorService ) { this.setDefaultChartConfig(); } @@ -294,7 +294,7 @@ export class ChartViewerComponent implements OnInit, OnDestroy, IChartViewAction private getActiveUriString(): string { let editorService = this.editorService; - let editor = editorService.getActiveEditor(); + let editor = editorService.activeControl; if (editor && editor instanceof QueryEditor) { let queryEditor: QueryEditor = editor; return queryEditor.uri; diff --git a/src/sql/parts/modelComponents/modelEditor/modelViewEditor.ts b/src/sql/parts/modelComponents/modelEditor/modelViewEditor.ts index 3d904246b9..85daf2ab51 100644 --- a/src/sql/parts/modelComponents/modelEditor/modelViewEditor.ts +++ b/src/sql/parts/modelComponents/modelEditor/modelViewEditor.ts @@ -4,17 +4,15 @@ *--------------------------------------------------------------------------------------------*/ import 'vs/css!./modelViewEditor'; -import { Builder, $ } from 'vs/base/browser/builder'; import { TPromise } from 'vs/base/common/winjs.base'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IThemeService } from 'vs/platform/theme/common/themeService'; import { BaseEditor } from 'vs/workbench/browser/parts/editor/baseEditor'; import { EditorOptions } from 'vs/workbench/common/editor'; import * as DOM from 'vs/base/browser/dom'; -import { Position } from 'vs/platform/editor/common/editor'; -import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { ModelViewInput } from 'sql/parts/modelComponents/modelEditor/modelViewInput'; +import { CancellationToken } from 'vs/base/common/cancellation'; export class ModelViewEditor extends BaseEditor { @@ -74,7 +72,7 @@ export class ModelViewEditor extends BaseEditor { input.container.style.visibility = 'visible'; this._content.setAttribute('aria-flowto', input.container.id); - await super.setInput(input, options); + await super.setInput(input, options, CancellationToken.None); this.doUpdateContainer(); } diff --git a/src/sql/parts/modelComponents/queryTextEditor.ts b/src/sql/parts/modelComponents/queryTextEditor.ts index 88bfb20738..0e77cc77f4 100644 --- a/src/sql/parts/modelComponents/queryTextEditor.ts +++ b/src/sql/parts/modelComponents/queryTextEditor.ts @@ -19,21 +19,22 @@ import { IStorageService } from 'vs/platform/storage/common/storage'; import { ITextResourceConfigurationService } from 'vs/editor/common/services/resourceConfiguration'; import { IModeService } from 'vs/editor/common/services/modeService'; import { ITextFileService } from 'vs/workbench/services/textfile/common/textfiles'; -import { IEditorGroupService } from 'vs/workbench/services/group/common/groupService'; +import { IEditorGroupsService } from 'vs/workbench/services/group/common/editorGroupsService'; import { EditorOptions } from 'vs/workbench/common/editor'; -import { CodeEditor } from 'vs/editor/browser/codeEditor'; import { IEditorContributionCtor } from 'vs/editor/browser/editorExtensions'; import { FoldingController } from 'vs/editor/contrib/folding/folding'; import { RenameController } from 'vs/editor/contrib/rename/rename'; +import { StandaloneCodeEditor } from 'vs/editor/standalone/browser/standaloneCodeEditor'; +import { CancellationToken } from 'vs/base/common/cancellation'; +import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; -class QueryCodeEditor extends CodeEditor { - - protected _getContributions(): IEditorContributionCtor[] { - let contributions = super._getContributions(); - let skipContributions = [FoldingController.prototype, RenameController.prototype]; - contributions = contributions.filter(c => skipContributions.indexOf(c.prototype) === -1); - return contributions; - } +class QueryCodeEditor extends StandaloneCodeEditor { + // protected _getContributions(): IEditorContributionCtor[] { + // let contributions = super._getContributions(); + // let skipContributions = [FoldingController.prototype, RenameController.prototype]; + // contributions = contributions.filter(c => skipContributions.indexOf(c.prototype) === -1); + // return contributions; + // } } /** @@ -51,10 +52,13 @@ export class QueryTextEditor extends BaseTextEditor { @IThemeService themeService: IThemeService, @IModeService modeService: IModeService, @ITextFileService textFileService: ITextFileService, - @IEditorGroupService editorGroupService: IEditorGroupService + @IEditorGroupsService editorGroupService: IEditorGroupsService, + @IEditorService protected editorService: IEditorService, ) { - super(QueryTextEditor.ID, telemetryService, instantiationService, storageService, configurationService, themeService, textFileService, editorGroupService); + super( + QueryTextEditor.ID, telemetryService, instantiationService, storageService, + configurationService, themeService, textFileService, editorService, editorGroupService); } public createEditorControl(parent: HTMLElement, configuration: IEditorOptions): editorCommon.IEditor { @@ -79,8 +83,8 @@ export class QueryTextEditor extends BaseTextEditor { return options; } - setInput(input: UntitledEditorInput, options: EditorOptions): TPromise { - return super.setInput(input, options) + setInput(input: UntitledEditorInput, options: EditorOptions): Thenable { + return super.setInput(input, options, CancellationToken.None) .then(() => this.input.resolve() .then(editorModel => editorModel.load()) .then(editorModel => this.getControl().setModel((editorModel).textEditorModel))); diff --git a/src/sql/parts/modelComponents/tree/tree.component.ts b/src/sql/parts/modelComponents/tree/tree.component.ts index a256f5e639..7f9edbc8ac 100644 --- a/src/sql/parts/modelComponents/tree/tree.component.ts +++ b/src/sql/parts/modelComponents/tree/tree.component.ts @@ -80,9 +80,9 @@ export default class TreeComponent extends ComponentBase implements IComponent, } public refreshDataProvider(itemsToRefreshByHandle: { [treeItemHandle: string]: ITreeComponentItem }): void { - if (this._dataProvider) { - this._dataProvider.refresh(itemsToRefreshByHandle); - } + // if (this._dataProvider) { + // const itemsToRefresh = this._dataProvider.getItemsToRefresh(itemsToRefreshByHandle); + // } if (this._tree) { for (const item of Object.values(itemsToRefreshByHandle)) { this._tree.refresh(item); diff --git a/src/sql/parts/modelComponents/tree/treeViewDataProvider.ts b/src/sql/parts/modelComponents/tree/treeViewDataProvider.ts index 9c19345d68..6d57a5474c 100644 --- a/src/sql/parts/modelComponents/tree/treeViewDataProvider.ts +++ b/src/sql/parts/modelComponents/tree/treeViewDataProvider.ts @@ -9,7 +9,7 @@ import { IExtHostContext } from 'vs/workbench/api/node/extHost.protocol'; import { IModelViewTreeViewDataProvider, ITreeComponentItem } from 'sql/workbench/common/views'; import { INotificationService } from 'vs/platform/notification/common/notification'; import * as vsTreeView from 'vs/workbench/api/electron-browser/mainThreadTreeViews'; - +import { TPromise } from 'vs/base/common/winjs.base'; export class TreeViewDataProvider extends vsTreeView.TreeViewDataProvider implements IModelViewTreeViewDataProvider { constructor(handle: number, treeViewId: string, @@ -28,4 +28,12 @@ export class TreeViewDataProvider extends vsTreeView.TreeViewDataProvider implem (this._proxy).$onNodeSelected(this.treeViewId, items.map(i => i.handle)); } } + + + refresh(itemsToRefreshByHandle: { [treeItemHandle: string]: ITreeComponentItem }) { + } + + getChildren(element?: ITreeComponentItem): TPromise { + return undefined; + } } diff --git a/src/sql/parts/modelComponents/webview.component.ts b/src/sql/parts/modelComponents/webview.component.ts index 584c9c1f21..07a807ad71 100644 --- a/src/sql/parts/modelComponents/webview.component.ts +++ b/src/sql/parts/modelComponents/webview.component.ts @@ -20,6 +20,8 @@ import { WebviewElement } from 'vs/workbench/parts/webview/electron-browser/webv import { ComponentBase } from 'sql/parts/modelComponents/componentBase'; import { IComponent, IComponentDescriptor, IModelStore, ComponentEventType } from 'sql/parts/modelComponents/interfaces'; +import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; +import { IContextKeyService, IContextKey } from 'vs/platform/contextkey/common/contextkey'; @Component({ template: '', @@ -33,6 +35,9 @@ export default class WebViewComponent extends ComponentBase implements IComponen private _onMessage = new Emitter(); private _renderedHtml: string; + protected contextKey: IContextKey; + protected findInputFocusContextKey: IContextKey; + constructor( @Inject(forwardRef(() => CommonServiceInterface)) private _commonService: CommonServiceInterface, @Inject(forwardRef(() => ChangeDetectorRef)) changeRef: ChangeDetectorRef, @@ -40,7 +45,9 @@ export default class WebViewComponent extends ComponentBase implements IComponen @Inject(IPartService) private partService: IPartService, @Inject(IThemeService) private themeService: IThemeService, @Inject(IEnvironmentService) private environmentService: IEnvironmentService, - @Inject(IContextViewService) private contextViewService: IContextViewService + @Inject(IContextViewService) private contextViewService: IContextViewService, + @Inject(IInstantiationService) private instantiationService: IInstantiationService, + @Inject(IContextKeyService) contextKeyService: IContextKeyService ) { super(changeRef); } @@ -54,18 +61,15 @@ export default class WebViewComponent extends ComponentBase implements IComponen } private _createWebview(): void { - this._webview = this._register(new WebviewElement( + this._webview = this.instantiationService.createInstance(WebviewElement, this.partService.getContainer(Parts.EDITOR_PART), - this.themeService, - this.environmentService, - this.contextViewService, - undefined, - undefined, + this.contextKey, + this.findInputFocusContextKey, { allowScripts: true, enableWrappedPostMessage: true - } - )); + }); + this._webview.mountTo(this._el.nativeElement); this._register(this._webview.onMessage(e => { diff --git a/src/sql/parts/objectExplorer/common/registeredServer.contribution.ts b/src/sql/parts/objectExplorer/common/registeredServer.contribution.ts index 1a51784695..d0e49d391f 100644 --- a/src/sql/parts/objectExplorer/common/registeredServer.contribution.ts +++ b/src/sql/parts/objectExplorer/common/registeredServer.contribution.ts @@ -9,13 +9,14 @@ import { localize } from 'vs/nls'; import { SyncActionDescriptor } from 'vs/platform/actions/common/actions'; import { ViewletRegistry, Extensions as ViewletExtensions, ViewletDescriptor, ToggleViewletAction } from 'vs/workbench/browser/viewlet'; import { IWorkbenchActionRegistry, Extensions as ActionExtensions } from 'vs/workbench/common/actions'; -import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; +import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { IViewletService } from 'vs/workbench/services/viewlet/browser/viewlet'; import { Registry } from 'vs/platform/registry/common/platform'; import { Extensions, IConfigurationRegistry } from 'vs/platform/configuration/common/configurationRegistry'; import { VIEWLET_ID } from 'sql/parts/connection/common/connectionManagement'; import { ConnectionViewlet } from 'sql/parts/objectExplorer/viewlet/connectionViewlet'; +import { IEditorGroupsService } from 'vs/workbench/services/group/common/editorGroupsService'; // Viewlet Action export class OpenConnectionsViewletAction extends ToggleViewletAction { @@ -26,9 +27,9 @@ export class OpenConnectionsViewletAction extends ToggleViewletAction { id: string, label: string, @IViewletService viewletService: IViewletService, - @IWorkbenchEditorService editorService: IWorkbenchEditorService + @IEditorGroupsService editorGroupService: IEditorGroupsService ) { - super(id, label, VIEWLET_ID, viewletService, editorService); + super(id, label, VIEWLET_ID, viewletService, editorGroupService); } } diff --git a/src/sql/parts/objectExplorer/serverGroupDialog/serverGroupDialog.ts b/src/sql/parts/objectExplorer/serverGroupDialog/serverGroupDialog.ts index b456b70d21..28d7cac8d6 100644 --- a/src/sql/parts/objectExplorer/serverGroupDialog/serverGroupDialog.ts +++ b/src/sql/parts/objectExplorer/serverGroupDialog/serverGroupDialog.ts @@ -232,11 +232,11 @@ export class ServerGroupDialog extends Modal { let colorCheckBox = new Checkbox({ actionClassName: 'server-group-color', title: color, - isChecked: false, - onChange: (viaKeyboard) => { - this.onSelectGroupColor(color); - } + isChecked: false }); + this._register(colorCheckBox.onChange((viaKeyboard) => { + this.onSelectGroupColor(color); + })); colorCheckBox.domNode.style.backgroundColor = color; container.appendChild(colorCheckBox.domNode); diff --git a/src/sql/parts/objectExplorer/viewlet/connectionTreeAction.ts b/src/sql/parts/objectExplorer/viewlet/connectionTreeAction.ts index ae3a530dca..45f3257ded 100644 --- a/src/sql/parts/objectExplorer/viewlet/connectionTreeAction.ts +++ b/src/sql/parts/objectExplorer/viewlet/connectionTreeAction.ts @@ -21,7 +21,7 @@ import { IObjectExplorerService } from 'sql/parts/objectExplorer/common/objectEx import { TreeNode } from 'sql/parts/objectExplorer/common/treeNode'; import Severity from 'vs/base/common/severity'; import { ObjectExplorerActionsContext, ObjectExplorerActionUtilities } from 'sql/parts/objectExplorer/viewlet/objectExplorerActions'; -import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; +import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; export class RefreshAction extends Action { @@ -323,7 +323,7 @@ export class NewQueryAction extends Action { @IQueryEditorService private queryEditorService: IQueryEditorService, @IConnectionManagementService private connectionManagementService: IConnectionManagementService, @IObjectExplorerService protected _objectExplorerService: IObjectExplorerService, - @IWorkbenchEditorService protected _workbenchEditorService: IWorkbenchEditorService + @IEditorService protected _workbenchEditorService: IEditorService ) { super(id, label); this.class = 'extension-action update'; diff --git a/src/sql/parts/objectExplorer/viewlet/serverTreeActionProvider.ts b/src/sql/parts/objectExplorer/viewlet/serverTreeActionProvider.ts index 44098fe349..b6a73ca0e5 100644 --- a/src/sql/parts/objectExplorer/viewlet/serverTreeActionProvider.ts +++ b/src/sql/parts/objectExplorer/viewlet/serverTreeActionProvider.ts @@ -103,7 +103,9 @@ export class ServerTreeActionProvider extends ContributableActionProvider { // Fill in all actions let actions = getDefaultActions(context); - fillInActions(menu, { arg: undefined, shouldForwardArgs: true }, actions, this.contextMenuService); + let options = { arg: undefined, shouldForwardArgs: true }; + const groups = menu.getActions(options); + fillInActions(groups, actions, this.contextMenuService); // Cleanup scopedContextService.dispose(); diff --git a/src/sql/parts/objectExplorer/viewlet/serverTreeController.ts b/src/sql/parts/objectExplorer/viewlet/serverTreeController.ts index 8901d1ec14..2ebb89806b 100644 --- a/src/sql/parts/objectExplorer/viewlet/serverTreeController.ts +++ b/src/sql/parts/objectExplorer/viewlet/serverTreeController.ts @@ -6,7 +6,7 @@ 'use strict'; import { ITree, ContextMenuEvent } from 'vs/base/parts/tree/browser/tree'; import treedefaults = require('vs/base/parts/tree/browser/treeDefaults'); -import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; +import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IContextMenuService } from 'vs/platform/contextview/browser/contextView'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; @@ -26,7 +26,7 @@ import { TreeUpdateUtils } from 'sql/parts/objectExplorer/viewlet/treeUpdateUtil export class ServerTreeController extends treedefaults.DefaultController { constructor(private actionProvider: ServerTreeActionProvider, - @IWorkbenchEditorService private editorService: IWorkbenchEditorService, + @IEditorService private editorService: IEditorService, @IContextMenuService private contextMenuService: IContextMenuService, @ITelemetryService private telemetryService: ITelemetryService, @IKeybindingService private keybindingService: IKeybindingService diff --git a/src/sql/parts/profiler/contrib/profilerActions.contribution.ts b/src/sql/parts/profiler/contrib/profilerActions.contribution.ts index 94e80cf6aa..8b0ba03c17 100644 --- a/src/sql/parts/profiler/contrib/profilerActions.contribution.ts +++ b/src/sql/parts/profiler/contrib/profilerActions.contribution.ts @@ -4,27 +4,18 @@ *--------------------------------------------------------------------------------------------*/ 'use strict'; -import { GlobalNewProfilerAction } from './profilerWorkbenchActions'; - -import { TaskRegistry } from 'sql/platform/tasks/common/tasks'; -import { NewProfilerAction } from './profilerActions'; - -import { Registry } from 'vs/platform/registry/common/platform'; -import { IWorkbenchActionRegistry, Extensions as ActionExtensions } from 'vs/workbench/common/actions'; import { CommandsRegistry } from 'vs/platform/commands/common/commands'; -import { SyncActionDescriptor } from 'vs/platform/actions/common/actions'; import { ServicesAccessor, IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import * as nls from 'vs/nls'; import { IJSONSchema } from 'vs/base/common/jsonSchema'; -import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; +import { IEditorService, ACTIVE_GROUP } from 'vs/workbench/services/editor/common/editorService'; import { IConnectionManagementService } from 'sql/parts/connection/common/connectionManagement'; -import { IConnectionProfile } from 'sql/parts/connection/common/interfaces'; import { IObjectExplorerService } from '../../objectExplorer/common/objectExplorerService'; import { ProfilerInput } from 'sql/parts/profiler/editor/profilerInput'; import { TPromise } from 'vs/base/common/winjs.base'; import * as TaskUtilities from 'sql/workbench/common/taskUtilities'; import { IProfilerService } from '../service/interfaces'; -import { KeybindingsRegistry } from 'vs/platform/keybinding/common/keybindingsRegistry'; +import { KeybindingsRegistry, KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry'; import { KeyCode, KeyMod } from 'vs/editor/editor.api'; import { ProfilerEditor } from '../editor/profilerEditor'; @@ -40,20 +31,20 @@ const newProfilerSchema: IJSONSchema = { CommandsRegistry.registerCommand({ id: 'profiler.newProfiler', handler: (accessor: ServicesAccessor) => { - let editorService: IWorkbenchEditorService = accessor.get(IWorkbenchEditorService); + let editorService: IEditorService = accessor.get(IEditorService); let instantiationService: IInstantiationService = accessor.get(IInstantiationService); let connectionService: IConnectionManagementService = accessor.get(IConnectionManagementService); let objectExplorerService: IObjectExplorerService = accessor.get(IObjectExplorerService); let connectionProfile = TaskUtilities.getCurrentGlobalConnection(objectExplorerService, connectionService, editorService); let profilerInput = instantiationService.createInstance(ProfilerInput, connectionProfile); - return editorService.openEditor(profilerInput, { pinned: true }, false).then(() => TPromise.as(true)); + return editorService.openEditor(profilerInput, { pinned: true }, ACTIVE_GROUP).then(() => TPromise.as(true)); } }); KeybindingsRegistry.registerCommandAndKeybindingRule({ id: 'profiler.newProfiler', - weight: KeybindingsRegistry.WEIGHT.builtinExtension(), + weight: KeybindingWeight.BuiltinExtension, when: undefined, primary: KeyMod.Alt | KeyCode.KEY_P, mac: { primary: KeyMod.WinCtrl | KeyMod.Alt | KeyCode.KEY_P }, @@ -62,15 +53,15 @@ KeybindingsRegistry.registerCommandAndKeybindingRule({ KeybindingsRegistry.registerCommandAndKeybindingRule({ id: 'profiler.toggleStartStop', - weight: KeybindingsRegistry.WEIGHT.editorContrib(), + weight: KeybindingWeight.EditorContrib, when: undefined, primary: KeyMod.Alt | KeyCode.KEY_S, mac: { primary: KeyMod.WinCtrl | KeyMod.Alt | KeyCode.KEY_S }, handler: (accessor: ServicesAccessor) => { let profilerService: IProfilerService = accessor.get(IProfilerService); - let editorService: IWorkbenchEditorService = accessor.get(IWorkbenchEditorService); + let editorService: IEditorService = accessor.get(IEditorService); - let activeEditor = editorService.getActiveEditor(); + let activeEditor = editorService.activeControl; if (activeEditor instanceof ProfilerEditor) { let profilerInput = activeEditor.input; if (profilerInput.state.isRunning) { diff --git a/src/sql/parts/profiler/contrib/profilerActions.ts b/src/sql/parts/profiler/contrib/profilerActions.ts index c18e0a8d12..5a0ba66685 100644 --- a/src/sql/parts/profiler/contrib/profilerActions.ts +++ b/src/sql/parts/profiler/contrib/profilerActions.ts @@ -19,7 +19,7 @@ import { TPromise } from 'vs/base/common/winjs.base'; import { Action } from 'vs/base/common/actions'; import * as nls from 'vs/nls'; import { IEditorAction } from 'vs/editor/common/editorCommon'; -import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; +import { IEditorService, ACTIVE_GROUP } from 'vs/workbench/services/editor/common/editorService'; import { ICommandService } from 'vs/platform/commands/common/commands' import { IInstantiationService, ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; import { INotificationService } from 'vs/platform/notification/common/notification'; @@ -272,7 +272,7 @@ export class NewProfilerAction extends Task { public runTask(accessor: ServicesAccessor, profile: IConnectionProfile): TPromise { let profilerInput = accessor.get(IInstantiationService).createInstance(ProfilerInput, profile); - return accessor.get(IWorkbenchEditorService).openEditor(profilerInput, { pinned: true }, false).then(() => { + return accessor.get(IEditorService).openEditor(profilerInput, { pinned: true }, ACTIVE_GROUP).then(() => { let options: IConnectionCompletionOptions = { params: undefined, saveTheConnection: false, diff --git a/src/sql/parts/profiler/contrib/profilerWorkbenchActions.ts b/src/sql/parts/profiler/contrib/profilerWorkbenchActions.ts index 938928d687..02e913132a 100644 --- a/src/sql/parts/profiler/contrib/profilerWorkbenchActions.ts +++ b/src/sql/parts/profiler/contrib/profilerWorkbenchActions.ts @@ -10,7 +10,7 @@ import { TPromise } from 'vs/base/common/winjs.base'; import { Action } from 'vs/base/common/actions'; import * as nls from 'vs/nls'; -import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; +import { IEditorService, ACTIVE_GROUP } from 'vs/workbench/services/editor/common/editorService'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IConnectionManagementService } from 'sql/parts/connection/common/connectionManagement'; import { IConnectionProfile } from 'sql/parts/connection/common/interfaces'; @@ -21,7 +21,7 @@ export class GlobalNewProfilerAction extends Action { constructor( id: string, label: string, - @IWorkbenchEditorService private _editorService: IWorkbenchEditorService, + @IEditorService private _editorService: IEditorService, @IInstantiationService private _instantiationService: IInstantiationService, @IConnectionManagementService private _connectionService: IConnectionManagementService ) { @@ -47,6 +47,6 @@ export class GlobalNewProfilerAction extends Action { } let profilerInput = this._instantiationService.createInstance(ProfilerInput, connectionProfile); - return this._editorService.openEditor(profilerInput, { pinned: true }, false).then(() => TPromise.as(true)); + return this._editorService.openEditor(profilerInput, { pinned: true }, ACTIVE_GROUP).then(() => TPromise.as(true)); } } diff --git a/src/sql/parts/profiler/editor/controller/profilerTableEditor.ts b/src/sql/parts/profiler/editor/controller/profilerTableEditor.ts index d4bfe959aa..a2cf99038a 100644 --- a/src/sql/parts/profiler/editor/controller/profilerTableEditor.ts +++ b/src/sql/parts/profiler/editor/controller/profilerTableEditor.ts @@ -27,7 +27,6 @@ import { Event, Emitter } from 'vs/base/common/event'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { Dimension } from 'vs/base/browser/dom'; import { textFormatter } from 'sql/parts/grid/services/sharedServices'; -import { IEditorInput } from 'vs/platform/editor/common/editor'; export interface ProfilerTableViewState { scrollTop: number; diff --git a/src/sql/parts/profiler/editor/profilerEditor.ts b/src/sql/parts/profiler/editor/profilerEditor.ts index 457ce69fdd..11a2f8ee85 100644 --- a/src/sql/parts/profiler/editor/profilerEditor.ts +++ b/src/sql/parts/profiler/editor/profilerEditor.ts @@ -36,15 +36,16 @@ import * as nls from 'vs/nls'; import { IModelService } from 'vs/editor/common/services/modelService'; import { IDisposable } from 'vs/base/common/lifecycle'; import { Command } from 'vs/editor/browser/editorExtensions'; -import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; +import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { KeyMod, KeyCode } from 'vs/base/common/keyCodes'; import { ContextKeyExpr, IContextKeyService, IContextKey } from 'vs/platform/contextkey/common/contextkey'; -import { KeybindingsRegistry } from 'vs/platform/keybinding/common/keybindingsRegistry'; +import { KeybindingsRegistry, KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry'; import { CommonFindController, FindStartFocusAction } from 'vs/editor/contrib/find/findController'; import * as types from 'vs/base/common/types'; import { attachSelectBoxStyler } from 'vs/platform/theme/common/styler'; import { DARK, HIGH_CONTRAST } from 'vs/platform/theme/common/themeService'; -import { IEditorGroupService } from 'vs/workbench/services/group/common/groupService'; +import { IEditorGroupsService } from 'vs/workbench/services/group/common/editorGroupsService'; +import { CancellationToken } from 'vs/base/common/cancellation'; class BasicView extends View { private _previousSize: number; @@ -143,16 +144,18 @@ export class ProfilerEditor extends BaseEditor { @IProfilerService private _profilerService: IProfilerService, @IContextKeyService private _contextKeyService: IContextKeyService, @IContextViewService private _contextViewService: IContextViewService, - @IEditorGroupService private _editorGroupService: IEditorGroupService + @IEditorGroupsService private _editorGroupService: IEditorGroupsService, + @IEditorService private _editorService: IEditorService ) { super(ProfilerEditor.ID, telemetryService, themeService); this._profilerEditorContextKey = CONTEXT_PROFILER_EDITOR.bindTo(this._contextKeyService); - if (_editorGroupService) { - _editorGroupService.onEditorOpening(e => { - if (this.isVisible() && (e.input !== this.input || e.position !== this.position)) { + if (_editorService) { + _editorService.overrideOpenEditor((editor, options, group) => { + if (this.isVisible() && (editor !== this.input || group !== this.group)) { this.saveEditorViewState(); } + return {}; }); } } @@ -324,20 +327,22 @@ export class ProfilerEditor extends BaseEditor { detailTableContainer.style.width = '100%'; detailTableContainer.style.height = '100%'; this._detailTableData = new TableDataView(); - this._detailTable = new Table(detailTableContainer, { dataProvider: this._detailTableData, columns: [ - { - id: 'label', - name: nls.localize('label', "Label"), - field: 'label', - formatter: textFormatter - }, - { - id: 'value', - name: nls.localize('profilerEditor.value', "Value"), - field: 'value', - formatter: textFormatter - } - ]}, { forceFitColumns: true }); + this._detailTable = new Table(detailTableContainer, { + dataProvider: this._detailTableData, columns: [ + { + id: 'label', + name: nls.localize('label', "Label"), + field: 'label', + formatter: textFormatter + }, + { + id: 'value', + name: nls.localize('profilerEditor.value', "Value"), + field: 'value', + formatter: textFormatter + } + ] + }, { forceFitColumns: true }); this._tabbedPanel.pushTab({ identifier: 'detailTable', @@ -373,7 +378,7 @@ export class ProfilerEditor extends BaseEditor { return this._input as ProfilerInput; } - public setInput(input: ProfilerInput, options?: EditorOptions): TPromise { + public setInput(input: ProfilerInput, options?: EditorOptions): Thenable { let savedViewState = this._savedTableViewStates.get(input); this._profilerEditorContextKey.set(true); @@ -384,7 +389,7 @@ export class ProfilerEditor extends BaseEditor { return TPromise.as(null); } - return super.setInput(input, options).then(() => { + return super.setInput(input, options, CancellationToken.None).then(() => { this._profilerTableEditor.setInput(input); if (input.viewTemplate) { @@ -422,7 +427,7 @@ export class ProfilerEditor extends BaseEditor { } public toggleSearch(): void { - if (this._editor.getControl().isFocused()) { + if (this._editor.getControl().hasTextFocus()) { let editor = this._editor.getControl() as ICodeEditor; let controller = CommonFindController.get(editor); if (controller) { @@ -544,12 +549,20 @@ export class ProfilerEditor extends BaseEditor { this._savedTableViewStates.set(this.input, this._profilerTableEditor.saveViewState()); } } + + public focus() { + super.focus(); + let savedViewState = this._savedTableViewStates.get(this.input); + if (savedViewState) { + this._profilerTableEditor.restoreViewState(savedViewState); + } + } } abstract class SettingsCommand extends Command { protected getProfilerEditor(accessor: ServicesAccessor): ProfilerEditor { - const activeEditor = accessor.get(IWorkbenchEditorService).getActiveEditor(); + const activeEditor = accessor.get(IEditorService).activeControl; if (activeEditor instanceof ProfilerEditor) { return activeEditor; } @@ -572,7 +585,9 @@ class StartSearchProfilerTableCommand extends SettingsCommand { const command = new StartSearchProfilerTableCommand({ id: PROFILER_TABLE_COMMAND_SEARCH, precondition: ContextKeyExpr.and(CONTEXT_PROFILER_EDITOR), - kbOpts: { primary: KeyMod.CtrlCmd | KeyCode.KEY_F } + kbOpts: { + primary: KeyMod.CtrlCmd | KeyCode.KEY_F, + weight: KeybindingWeight.EditorContrib + } }); - -KeybindingsRegistry.registerCommandAndKeybindingRule(command.toCommandAndKeybindingRule(KeybindingsRegistry.WEIGHT.editorContrib())); +command.register(); diff --git a/src/sql/parts/profiler/editor/profilerResourceEditor.ts b/src/sql/parts/profiler/editor/profilerResourceEditor.ts index 91b70f34a9..8a5d042201 100644 --- a/src/sql/parts/profiler/editor/profilerResourceEditor.ts +++ b/src/sql/parts/profiler/editor/profilerResourceEditor.ts @@ -19,20 +19,22 @@ import { IStorageService } from 'vs/platform/storage/common/storage'; import { ITextResourceConfigurationService } from 'vs/editor/common/services/resourceConfiguration'; import { IModeService } from 'vs/editor/common/services/modeService'; import { ITextFileService } from 'vs/workbench/services/textfile/common/textfiles'; -import { IEditorGroupService } from 'vs/workbench/services/group/common/groupService'; +import { IEditorGroupsService } from 'vs/workbench/services/group/common/editorGroupsService'; import { EditorOptions } from 'vs/workbench/common/editor'; -import { CodeEditor } from 'vs/editor/browser/codeEditor'; import { IEditorContributionCtor } from 'vs/editor/browser/editorExtensions'; import { FoldingController } from 'vs/editor/contrib/folding/folding'; +import { StandaloneCodeEditor } from 'vs/editor/standalone/browser/standaloneCodeEditor'; +import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; +import { CancellationToken } from 'vs/base/common/cancellation'; -class ProfilerResourceCodeEditor extends CodeEditor { +class ProfilerResourceCodeEditor extends StandaloneCodeEditor { - protected _getContributions(): IEditorContributionCtor[] { - let contributions = super._getContributions(); - let skipContributions = [FoldingController.prototype]; - contributions = contributions.filter(c => skipContributions.indexOf(c.prototype) === -1); - return contributions; - } + // protected _getContributions(): IEditorContributionCtor[] { + // let contributions = super._getContributions(); + // let skipContributions = [FoldingController.prototype]; + // contributions = contributions.filter(c => skipContributions.indexOf(c.prototype) === -1); + // return contributions; + // } } @@ -50,10 +52,11 @@ export class ProfilerResourceEditor extends BaseTextEditor { @IThemeService themeService: IThemeService, @IModeService modeService: IModeService, @ITextFileService textFileService: ITextFileService, - @IEditorGroupService editorGroupService: IEditorGroupService + @IEditorService protected editorService: IEditorService, + @IEditorGroupsService editorGroupService: IEditorGroupsService ) { - super(ProfilerResourceEditor.ID, telemetryService, instantiationService, storageService, configurationService, themeService, textFileService, editorGroupService); + super(ProfilerResourceEditor.ID, telemetryService, instantiationService, storageService, configurationService, themeService, textFileService, editorService, editorGroupService); } public createEditorControl(parent: HTMLElement, configuration: IEditorOptions): editorCommon.IEditor { @@ -79,8 +82,8 @@ export class ProfilerResourceEditor extends BaseTextEditor { return options; } - setInput(input: UntitledEditorInput, options: EditorOptions): TPromise { - return super.setInput(input, options) + setInput(input: UntitledEditorInput, options: EditorOptions): Thenable { + return super.setInput(input, options, CancellationToken.None) .then(() => this.input.resolve() .then(editorModel => editorModel.load()) .then(editorModel => this.getControl().setModel((editorModel).textEditorModel))); diff --git a/src/sql/parts/query/common/flavorStatus.ts b/src/sql/parts/query/common/flavorStatus.ts index 3fbd8c6a50..453a1a1cf9 100644 --- a/src/sql/parts/query/common/flavorStatus.ts +++ b/src/sql/parts/query/common/flavorStatus.ts @@ -8,14 +8,14 @@ import { $, append, show, hide } from 'vs/base/browser/dom'; import { IDisposable, combinedDisposable } from 'vs/base/common/lifecycle'; import { IStatusbarItem } from 'vs/workbench/browser/parts/statusbar/statusbar'; import { IEditorCloseEvent } from 'vs/workbench/common/editor'; -import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; -import { IEditorGroupService } from 'vs/workbench/services/group/common/groupService'; +import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; +import { IEditorGroupsService } from 'vs/workbench/services/group/common/editorGroupsService'; import { IQuickOpenService, IPickOpenEntry } from 'vs/platform/quickOpen/common/quickOpen'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { Action } from 'vs/base/common/actions'; import errors = require('vs/base/common/errors'); import { TPromise } from 'vs/base/common/winjs.base'; -import { getCodeEditor as getEditorWidget } from 'vs/editor/browser/services/codeEditorService'; +import { getCodeEditor } from 'vs/editor/browser/editorBrowser'; import nls = require('vs/nls'); import { IConnectionManagementService } from 'sql/parts/connection/common/connectionManagement'; @@ -24,6 +24,7 @@ import * as WorkbenchUtils from 'sql/workbench/common/sqlWorkbenchUtils'; import { DidChangeLanguageFlavorParams } from 'sqlops'; import Severity from 'vs/base/common/severity'; import { INotificationService } from 'vs/platform/notification/common/notification'; +import { EditorServiceImpl } from 'vs/workbench/browser/parts/editor/editor'; export interface ISqlProviderEntry extends IPickOpenEntry { providerId: string; @@ -68,8 +69,8 @@ export class SqlFlavorStatusbarItem implements IStatusbarItem { constructor( @IConnectionManagementService private _connectionManagementService: IConnectionManagementService, - @IWorkbenchEditorService private _editorService: IWorkbenchEditorService, - @IEditorGroupService private _editorGroupService: IEditorGroupService, + @IEditorService private _editorService: EditorServiceImpl, + @IEditorGroupsService private _editorGroupService: IEditorGroupsService, @IQuickOpenService private _quickOpenService: IQuickOpenService, @IInstantiationService private _instantiationService: IInstantiationService, ) { @@ -86,10 +87,9 @@ export class SqlFlavorStatusbarItem implements IStatusbarItem { this._toDispose = []; this._toDispose.push( this._connectionManagementService.onLanguageFlavorChanged((changeParams: DidChangeLanguageFlavorParams) => this._onFlavorChanged(changeParams)), - this._editorGroupService.onEditorsChanged(() => this._onEditorsChanged()), - this._editorGroupService.getStacksModel().onEditorClosed(event => this._onEditorClosed(event)) + this._editorService.onDidVisibleEditorsChange(() => this._onEditorsChanged()), + this._editorService.onDidCloseEditor(event => this._onEditorClosed(event)) ); - return combinedDisposable(this._toDispose); } @@ -104,7 +104,7 @@ export class SqlFlavorStatusbarItem implements IStatusbarItem { let uri = WorkbenchUtils.getEditorUri(event.editor); if (uri && uri in this._sqlStatusEditors) { // If active editor is being closed, hide the query status. - let activeEditor = this._editorService.getActiveEditor(); + let activeEditor = this._editorService.activeControl; if (activeEditor) { let currentUri = WorkbenchUtils.getEditorUri(activeEditor.input); if (uri === currentUri) { @@ -117,7 +117,7 @@ export class SqlFlavorStatusbarItem implements IStatusbarItem { } private _onEditorsChanged(): void { - let activeEditor = this._editorService.getActiveEditor(); + let activeEditor = this._editorService.activeControl; if (activeEditor) { let uri = WorkbenchUtils.getEditorUri(activeEditor.input); @@ -148,7 +148,7 @@ export class SqlFlavorStatusbarItem implements IStatusbarItem { // Show/hide query status for active editor private _showStatus(uri: string): void { - let activeEditor = this._editorService.getActiveEditor(); + let activeEditor = this._editorService.activeControl if (activeEditor) { let currentUri = WorkbenchUtils.getEditorUri(activeEditor.input); if (uri === currentUri) { @@ -172,7 +172,7 @@ export class ChangeFlavorAction extends Action { constructor( actionId: string, actionLabel: string, - @IWorkbenchEditorService private _editorService: IWorkbenchEditorService, + @IEditorService private _editorService: IEditorService, @IQuickOpenService private _quickOpenService: IQuickOpenService, @INotificationService private _notificationService: INotificationService, @IConnectionManagementService private _connectionManagementService: IConnectionManagementService @@ -181,14 +181,14 @@ export class ChangeFlavorAction extends Action { } public run(): TPromise { - let activeEditor = this._editorService.getActiveEditor(); + let activeEditor = this._editorService.activeControl; let currentUri = WorkbenchUtils.getEditorUri(activeEditor.input); if (this._connectionManagementService.isConnected(currentUri)) { let currentProvider = this._connectionManagementService.getProviderIdFromUri(currentUri); return this._showMessage(Severity.Info, nls.localize('alreadyConnected', "A connection using engine {0} exists. To change please disconnect or change connection", currentProvider)); } - const editorWidget = getEditorWidget(activeEditor); + const editorWidget = getCodeEditor(activeEditor); if (!editorWidget) { return this._showMessage(Severity.Info, nls.localize('noEditor', "No text editor active at this time")); } @@ -202,8 +202,8 @@ export class ChangeFlavorAction extends Action { // TODO: select the current language flavor return this._quickOpenService.pick(ProviderOptions, { placeHolder: nls.localize('pickSqlProvider', "Select SQL Language Provider"), autoFocus: { autoFocusIndex: 0 } }).then(provider => { if (provider) { - activeEditor = this._editorService.getActiveEditor(); - const editorWidget = getEditorWidget(activeEditor); + activeEditor = this._editorService.activeControl; + const editorWidget = getCodeEditor(activeEditor); if (editorWidget) { if (currentUri) { this._connectionManagementService.doChangeLanguageFlavor(currentUri, 'sql', provider.providerId); diff --git a/src/sql/parts/query/common/query.contribution.ts b/src/sql/parts/query/common/query.contribution.ts index 14711f144e..5e4674e202 100644 --- a/src/sql/parts/query/common/query.contribution.ts +++ b/src/sql/parts/query/common/query.contribution.ts @@ -12,7 +12,7 @@ import { IWorkbenchActionRegistry, Extensions } from 'vs/workbench/common/action import { IConfigurationRegistry, Extensions as ConfigExtensions } from 'vs/platform/configuration/common/configurationRegistry'; import { SyncActionDescriptor } from 'vs/platform/actions/common/actions'; import { KeyMod, KeyCode, KeyChord } from 'vs/base/common/keyCodes'; -import { KeybindingsRegistry } from 'vs/platform/keybinding/common/keybindingsRegistry'; +import { KeybindingsRegistry, KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry'; import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; @@ -178,7 +178,7 @@ actionRegistry.registerWorkbenchAction( KeybindingsRegistry.registerCommandAndKeybindingRule({ id: gridActions.GRID_COPY_ID, - weight: KeybindingsRegistry.WEIGHT.workbenchContrib(gridCommandsWeightBonus), + weight: KeybindingWeight.EditorContrib, when: ResultsGridFocusCondition, primary: KeyMod.CtrlCmd | KeyCode.KEY_C, handler: gridCommands.copySelection @@ -186,7 +186,7 @@ KeybindingsRegistry.registerCommandAndKeybindingRule({ KeybindingsRegistry.registerCommandAndKeybindingRule({ id: gridActions.MESSAGES_SELECTALL_ID, - weight: KeybindingsRegistry.WEIGHT.workbenchContrib(gridCommandsWeightBonus), + weight: KeybindingWeight.EditorContrib, when: ResultsMessagesFocusCondition, primary: KeyMod.CtrlCmd | KeyCode.KEY_A, handler: gridCommands.selectAllMessages @@ -194,7 +194,7 @@ KeybindingsRegistry.registerCommandAndKeybindingRule({ KeybindingsRegistry.registerCommandAndKeybindingRule({ id: gridActions.GRID_SELECTALL_ID, - weight: KeybindingsRegistry.WEIGHT.workbenchContrib(gridCommandsWeightBonus), + weight: KeybindingWeight.EditorContrib, when: ResultsGridFocusCondition, primary: KeyMod.CtrlCmd | KeyCode.KEY_A, handler: gridCommands.selectAll @@ -202,7 +202,7 @@ KeybindingsRegistry.registerCommandAndKeybindingRule({ KeybindingsRegistry.registerCommandAndKeybindingRule({ id: gridActions.MESSAGES_COPY_ID, - weight: KeybindingsRegistry.WEIGHT.workbenchContrib(gridCommandsWeightBonus), + weight: KeybindingWeight.EditorContrib, when: ResultsMessagesFocusCondition, primary: KeyMod.CtrlCmd | KeyCode.KEY_C, handler: gridCommands.copyMessagesSelection @@ -210,7 +210,7 @@ KeybindingsRegistry.registerCommandAndKeybindingRule({ KeybindingsRegistry.registerCommandAndKeybindingRule({ id: gridActions.GRID_SAVECSV_ID, - weight: KeybindingsRegistry.WEIGHT.workbenchContrib(gridCommandsWeightBonus), + weight: KeybindingWeight.EditorContrib, when: ResultsGridFocusCondition, primary: KeyChord(KeyMod.CtrlCmd | KeyCode.KEY_R, KeyMod.CtrlCmd | KeyCode.KEY_C), handler: gridCommands.saveAsCsv @@ -218,7 +218,7 @@ KeybindingsRegistry.registerCommandAndKeybindingRule({ KeybindingsRegistry.registerCommandAndKeybindingRule({ id: gridActions.GRID_SAVEJSON_ID, - weight: KeybindingsRegistry.WEIGHT.workbenchContrib(gridCommandsWeightBonus), + weight: KeybindingWeight.EditorContrib, when: ResultsGridFocusCondition, primary: KeyChord(KeyMod.CtrlCmd | KeyCode.KEY_R, KeyMod.CtrlCmd | KeyCode.KEY_J), handler: gridCommands.saveAsJson @@ -226,7 +226,7 @@ KeybindingsRegistry.registerCommandAndKeybindingRule({ KeybindingsRegistry.registerCommandAndKeybindingRule({ id: gridActions.GRID_SAVEEXCEL_ID, - weight: KeybindingsRegistry.WEIGHT.workbenchContrib(gridCommandsWeightBonus), + weight: KeybindingWeight.EditorContrib, when: ResultsGridFocusCondition, primary: KeyChord(KeyMod.CtrlCmd | KeyCode.KEY_R, KeyMod.CtrlCmd | KeyCode.KEY_E), handler: gridCommands.saveAsExcel @@ -234,7 +234,7 @@ KeybindingsRegistry.registerCommandAndKeybindingRule({ KeybindingsRegistry.registerCommandAndKeybindingRule({ id: gridActions.GRID_VIEWASCHART_ID, - weight: KeybindingsRegistry.WEIGHT.workbenchContrib(gridCommandsWeightBonus), + weight: KeybindingWeight.EditorContrib, when: ResultsGridFocusCondition, primary: KeyChord(KeyMod.CtrlCmd | KeyCode.KEY_R, KeyMod.CtrlCmd | KeyCode.KEY_V), handler: gridCommands.viewAsChart @@ -242,7 +242,7 @@ KeybindingsRegistry.registerCommandAndKeybindingRule({ KeybindingsRegistry.registerCommandAndKeybindingRule({ id: gridActions.GRID_GOTONEXTGRID_ID, - weight: KeybindingsRegistry.WEIGHT.workbenchContrib(gridCommandsWeightBonus), + weight: KeybindingWeight.EditorContrib, when: ResultsGridFocusCondition, primary: KeyChord(KeyMod.CtrlCmd | KeyCode.KEY_R, KeyMod.CtrlCmd | KeyCode.KEY_N), handler: gridCommands.goToNextGrid @@ -250,7 +250,7 @@ KeybindingsRegistry.registerCommandAndKeybindingRule({ KeybindingsRegistry.registerCommandAndKeybindingRule({ id: gridActions.TOGGLERESULTS_ID, - weight: KeybindingsRegistry.WEIGHT.workbenchContrib(gridCommandsWeightBonus), + weight: KeybindingWeight.EditorContrib, when: QueryEditorVisibleCondition, primary: KeyMod.CtrlCmd | KeyMod.Alt | KeyCode.KEY_R, handler: gridCommands.toggleResultsPane @@ -258,7 +258,7 @@ KeybindingsRegistry.registerCommandAndKeybindingRule({ KeybindingsRegistry.registerCommandAndKeybindingRule({ id: gridActions.TOGGLEMESSAGES_ID, - weight: KeybindingsRegistry.WEIGHT.workbenchContrib(gridCommandsWeightBonus), + weight: KeybindingWeight.EditorContrib, when: QueryEditorVisibleCondition, primary: KeyMod.CtrlCmd | KeyMod.Alt | KeyCode.KEY_Y, handler: gridCommands.toggleMessagePane @@ -266,7 +266,7 @@ KeybindingsRegistry.registerCommandAndKeybindingRule({ KeybindingsRegistry.registerCommandAndKeybindingRule({ id: gridActions.GOTONEXTQUERYOUTPUTTAB_ID, - weight: KeybindingsRegistry.WEIGHT.workbenchContrib(gridCommandsWeightBonus), + weight: KeybindingWeight.EditorContrib, when: QueryEditorVisibleCondition, primary: KeyMod.CtrlCmd | KeyMod.Alt | KeyCode.KEY_P, handler: gridCommands.goToNextQueryOutputTab @@ -383,7 +383,7 @@ for (let i = 0; i < 9; i++) { KeybindingsRegistry.registerCommandAndKeybindingRule({ id: `workbench.action.query.shortcut${queryIndex}`, - weight: KeybindingsRegistry.WEIGHT.workbenchContrib(), + weight: KeybindingWeight.WorkbenchContrib, when: QueryEditorVisibleCondition, primary: defaultPrimary, handler: accessor => { diff --git a/src/sql/parts/query/common/queryInput.ts b/src/sql/parts/query/common/queryInput.ts index 420f138439..a095265580 100644 --- a/src/sql/parts/query/common/queryInput.ts +++ b/src/sql/parts/query/common/queryInput.ts @@ -54,7 +54,6 @@ export class QueryInput extends EditorInput implements IEncodingSupport, IConnec private _showQueryResultsEditor: Emitter; private _updateSelection: Emitter; - private _toDispose: IDisposable[]; private _currentEventCallbacks: IDisposable[]; public savedViewState: IEditorViewState; diff --git a/src/sql/parts/query/common/resultSerializer.ts b/src/sql/parts/query/common/resultSerializer.ts index 611b22dc90..4b9c7b089e 100644 --- a/src/sql/parts/query/common/resultSerializer.ts +++ b/src/sql/parts/query/common/resultSerializer.ts @@ -15,7 +15,6 @@ import * as PathUtilities from 'sql/common/pathUtilities'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IOutputService, IOutputChannel, IOutputChannelRegistry, Extensions as OutputExtensions } from 'vs/workbench/parts/output/common/output'; import { IWorkspaceConfigurationService } from 'vs/workbench/services/configuration/common/configuration'; -import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; import { IWindowsService, IWindowService, FileFilter } from 'vs/platform/windows/common/windows'; import { Registry } from 'vs/platform/registry/common/platform'; @@ -31,6 +30,7 @@ import Severity from 'vs/base/common/severity'; import { INotificationService } from 'vs/platform/notification/common/notification'; import { getBaseLabel } from 'vs/base/common/labels'; import { ShowFileInFolderAction, OpenFileInFolderAction } from 'sql/workbench/common/workspaceActions'; +import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; let prevSavePath: string; @@ -49,7 +49,7 @@ export class ResultSerializer { @IOutputService private _outputService: IOutputService, @IQueryManagementService private _queryManagementService: IQueryManagementService, @IWorkspaceConfigurationService private _workspaceConfigurationService: IWorkspaceConfigurationService, - @IWorkbenchEditorService private _editorService: IWorkbenchEditorService, + @IEditorService private _editorService: IEditorService, @IWorkspaceContextService private _contextService: IWorkspaceContextService, @IWindowsService private _windowsService: IWindowsService, @IWindowService private _windowService: IWindowService, diff --git a/src/sql/parts/query/common/rowCountStatus.ts b/src/sql/parts/query/common/rowCountStatus.ts index cf13bf76f1..a16a204efa 100644 --- a/src/sql/parts/query/common/rowCountStatus.ts +++ b/src/sql/parts/query/common/rowCountStatus.ts @@ -9,11 +9,12 @@ import QueryRunner from 'sql/parts/query/execution/queryRunner'; import { IStatusbarItem } from 'vs/workbench/browser/parts/statusbar/statusbar'; import { IDisposable, combinedDisposable, dispose } from 'vs/base/common/lifecycle'; -import { IEditorGroupService } from 'vs/workbench/services/group/common/groupService'; -import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; +import { IEditorGroupsService } from 'vs/workbench/services/group/common/editorGroupsService'; +import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { IEditorCloseEvent } from 'vs/workbench/common/editor'; import { append, $, hide, show } from 'vs/base/browser/dom'; import * as nls from 'vs/nls'; +import { EditorServiceImpl } from 'vs/workbench/browser/parts/editor/editor'; export class RowCountStatusBarItem implements IStatusbarItem { @@ -23,15 +24,15 @@ export class RowCountStatusBarItem implements IStatusbarItem { private dispose: IDisposable; constructor( - @IWorkbenchEditorService private _editorService: IWorkbenchEditorService, - @IEditorGroupService private _editorGroupService: IEditorGroupService, + @IEditorService private _editorService: EditorServiceImpl, + @IEditorGroupsService private _editorGroupService: IEditorGroupsService, @IQueryModelService private _queryModelService: IQueryModelService ) { } render(container: HTMLElement): IDisposable { let disposables = [ - this._editorGroupService.onEditorsChanged(this._onEditorsChanged, this), - this._editorGroupService.getStacksModel().onEditorClosed(this._onEditorClosed, this) + this._editorService.onDidVisibleEditorsChange(() => this._onEditorsChanged()), + this._editorService.onDidCloseEditor(event => this._onEditorClosed(event)) ]; this._element = append(container, $('.query-statusbar-group')); @@ -56,7 +57,7 @@ export class RowCountStatusBarItem implements IStatusbarItem { private _showStatus(): void { hide(this._flavorElement); dispose(this.dispose); - let activeEditor = this._editorService.getActiveEditor(); + let activeEditor = this._editorService.activeControl; if (activeEditor) { let currentUri = WorkbenchUtils.getEditorUri(activeEditor.input); if (currentUri) { diff --git a/src/sql/parts/query/editor/actions.ts b/src/sql/parts/query/editor/actions.ts index 8198d2010d..53b1336c5e 100644 --- a/src/sql/parts/query/editor/actions.ts +++ b/src/sql/parts/query/editor/actions.ts @@ -16,11 +16,8 @@ import QueryRunner from 'sql/parts/query/execution/queryRunner'; import { SaveFormat } from 'sql/parts/grid/common/interfaces'; import { Table } from 'sql/base/browser/ui/table/table'; import { GridTableState } from 'sql/parts/query/editor/gridPanel'; -import { IEditorService } from 'vs/platform/editor/common/editor'; -import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService'; import { QueryEditor } from './queryEditor'; -import { IEditorGroupService } from 'vs/workbench/services/group/common/groupService'; -import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; +import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; export interface IGridActionContext { cell: { row: number; cell: number; }; @@ -169,12 +166,12 @@ export class ChartDataAction extends Action { public static LABEL = localize('chart', 'Chart'); public static ICON = 'viewChart'; - constructor(@IWorkbenchEditorService private editorService: IWorkbenchEditorService) { + constructor(@IEditorService private editorService: IEditorService) { super(ChartDataAction.ID, ChartDataAction.LABEL, ChartDataAction.ICON); } public run(context: IGridActionContext): TPromise { - let activeEditor = this.editorService.getActiveEditor(); + let activeEditor = this.editorService.activeEditor; if (activeEditor instanceof QueryEditor) { activeEditor.resultsEditor.chart({ batchId: context.batchId, resultId: context.resultId }); return TPromise.as(true); diff --git a/src/sql/parts/query/editor/gridPanel.ts b/src/sql/parts/query/editor/gridPanel.ts index 7e62cf218f..5ee19cfb54 100644 --- a/src/sql/parts/query/editor/gridPanel.ts +++ b/src/sql/parts/query/editor/gridPanel.ts @@ -90,14 +90,14 @@ export class GridPanel extends ViewletPanel { private maximizedGrid: GridTable; constructor( - title: string, options: IViewletPanelOptions, + options: IViewletPanelOptions, @IKeybindingService keybindingService: IKeybindingService, @IContextMenuService contextMenuService: IContextMenuService, @IConfigurationService configurationService: IConfigurationService, @IThemeService private themeService: IThemeService, @IInstantiationService private instantiationService: IInstantiationService ) { - super(title, options, keybindingService, contextMenuService, configurationService); + super(options, keybindingService, contextMenuService, configurationService); this.splitView = new ScrollableSplitView(this.container, { enableResizing: false }); } @@ -219,6 +219,7 @@ class GridTable extends Disposable implements IView { public readonly onDidChange: Event = this._onDidChange.event; public id = generateUuid(); + readonly element: HTMLElement = this.container; constructor( private runner: QueryRunner, diff --git a/src/sql/parts/query/editor/messagePanel.ts b/src/sql/parts/query/editor/messagePanel.ts index 424aca1f3f..9d9858eecc 100644 --- a/src/sql/parts/query/editor/messagePanel.ts +++ b/src/sql/parts/query/editor/messagePanel.ts @@ -28,7 +28,7 @@ import { $ } from 'vs/base/browser/builder'; import { isArray } from 'vs/base/common/types'; import { IDisposable, dispose } from 'vs/base/common/lifecycle'; import { localize } from 'vs/nls'; -import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; +import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { IEditor } from 'vs/editor/common/editorCommon'; export interface IResultMessageIntern extends IResultMessage { @@ -71,14 +71,14 @@ export class MessagePanel extends ViewletPanel { private tree: ITree; constructor( - title: string, options: IViewletPanelOptions, + options: IViewletPanelOptions, @IKeybindingService keybindingService: IKeybindingService, @IContextMenuService contextMenuService: IContextMenuService, @IConfigurationService configurationService: IConfigurationService, @IThemeService private themeService: IThemeService, @IInstantiationService instantiationService: IInstantiationService ) { - super(title, options, keybindingService, contextMenuService, configurationService); + super(options, keybindingService, contextMenuService, configurationService); this.controller = instantiationService.createInstance(MessageController, { openMode: OpenMode.SINGLE_CLICK, clickBehavior: ClickBehavior.ON_MOUSE_UP /* do not change, to preserve focus behaviour in input field */ }); this.controller.toFocusOnClick = this.model; this.tree = new Tree(this.container, { @@ -257,7 +257,7 @@ export class MessageController extends WorkbenchTreeController { constructor( options: IControllerOptions, @IConfigurationService configurationService: IConfigurationService, - @IWorkbenchEditorService private workbenchEditorService: IWorkbenchEditorService, + @IEditorService private workbenchEditorService: IEditorService, @IContextMenuService private contextMenuService: IContextMenuService, @IInstantiationService private instantiationService: IInstantiationService ) { @@ -283,7 +283,7 @@ export class MessageController extends WorkbenchTreeController { if (element.selection) { let selection: ISelectionData = element.selection; // this is a batch statement - let control = this.workbenchEditorService.getActiveEditor().getControl() as IEditor; + let control = this.workbenchEditorService.activeControl.getControl() as IEditor; control.setSelection({ startColumn: selection.startColumn + 1, endColumn: selection.endColumn + 1, diff --git a/src/sql/parts/query/editor/queryEditor.ts b/src/sql/parts/query/editor/queryEditor.ts index d9c6724c24..062dbc2ecc 100644 --- a/src/sql/parts/query/editor/queryEditor.ts +++ b/src/sql/parts/query/editor/queryEditor.ts @@ -8,9 +8,8 @@ import { TPromise } from 'vs/base/common/winjs.base'; import * as strings from 'vs/base/common/strings'; import * as DOM from 'vs/base/browser/dom'; -import { EditorInput, EditorOptions } from 'vs/workbench/common/editor'; +import { EditorInput, EditorOptions, IEditorControl, IEditor } from 'vs/workbench/common/editor'; import { BaseEditor } from 'vs/workbench/browser/parts/editor/baseEditor'; -import { IEditorControl, Position, IEditor, IEditorInput } from 'vs/platform/editor/common/editor'; import { VerticalFlexibleSash, HorizontalFlexibleSash, IFlexibleSash } from 'sql/parts/query/views/flexibleSash'; import { Orientation } from 'vs/base/browser/ui/sash/sash'; @@ -21,18 +20,15 @@ import { IInstantiationService } from 'vs/platform/instantiation/common/instanti import { UntitledEditorInput } from 'vs/workbench/common/editor/untitledEditorInput'; import { TextResourceEditor } from 'vs/workbench/browser/parts/editor/textResourceEditor'; -import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; +import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { IContextKey, IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { IContextMenuService } from 'vs/platform/contextview/browser/contextView'; import { IActionItem } from 'vs/base/browser/ui/actionbar/actionbar'; import { Action } from 'vs/base/common/actions'; import { ISelectionData } from 'sqlops'; -import { IEditorGroupService } from 'vs/workbench/services/group/common/groupService'; -import { CodeEditor } from 'vs/editor/browser/codeEditor'; +import { IEditorGroup } from 'vs/workbench/services/group/common/editorGroupsService'; import { IDisposable } from 'vs/base/common/lifecycle'; import { IRange } from 'vs/editor/common/core/range'; -import { IEditorViewState } from 'vs/editor/common/editorCommon'; -import { Emitter } from 'vs/base/common/event'; import { QueryResultsInput } from 'sql/parts/query/common/queryResultsInput'; import { QueryInput } from 'sql/parts/query/common/queryInput'; @@ -48,6 +44,8 @@ import { IQueryModelService } from 'sql/parts/query/execution/queryModel'; import { IEditorDescriptorService } from 'sql/parts/query/editor/editorDescriptorService'; import { IConnectionManagementService } from 'sql/parts/connection/common/connectionManagement'; import { attachEditableDropdownStyler } from 'sql/common/theme/styler'; +import { CancellationToken } from 'vs/base/common/cancellation'; +import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; /** * Editor that hosts 2 sub-editors: A TextResourceEditor for SQL file editing, and a QueryResultsEditor @@ -93,11 +91,10 @@ export class QueryEditor extends BaseEditor { @ITelemetryService _telemetryService: ITelemetryService, @IThemeService themeService: IThemeService, @IInstantiationService private _instantiationService: IInstantiationService, - @IWorkbenchEditorService private _editorService: IWorkbenchEditorService, + @IEditorService private _editorService: IEditorService, @IContextMenuService private _contextMenuService: IContextMenuService, @IQueryModelService private _queryModelService: IQueryModelService, @IEditorDescriptorService private _editorDescriptorService: IEditorDescriptorService, - @IEditorGroupService private _editorGroupService: IEditorGroupService, @IContextKeyService contextKeyService: IContextKeyService, @IConnectionManagementService private _connectionManagementService: IConnectionManagementService ) { @@ -109,11 +106,12 @@ export class QueryEditor extends BaseEditor { this.queryEditorVisible = queryContext.QueryEditorVisibleContext.bindTo(contextKeyService); } - if (_editorGroupService) { - _editorGroupService.onEditorOpening(e => { - if (this.isVisible() && (e.input !== this.input || e.position !== this.position)) { + if (_editorService) { + _editorService.overrideOpenEditor((editor, options, group) => { + if (this.isVisible() && (editor !== this.input || group !== this.group)) { this.saveEditorViewState(); } + return {}; }); } } @@ -157,7 +155,7 @@ export class QueryEditor extends BaseEditor { /** * Sets the input data for this editor. */ - public setInput(newInput: QueryInput, options?: EditorOptions): TPromise { + public setInput(newInput: QueryInput, options?: EditorOptions): Thenable { const oldInput = this.input; if (newInput.matches(oldInput)) { @@ -171,21 +169,21 @@ export class QueryEditor extends BaseEditor { let selectionCallback: IDisposable = newInput.updateSelectionEvent((selection) => this._setSelection(selection)); newInput.setEventCallbacks([taskbarCallback, showResultsCallback, selectionCallback]); - return super.setInput(newInput, options) + return super.setInput(newInput, options, CancellationToken.None) .then(() => this._updateInput(oldInput, newInput, options)); } /** * Sets this editor and the 2 sub-editors to visible. */ - public setEditorVisible(visible: boolean, position: Position): void { + public setEditorVisible(visible: boolean, group: IEditorGroup): void { if (this._resultsEditor) { - this._resultsEditor.setVisible(visible, position); + this._resultsEditor.setVisible(visible, group); } if (this._sqlEditor) { - this._sqlEditor.setVisible(visible, position); + this._sqlEditor.setVisible(visible, group); } - super.setEditorVisible(visible, position); + super.setEditorVisible(visible, group); // Note: must update after calling super.setEditorVisible so that the accurate count is handled this.updateQueryEditorVisible(visible); @@ -197,7 +195,7 @@ export class QueryEditor extends BaseEditor { let visible = currentEditorIsVisible; if (!currentEditorIsVisible) { // Current editor is closing but still tracked as visible. Check if any other editor is visible - const candidates = [...this._editorService.getVisibleEditors()].filter(e => { + const candidates = [...this._editorService.visibleControls].filter(e => { if (e && e.getId) { return e.getId() === QueryEditor.ID; } @@ -211,20 +209,6 @@ export class QueryEditor extends BaseEditor { } } - - /** - * Changes the position of the editor. - */ - public changePosition(position: Position): void { - if (this._resultsEditor) { - this._resultsEditor.changePosition(position); - } - if (this._sqlEditor) { - this._sqlEditor.changePosition(position); - } - super.changePosition(position); - } - /** * Called to indicate to the editor that the input should be cleared and resources associated with the * input should be freed. @@ -303,7 +287,8 @@ export class QueryEditor extends BaseEditor { return; } - this._editorGroupService.pinEditor(this.position, this.input); + const activeControl = this._editorService.activeControl; + activeControl.group.pinEditor(activeControl.input); let input = this.input; this._createResultsEditorContainer(); @@ -363,7 +348,7 @@ export class QueryEditor extends BaseEditor { public isSelectionEmpty(): boolean { if (this._sqlEditor && this._sqlEditor.getControl()) { let control = this._sqlEditor.getControl(); - let codeEditor: CodeEditor = control; + let codeEditor: ICodeEditor = control; if (codeEditor) { let value = codeEditor.getValue(); @@ -378,7 +363,7 @@ export class QueryEditor extends BaseEditor { public getAllText(): string { if (this._sqlEditor && this._sqlEditor.getControl()) { let control = this._sqlEditor.getControl(); - let codeEditor: CodeEditor = control; + let codeEditor: ICodeEditor = control; if (codeEditor) { let value = codeEditor.getValue(); if (value !== undefined && value.length > 0) { @@ -394,7 +379,7 @@ export class QueryEditor extends BaseEditor { public getSelectionText(): string { if (this._sqlEditor && this._sqlEditor.getControl()) { let control = this._sqlEditor.getControl(); - let codeEditor: CodeEditor = control; + let codeEditor: ICodeEditor = control; let vscodeSelection = control.getSelection(); if (codeEditor && vscodeSelection) { @@ -569,7 +554,9 @@ export class QueryEditor extends BaseEditor { return this._createEditor(newInput.sql, this._sqlEditorContainer); }; onEditorsCreated = (result: TextResourceEditor) => { - return this._onSqlEditorCreated(result, newInput.sql, options); + return TPromise.join([ + this._onSqlEditorCreated(result, newInput.sql, options) + ]); }; } @@ -604,16 +591,16 @@ export class QueryEditor extends BaseEditor { let editor = descriptor.instantiate(this._instantiationService); editor.create(container); - editor.setVisible(this.isVisible(), this.position); + editor.setVisible(this.isVisible(), editor.group); return TPromise.as(editor); } /** * Sets input for the SQL editor after it has been created. */ - private _onSqlEditorCreated(sqlEditor: TextResourceEditor, sqlInput: UntitledEditorInput, options: EditorOptions): TPromise { + private _onSqlEditorCreated(sqlEditor: TextResourceEditor, sqlInput: UntitledEditorInput, options: EditorOptions): Thenable { this._sqlEditor = sqlEditor; - return this._sqlEditor.setInput(sqlInput, options); + return this._sqlEditor.setInput(sqlInput, options, CancellationToken.None); } /** diff --git a/src/sql/parts/query/editor/queryResultsEditor.ts b/src/sql/parts/query/editor/queryResultsEditor.ts index 36590066f7..2f1d6ff1cf 100644 --- a/src/sql/parts/query/editor/queryResultsEditor.ts +++ b/src/sql/parts/query/editor/queryResultsEditor.ts @@ -20,11 +20,8 @@ import { IInstantiationService } from 'vs/platform/instantiation/common/instanti import { QueryResultsInput } from 'sql/parts/query/common/queryResultsInput'; import { IQueryModelService } from 'sql/parts/query/execution/queryModel'; -import { bootstrapAngular } from 'sql/services/bootstrap/bootstrapService'; -import { IQueryComponentParams } from 'sql/services/bootstrap/bootstrapParams'; -import { QueryOutputModule } from 'sql/parts/query/views/queryOutput.module'; -import { QUERY_OUTPUT_SELECTOR } from 'sql/parts/query/views/queryOutput.component'; import { QueryResultsView } from 'sql/parts/query/editor/queryResultsView'; +import { CancellationToken } from 'vs/base/common/cancellation'; export const RESULTS_GRID_DEFAULTS = { cellPadding: [6, 10, 5], @@ -146,7 +143,7 @@ export class QueryResultsEditor extends BaseEditor { } setInput(input: QueryResultsInput, options: EditorOptions): TPromise { - super.setInput(input, options); + super.setInput(input, options, CancellationToken.None); this.resultsView.input = input; return TPromise.wrap(null); } diff --git a/src/sql/parts/query/editor/queryResultsView.ts b/src/sql/parts/query/editor/queryResultsView.ts index b9dc6869db..4c18f263a0 100644 --- a/src/sql/parts/query/editor/queryResultsView.ts +++ b/src/sql/parts/query/editor/queryResultsView.ts @@ -26,8 +26,10 @@ class ResultsView implements IPanelView { constructor(instantiationService: IInstantiationService) { this.panelViewlet = instantiationService.createInstance(PanelViewlet, 'resultsView', { showHeaderInTitleWhenSingleView: false }); - this.gridPanel = instantiationService.createInstance(GridPanel, nls.localize('gridPanel', 'Results'), {}); - this.messagePanel = instantiationService.createInstance(MessagePanel, nls.localize('messagePanel', 'Messages'), {}); + this.gridPanel = instantiationService.createInstance(GridPanel, { title: nls.localize('gridPanel', 'Results') }); + this.messagePanel = instantiationService.createInstance(MessagePanel, { title: nls.localize('messagePanel', 'Messages') }); + this.gridPanel.render(); + this.messagePanel.render(); this.panelViewlet.create(this.container).then(() => { this.panelViewlet.addPanels([ { panel: this.gridPanel, size: 1000, index: 0 }, diff --git a/src/sql/parts/query/execution/keyboardQueryActions.ts b/src/sql/parts/query/execution/keyboardQueryActions.ts index e84836f0a0..5a781e2982 100644 --- a/src/sql/parts/query/execution/keyboardQueryActions.ts +++ b/src/sql/parts/query/execution/keyboardQueryActions.ts @@ -6,7 +6,7 @@ import nls = require('vs/nls'); import { Action } from 'vs/base/common/actions'; -import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; +import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { TPromise } from 'vs/base/common/winjs.base'; import { IWorkspaceConfigurationService } from 'vs/workbench/services/configuration/common/configuration'; @@ -31,8 +31,8 @@ export function isConnected(editor: QueryEditor, connectionManagementService: IC return connectionManagementService.isConnected(editor.currentQueryInput.uri); } -function runActionOnActiveQueryEditor(editorService: IWorkbenchEditorService, action: (QueryEditor) => void): void { - const candidates = [editorService.getActiveEditor(), ...editorService.getVisibleEditors()].filter(e => e instanceof QueryEditor); +function runActionOnActiveQueryEditor(editorService: IEditorService, action: (QueryEditor) => void): void { + const candidates = [editorService.activeControl, ...editorService.visibleControls].filter(e => e instanceof QueryEditor); if (candidates.length > 0) { action(candidates[0]); } @@ -65,14 +65,14 @@ export class FocusOnCurrentQueryKeyboardAction extends Action { constructor( id: string, label: string, - @IWorkbenchEditorService private _editorService: IWorkbenchEditorService + @IEditorService private _editorService: IEditorService ) { super(id, label); this.enabled = true; } public run(): TPromise { - let editor = this._editorService.getActiveEditor(); + let editor = this._editorService.activeControl; if (editor && editor instanceof QueryEditor) { let queryEditor: QueryEditor = editor; queryEditor.focus(); @@ -92,14 +92,14 @@ export class RunQueryKeyboardAction extends Action { constructor( id: string, label: string, - @IWorkbenchEditorService private _editorService: IWorkbenchEditorService + @IEditorService private _editorService: IEditorService ) { super(id, label); this.enabled = true; } public run(): TPromise { - let editor = this._editorService.getActiveEditor(); + let editor = this._editorService.activeControl; if (editor && (editor instanceof QueryEditor || editor instanceof EditDataEditor)) { let queryEditor: QueryEditor | EditDataEditor = editor; queryEditor.runQuery(); @@ -118,14 +118,14 @@ export class RunCurrentQueryKeyboardAction extends Action { constructor( id: string, label: string, - @IWorkbenchEditorService private _editorService: IWorkbenchEditorService + @IEditorService private _editorService: IEditorService ) { super(id, label); this.enabled = true; } public run(): TPromise { - let editor = this._editorService.getActiveEditor(); + let editor = this._editorService.activeControl; if (editor && editor instanceof QueryEditor) { let queryEditor: QueryEditor = editor; queryEditor.runCurrentQuery(); @@ -141,14 +141,14 @@ export class RunCurrentQueryWithActualPlanKeyboardAction extends Action { constructor( id: string, label: string, - @IWorkbenchEditorService private _editorService: IWorkbenchEditorService + @IEditorService private _editorService: IEditorService ) { super(id, label); this.enabled = true; } public run(): TPromise { - let editor = this._editorService.getActiveEditor(); + let editor = this._editorService.activeControl; if (editor && editor instanceof QueryEditor) { let queryEditor: QueryEditor = editor; queryEditor.runCurrentQueryWithActualPlan(); @@ -168,14 +168,14 @@ export class CancelQueryKeyboardAction extends Action { constructor( id: string, label: string, - @IWorkbenchEditorService private _editorService: IWorkbenchEditorService + @IEditorService private _editorService: IEditorService ) { super(id, label); this.enabled = true; } public run(): TPromise { - let editor = this._editorService.getActiveEditor(); + let editor = this._editorService.activeControl; if (editor && (editor instanceof QueryEditor || editor instanceof EditDataEditor)) { let queryEditor: QueryEditor | EditDataEditor = editor; queryEditor.cancelQuery(); @@ -194,14 +194,14 @@ export class RefreshIntellisenseKeyboardAction extends Action { constructor( id: string, label: string, - @IWorkbenchEditorService private _editorService: IWorkbenchEditorService + @IEditorService private _editorService: IEditorService ) { super(id, label); this.enabled = true; } public run(): TPromise { - let editor = this._editorService.getActiveEditor(); + let editor = this._editorService.activeControl; if (editor && editor instanceof QueryEditor) { let queryEditor: QueryEditor = editor; queryEditor.rebuildIntelliSenseCache(); @@ -221,14 +221,14 @@ export class ToggleQueryResultsKeyboardAction extends Action { constructor( id: string, label: string, - @IWorkbenchEditorService private _editorService: IWorkbenchEditorService + @IEditorService private _editorService: IEditorService ) { super(id, label); this.enabled = true; } public run(): TPromise { - let editor = this._editorService.getActiveEditor(); + let editor = this._editorService.activeControl; if (editor && editor instanceof QueryEditor) { let queryEditor: QueryEditor = editor; queryEditor.toggleResultsEditorVisibility(); @@ -244,7 +244,7 @@ export class RunQueryShortcutAction extends Action { public static ID = 'runQueryShortcutAction'; constructor( - @IWorkbenchEditorService private _editorService: IWorkbenchEditorService, + @IEditorService private _editorService: IEditorService, @IQueryModelService protected _queryModelService: IQueryModelService, @IQueryManagementService private _queryManagementService: IQueryManagementService, @IConnectionManagementService private _connectionManagementService: IConnectionManagementService, @@ -403,7 +403,7 @@ export class ParseSyntaxAction extends Action { label: string, @IConnectionManagementService private _connectionManagementService: IConnectionManagementService, @IQueryManagementService private _queryManagementService: IQueryManagementService, - @IWorkbenchEditorService private _editorService: IWorkbenchEditorService, + @IEditorService private _editorService: IEditorService, @INotificationService private _notificationService: INotificationService ) { super(id, label); @@ -411,7 +411,7 @@ export class ParseSyntaxAction extends Action { } public run(): TPromise { - let editor = this._editorService.getActiveEditor(); + let editor = this._editorService.activeControl; if (editor && editor instanceof QueryEditor) { let queryEditor: QueryEditor = editor; if (!queryEditor.isSelectionEmpty()) { diff --git a/src/sql/parts/query/execution/queryStatus.ts b/src/sql/parts/query/execution/queryStatus.ts index 30ae6f454f..33b759350a 100644 --- a/src/sql/parts/query/execution/queryStatus.ts +++ b/src/sql/parts/query/execution/queryStatus.ts @@ -7,11 +7,12 @@ import { $, append, show, hide } from 'vs/base/browser/dom'; import { IDisposable, combinedDisposable } from 'vs/base/common/lifecycle'; import { IStatusbarItem } from 'vs/workbench/browser/parts/statusbar/statusbar'; import { IEditorCloseEvent } from 'vs/workbench/common/editor'; -import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; -import { IEditorGroupService } from 'vs/workbench/services/group/common/groupService'; +import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; +import { IEditorGroupsService } from 'vs/workbench/services/group/common/editorGroupsService'; import { IQueryModelService } from 'sql/parts/query/execution/queryModel'; import LocalizedConstants = require('sql/parts/query/common/localizedConstants'); import * as WorkbenchUtils from 'sql/workbench/common/sqlWorkbenchUtils'; +import { EditorServiceImpl } from 'vs/workbench/browser/parts/editor/editor'; // Query execution status enum QueryExecutionStatus{ @@ -29,8 +30,8 @@ export class QueryStatusbarItem implements IStatusbarItem { constructor( @IQueryModelService private _queryModelService: IQueryModelService, - @IWorkbenchEditorService private _editorService: IWorkbenchEditorService, - @IEditorGroupService private _editorGroupService: IEditorGroupService, + @IEditorService private _editorService: EditorServiceImpl, + @IEditorGroupsService private _editorGroupService: IEditorGroupsService, ) { this._queryStatusEditors = {}; } @@ -44,8 +45,8 @@ export class QueryStatusbarItem implements IStatusbarItem { this._toDispose.push( this._queryModelService.onRunQueryStart((uri:string) => this._onRunQueryStart(uri)), this._queryModelService.onRunQueryComplete((uri:string) => this._onRunQueryComplete(uri)), - this._editorGroupService.onEditorsChanged(() => this._onEditorsChanged()), - this._editorGroupService.getStacksModel().onEditorClosed(event => this._onEditorClosed(event)) + this._editorService.onDidVisibleEditorsChange(() => this._onEditorsChanged()), + this._editorService.onDidCloseEditor(event => this._onEditorClosed(event)) ); return combinedDisposable(this._toDispose); @@ -55,7 +56,7 @@ export class QueryStatusbarItem implements IStatusbarItem { let uri = WorkbenchUtils.getEditorUri(event.editor); if (uri && uri in this._queryStatusEditors) { // If active editor is being closed, hide the query status. - let activeEditor = this._editorService.getActiveEditor(); + let activeEditor = this._editorService.activeControl; if (activeEditor) { let currentUri = WorkbenchUtils.getEditorUri(activeEditor.input); if (uri === currentUri) { @@ -67,7 +68,7 @@ export class QueryStatusbarItem implements IStatusbarItem { } private _onEditorsChanged(): void{ - let activeEditor = this._editorService.getActiveEditor(); + let activeEditor = this._editorService.activeControl; if (activeEditor) { let uri = WorkbenchUtils.getEditorUri(activeEditor.input); @@ -100,7 +101,7 @@ export class QueryStatusbarItem implements IStatusbarItem { // Show/hide query status for active editor private _showStatus(uri: string): void{ - let activeEditor = this._editorService.getActiveEditor(); + let activeEditor = this._editorService.activeControl; if (activeEditor) { let currentUri = WorkbenchUtils.getEditorUri(activeEditor.input); if (uri === currentUri) { diff --git a/src/sql/parts/query/services/queryEditorService.ts b/src/sql/parts/query/services/queryEditorService.ts index 9d5d1335ef..557e46d981 100644 --- a/src/sql/parts/query/services/queryEditorService.ts +++ b/src/sql/parts/query/services/queryEditorService.ts @@ -7,7 +7,7 @@ import { QueryResultsInput } from 'sql/parts/query/common/queryResultsInput'; import { QueryInput } from 'sql/parts/query/common/queryInput'; import { EditDataInput } from 'sql/parts/editData/common/editDataInput'; import { IConnectableInput, IConnectionManagementService } from 'sql/parts/connection/common/connectionManagement'; -import { IEditorGroupService } from 'vs/workbench/services/group/common/groupService'; +import { IEditorGroupsService, IEditorGroup } from 'vs/workbench/services/group/common/editorGroupsService'; import { IQueryEditorService, IQueryEditorOptions } from 'sql/parts/query/common/queryEditorService'; import { QueryPlanInput } from 'sql/parts/queryPlan/queryPlanInput'; import { sqlModeId, untitledFilePrefix, getSupportedInputResource } from 'sql/parts/common/customInputConverter'; @@ -15,11 +15,8 @@ import * as TaskUtilities from 'sql/workbench/common/taskUtilities'; import { IMode } from 'vs/editor/common/modes'; import { ITextModel } from 'vs/editor/common/model'; -import { IEditor, IEditorInput, Position } from 'vs/platform/editor/common/editor'; -import { CodeEditor } from 'vs/editor/browser/codeEditor'; -import { IEditorGroup } from 'vs/workbench/common/editor'; import { IUntitledEditorService } from 'vs/workbench/services/untitled/common/untitledEditorService'; -import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; +import { IEditorService, ACTIVE_GROUP } from 'vs/workbench/services/editor/common/editorService'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { FileEditorInput } from 'vs/workbench/parts/files/common/editors/fileEditorInput'; import Severity from 'vs/base/common/severity'; @@ -30,6 +27,8 @@ import { isLinux } from 'vs/base/common/platform'; import { Schemas } from 'vs/base/common/network'; import { INotificationService } from 'vs/platform/notification/common/notification'; import { EditDataResultsInput } from 'sql/parts/editData/common/editDataResultsInput'; +import { IEditorInput, IEditor } from 'vs/workbench/common/editor'; +import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; const fs = require('fs'); @@ -51,16 +50,16 @@ export class QueryEditorService implements IQueryEditorService { ); // service references for static functions - private static editorService: IWorkbenchEditorService; + private static editorService: IEditorService; private static instantiationService: IInstantiationService; - private static editorGroupService: IEditorGroupService; + private static editorGroupService: IEditorGroupsService; private static notificationService: INotificationService; constructor( @IUntitledEditorService private _untitledEditorService: IUntitledEditorService, @IInstantiationService private _instantiationService: IInstantiationService, - @IWorkbenchEditorService private _editorService: IWorkbenchEditorService, - @IEditorGroupService private _editorGroupService: IEditorGroupService, + @IEditorService private _editorService: IEditorService, + @IEditorGroupsService private _editorGroupService: IEditorGroupsService, @INotificationService private _notificationService: INotificationService, @IConnectionManagementService private _connectionManagementService: IConnectionManagementService ) { @@ -90,8 +89,6 @@ export class QueryEditorService implements IQueryEditorService { } }); - //input.resolve().then(model => this.backupFileService.backupResource(resource, model.getValue(), model.getVersionId())).done(null, errors.onUnexpectedError); - const queryResultsInput: QueryResultsInput = this._instantiationService.createInstance(QueryResultsInput, docUri.toString()); let queryInput: QueryInput = this._instantiationService.createInstance(QueryInput, '', fileInput, queryResultsInput, connectionProviderName); @@ -113,7 +110,7 @@ export class QueryEditorService implements IQueryEditorService { const self = this; return new Promise((resolve, reject) => { let queryPlanInput: QueryPlanInput = self._instantiationService.createInstance(QueryPlanInput, xmlShowPlan, 'aaa', undefined); - self._editorService.openEditor(queryPlanInput, { pinned: true }, false); + self._editorService.openEditor(queryPlanInput, { pinned: true }, ACTIVE_GROUP); resolve(true); }); } @@ -163,26 +160,25 @@ export class QueryEditorService implements IQueryEditorService { onSaveAsCompleted(oldResource: URI, newResource: URI): void { let oldResourceString: string = oldResource.toString(); - const stacks = this._editorGroupService.getStacksModel(); - stacks.groups.forEach(group => { - group.getEditors().forEach(input => { - if (input instanceof QueryInput) { - const resource = input.getResource(); - // Update Editor if file (or any parent of the input) got renamed or moved - // Note: must check the new file name for this since this method is called after the rename is completed - if (paths.isEqualOrParent(resource.fsPath, newResource.fsPath, !isLinux /* ignorecase */)) { - // In this case, we know that this is a straight rename so support this as a rename / replace operation - TaskUtilities.replaceConnection(oldResourceString, newResource.toString(), this._connectionManagementService).then(result => { - if (result && result.connected) { - input.onConnectSuccess(); - } else { - input.onConnectReject(); - } - }); - } + + this._editorService.editors.forEach(input => { + if (input instanceof QueryInput) { + const resource = input.getResource(); + + // Update Editor if file (or any parent of the input) got renamed or moved + // Note: must check the new file name for this since this method is called after the rename is completed + if (paths.isEqualOrParent(resource.fsPath, newResource.fsPath, !isLinux /* ignorecase */)) { + // In this case, we know that this is a straight rename so support this as a rename / replace operation + TaskUtilities.replaceConnection(oldResourceString, newResource.toString(), this._connectionManagementService).then(result => { + if (result && result.connected) { + input.onConnectSuccess(); + } else { + input.onConnectReject(); + } + }); } - }); + } }); } @@ -240,12 +236,10 @@ export class QueryEditorService implements IQueryEditorService { return Promise.resolve(undefined); } - let group: IEditorGroup = QueryEditorService.editorGroupService.getStacksModel().groupAt(editor.position); - let index: number = group.indexOf(editor.input); - let position: Position = editor.position; + let group: IEditorGroup = editor.group; + let index: number = group.editors.indexOf(editor.input); let options: IQueryEditorOptions = editor.options ? editor.options : {}; options = Object.assign(options, { index: index }); - options.pinned = group.isPinned(index); // Return a promise that will resovle when the old editor has been replaced by a new editor return new Promise((resolve, reject) => { @@ -256,16 +250,14 @@ export class QueryEditorService implements IQueryEditorService { options.denyQueryEditor = true; } - // Close the current editor - QueryEditorService.editorService.closeEditor(position, editor.input).then(() => { - + group.closeEditor(editor.input).then(() => { // Reopen a new editor in the same position/index - QueryEditorService.editorService.openEditor(newEditorInput, options, position).then((editor) => { - resolve(QueryEditorService._onEditorOpened(editor, uri.toString(), position, options.pinned)); + QueryEditorService.editorService.openEditor(newEditorInput, options, group).then((editor) => { + resolve(QueryEditorService._onEditorOpened(editor, uri.toString(), undefined, options.pinned)); }, - (error) => { - reject(error); - }); + (error) => { + reject(error); + }); }); }); } @@ -365,10 +357,10 @@ export class QueryEditorService implements IQueryEditorService { // causes the text on the tab to slightly flicker for unpinned files (from non-italic to italic to non-italic). // This is currently unavoidable because vscode ignores "pinned" on IEditorOptions if "index" is not undefined, // and we need to specify "index"" so the editor tab remains in the same place - let group: IEditorGroup = QueryEditorService.editorGroupService.getStacksModel().groupAt(position); - if (isPinned) { - QueryEditorService.editorGroupService.pinEditor(group, editor.input); - } + // let group: IEditorGroup = QueryEditorService.editorGroupService.getStacksModel().groupAt(position); + // if (isPinned) { + // QueryEditorService.editorGroupService.pinEditor(group, editor.input); + // } // @SQLTODO do we need the below // else { @@ -377,7 +369,7 @@ export class QueryEditorService implements IQueryEditorService { // Grab and returns the IModel that will be used to resolve the sqlLanguageModeCheck promise. let control = editor.getControl(); - let codeEditor: CodeEditor = control; + let codeEditor: ICodeEditor = control; let newModel = codeEditor ? codeEditor.getModel() : undefined; return newModel; } diff --git a/src/sql/parts/query/views/flexibleSash.ts b/src/sql/parts/query/views/flexibleSash.ts index 8db12640d1..68d33f8521 100644 --- a/src/sql/parts/query/views/flexibleSash.ts +++ b/src/sql/parts/query/views/flexibleSash.ts @@ -9,7 +9,7 @@ import { Dimension } from 'vs/base/browser/dom'; import { Disposable } from 'vs/base/common/lifecycle'; import { Event, Emitter } from 'vs/base/common/event'; import { IHorizontalSashLayoutProvider, IVerticalSashLayoutProvider, - ISashEvent, Orientation, VSash, Sash } from 'vs/base/browser/ui/sash/sash'; + ISashEvent, Orientation, Sash } from 'vs/base/browser/ui/sash/sash'; // There is no need to import the sash CSS - 'vs/base/browser/ui/sash/sash' already includes it /** diff --git a/src/sql/parts/queryPlan/queryPlanEditor.ts b/src/sql/parts/queryPlan/queryPlanEditor.ts index 1dc9d04aa4..9b5d2b9faa 100644 --- a/src/sql/parts/queryPlan/queryPlanEditor.ts +++ b/src/sql/parts/queryPlan/queryPlanEditor.ts @@ -20,6 +20,7 @@ import { IQueryEditorService } from 'sql/parts/query/common/queryEditorService'; import { bootstrapAngular } from 'sql/services/bootstrap/bootstrapService'; import { IQueryPlanParams } from 'sql/services/bootstrap/bootstrapParams'; import { QUERYPLAN_SELECTOR } from 'sql/parts/queryPlan/queryPlan.component'; +import { CancellationToken } from 'vs/base/common/cancellation'; declare let QP; @@ -69,7 +70,7 @@ export class QueryPlanEditor extends BaseEditor { public layout(dimension: DOM.Dimension): void { } - public setInput(input: QueryPlanInput, options: EditorOptions): TPromise { + public setInput(input: QueryPlanInput, options: EditorOptions): Thenable { if (this.input instanceof QueryPlanInput && this.input.matches(input)) { return TPromise.as(undefined); } @@ -79,7 +80,7 @@ export class QueryPlanEditor extends BaseEditor { } this.revealElementWithTagName(input.uniqueSelector, this.getContainer()); - return super.setInput(input, options); + return super.setInput(input, options, CancellationToken.None); } /** diff --git a/src/sql/parts/queryPlan/topOperations.component.ts b/src/sql/parts/queryPlan/topOperations.component.ts index 47388479af..e08dc08853 100644 --- a/src/sql/parts/queryPlan/topOperations.component.ts +++ b/src/sql/parts/queryPlan/topOperations.component.ts @@ -31,7 +31,6 @@ export class TopOperationsComponent extends TabChild implements OnDestroy, OnIni private _operations: Array = []; private _table: Table; private _dataService: DataService; - private toDispose: Array = []; private _columns: Array> = [ { name: localize('topOperations.operation', 'Operation'), field: 'operation' }, { name: localize('topOperations.object', 'Object'), field: 'object' }, diff --git a/src/sql/parts/taskHistory/common/taskHistory.contribution.ts b/src/sql/parts/taskHistory/common/taskHistory.contribution.ts index 029692ca7d..7b8991044c 100644 --- a/src/sql/parts/taskHistory/common/taskHistory.contribution.ts +++ b/src/sql/parts/taskHistory/common/taskHistory.contribution.ts @@ -10,7 +10,7 @@ import { localize } from 'vs/nls'; import { SyncActionDescriptor } from 'vs/platform/actions/common/actions'; import { ViewletRegistry, Extensions as ViewletExtensions, ViewletDescriptor, ToggleViewletAction } from 'vs/workbench/browser/viewlet'; import { IWorkbenchActionRegistry, Extensions as ActionExtensions } from 'vs/workbench/common/actions'; -import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; +import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { IViewlet } from 'vs/workbench/common/viewlet'; import { IViewletService } from 'vs/workbench/services/viewlet/browser/viewlet'; import { Registry } from 'vs/platform/registry/common/platform'; @@ -21,6 +21,7 @@ import ext = require('vs/workbench/common/contributions'); import { ITaskService } from 'sql/parts/taskHistory/common/taskService'; import { IActivityService, NumberBadge } from 'vs/workbench/services/activity/common/activity'; import { LifecyclePhase } from 'vs/platform/lifecycle/common/lifecycle'; +import { IEditorGroupsService } from 'vs/workbench/services/group/common/editorGroupsService'; export class StatusUpdater implements ext.IWorkbenchContribution { static ID = 'data.taskhistory.statusUpdater'; @@ -80,9 +81,9 @@ export class TaskHistoryViewletAction extends ToggleViewletAction { id: string, label: string, @IViewletService viewletService: IViewletService, - @IWorkbenchEditorService editorService: IWorkbenchEditorService + @IEditorGroupsService editorGroupService: IEditorGroupsService ) { - super(id, label, VIEWLET_ID, viewletService, editorService); + super(id, label, VIEWLET_ID, viewletService, editorGroupService); } } diff --git a/src/sql/parts/taskHistory/viewlet/taskHistoryController.ts b/src/sql/parts/taskHistory/viewlet/taskHistoryController.ts index dce22e4845..d4666e92ec 100644 --- a/src/sql/parts/taskHistory/viewlet/taskHistoryController.ts +++ b/src/sql/parts/taskHistory/viewlet/taskHistoryController.ts @@ -6,7 +6,7 @@ 'use strict'; import { ITree, ContextMenuEvent } from 'vs/base/parts/tree/browser/tree'; import treedefaults = require('vs/base/parts/tree/browser/treeDefaults'); -import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; +import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IContextMenuService } from 'vs/platform/contextview/browser/contextView'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; @@ -20,7 +20,7 @@ import { TaskHistoryActionProvider } from 'sql/parts/taskHistory/viewlet/taskHis export class TaskHistoryController extends treedefaults.DefaultController { constructor(private actionProvider: TaskHistoryActionProvider, - @IWorkbenchEditorService private editorService: IWorkbenchEditorService, + @IEditorService private editorService: IEditorService, @IContextMenuService private contextMenuService: IContextMenuService, @ITelemetryService private telemetryService: ITelemetryService, @IKeybindingService private keybindingService: IKeybindingService diff --git a/src/sql/parts/tasks/dialog/taskDialogEditor.ts b/src/sql/parts/tasks/dialog/taskDialogEditor.ts index e51347dab1..2de99a8575 100644 --- a/src/sql/parts/tasks/dialog/taskDialogEditor.ts +++ b/src/sql/parts/tasks/dialog/taskDialogEditor.ts @@ -18,6 +18,7 @@ import { ITaskDialogComponentParams } from 'sql/services/bootstrap/bootstrapPara import { TaskDialogModule } from 'sql/parts/tasks/dialog/taskDialog.module'; import { TASKDIALOG_SELECTOR } from 'sql/parts/tasks/dialog/taskDialog.component'; import { bootstrapAngular } from 'sql/services/bootstrap/bootstrapService'; +import { CancellationToken } from 'vs/base/common/cancellation'; export class TaskDialogEditor extends BaseEditor { @@ -50,7 +51,7 @@ export class TaskDialogEditor extends BaseEditor { public layout(dimension: Dimension): void { } - public setInput(input: TaskDialogInput, options: EditorOptions): TPromise { + public setInput(input: TaskDialogInput, options: EditorOptions): Thenable { if (this.input instanceof TaskDialogInput && this.input.matches(input)) { return TPromise.as(undefined); } @@ -60,7 +61,7 @@ export class TaskDialogEditor extends BaseEditor { } this.revealElementWithTagName(input.uniqueSelector, this.getContainer()); - return super.setInput(input, options); + return super.setInput(input, options, CancellationToken.None); } /** diff --git a/src/sql/platform/clipboard/electron-browser/clipboardService.ts b/src/sql/platform/clipboard/electron-browser/clipboardService.ts index 2860bf2f38..3db1ff00d4 100644 --- a/src/sql/platform/clipboard/electron-browser/clipboardService.ts +++ b/src/sql/platform/clipboard/electron-browser/clipboardService.ts @@ -50,23 +50,23 @@ export class ClipboardService implements IClipboardService { } /** - * Writes files to the system clipboard. + * Writes resources to the system clipboard. */ - writeFiles(files: URI[]): void { - this._vsClipboardService.writeFiles(files); - } - - /** - * Reads files from the system clipboard. - */ - readFiles(): URI[] { - return this._vsClipboardService.readFiles(); + writeResources(resources: URI[]): void { + this._vsClipboardService.writeResources(resources); } /** - * Find out if files are copied to the clipboard. + * Reads resources from the system clipboard. */ - hasFiles(): boolean { - return this._vsClipboardService.hasFiles(); + readResources(): URI[] { + return this._vsClipboardService.readResources(); + } + + /** + * Find out if resources are copied to the clipboard. + */ + hasResources(): boolean { + return this._vsClipboardService.hasResources(); } } diff --git a/src/sql/platform/tasks/common/tasks.ts b/src/sql/platform/tasks/common/tasks.ts index 958ea03ebb..020b785175 100644 --- a/src/sql/platform/tasks/common/tasks.ts +++ b/src/sql/platform/tasks/common/tasks.ts @@ -6,20 +6,15 @@ import { IConnectionProfile } from 'sql/parts/connection/common/interfaces'; import * as types from 'vs/base/common/types'; import { TPromise } from 'vs/base/common/winjs.base'; -import * as platform from 'vs/platform/registry/common/platform'; -import { IJSONSchema, IJSONSchemaMap } from 'vs/base/common/jsonSchema'; -import { Action } from 'vs/base/common/actions'; -import { IConstructorSignature3, ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; -import * as nls from 'vs/nls'; -import { ILocalizedString, IMenuItem, MenuRegistry, ICommandAction } from 'vs/platform/actions/common/actions'; +import { ILocalizedString, MenuRegistry, ICommandAction } from 'vs/platform/actions/common/actions'; import { Event, Emitter } from 'vs/base/common/event'; import { IDisposable } from 'vs/base/common/lifecycle'; import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; -import { LinkedList } from 'vs/base/common/linkedList'; import { IdGenerator } from 'vs/base/common/idGenerator'; import { createCSSRule } from 'vs/base/browser/dom'; import URI from 'vs/base/common/uri'; import { CommandsRegistry } from 'vs/platform/commands/common/commands'; +import { ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; export interface ITaskOptions { id: string; @@ -33,14 +28,17 @@ export abstract class Task { public readonly id: string; public readonly title: string; public readonly iconPathDark: string; - public readonly iconPath: { dark: string; light: string; }; + public readonly iconPath: { dark: URI; light?: URI; }; private readonly _iconClass: string; private readonly _description: ITaskHandlerDescription; - constructor(opts: ITaskOptions) { + constructor(private opts: ITaskOptions) { this.id = opts.id; this.title = opts.title; - this.iconPath = opts.iconPath; + this.iconPath = { + dark: URI.parse(opts.iconPath.dark), + light: URI.parse(opts.iconPath.light), + }; this._iconClass = opts.iconClass; this._description = opts.description; } @@ -51,14 +49,14 @@ export abstract class Task { handler: (accessor, profile, args) => this.runTask(accessor, profile, args), description: this._description, iconClass: this._iconClass, - iconPath: this.iconPath, + iconPath: this.opts.iconPath, title: this.title }; } private toCommandAction(): ICommandAction { return { - iconPath: this.iconPath, + iconLocation: this.iconPath, id: this.id, title: this.title }; @@ -137,7 +135,10 @@ export const TaskRegistry: ITaskRegistry = new class implements ITaskRegistry { } if (idOrTask.iconPath && idOrTask.title) { this.taskIdToCommandActionMap.set(idOrTask.id, { - iconPath: idOrTask.iconPath, + iconLocation: { + dark: URI.parse(idOrTask.iconPath.dark), + light: URI.parse(idOrTask.iconPath.light), + }, id: idOrTask.id, title: idOrTask.title }); @@ -164,10 +165,10 @@ export const TaskRegistry: ITaskRegistry = new class implements ITaskRegistry { let iconClass = null; if (this.taskIdToIconClassNameMap.has(item.id)) { iconClass = this.taskIdToIconClassNameMap.get(item.id); - } else if (item.iconPath) { + } else if (item.iconLocation) { iconClass = ids.nextId(); - createCSSRule(`.icon.${iconClass}`, `background-image: url("${URI.file(item.iconPath.light || item.iconPath.dark).toString()}")`); - createCSSRule(`.vs-dark .icon.${iconClass}, .hc-black .icon.${iconClass}`, `background-image: url("${URI.file(item.iconPath.dark).toString()}")`); + createCSSRule(`.icon.${iconClass}`, `background-image: url("${(item.iconLocation.light || item.iconLocation.dark).toString()}")`); + createCSSRule(`.vs-dark .icon.${iconClass}, .hc-black .icon.${iconClass}`, `background-image: url("${(item.iconLocation.dark).toString()}")`); this.taskIdToIconClassNameMap.set(item.id, iconClass); } return iconClass; diff --git a/src/sql/services/bootstrap/bootstrapService.ts b/src/sql/services/bootstrap/bootstrapService.ts index f46b4d313a..54424df8a9 100644 --- a/src/sql/services/bootstrap/bootstrapService.ts +++ b/src/sql/services/bootstrap/bootstrapService.ts @@ -3,11 +3,10 @@ * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { NgModuleRef, enableProdMode, InjectionToken, Type, PlatformRef, Provider, Injector, Optional, Inject, ComponentFactoryResolver } from '@angular/core'; +import { NgModuleRef, enableProdMode, InjectionToken, Type, PlatformRef, Provider } from '@angular/core'; import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; - -import { IEditorInput } from 'vs/platform/editor/common/editor'; import { IInstantiationService, _util } from 'vs/platform/instantiation/common/instantiation'; +import { IEditorInput } from 'vs/workbench/common/editor'; const selectorCounter = new Map(); diff --git a/src/sql/sqlops.proposed.d.ts b/src/sql/sqlops.proposed.d.ts index 7118bdb177..7a1aaee02b 100644 --- a/src/sql/sqlops.proposed.d.ts +++ b/src/sql/sqlops.proposed.d.ts @@ -51,7 +51,7 @@ declare module 'sqlops' { export interface TreeComponentView extends vscode.Disposable { onNodeCheckedChanged: vscode.Event>; - onDidChangeSelection: vscode.Event; + onDidChangeSelection: vscode.Event>; } export class TreeComponentItem extends vscode.TreeItem { diff --git a/src/sql/workbench/api/electron-browser/mainThreadModalDialog.ts b/src/sql/workbench/api/electron-browser/mainThreadModalDialog.ts index 2856bb59bb..fbeb8ccf35 100644 --- a/src/sql/workbench/api/electron-browser/mainThreadModalDialog.ts +++ b/src/sql/workbench/api/electron-browser/mainThreadModalDialog.ts @@ -8,7 +8,7 @@ import { WebViewDialog } from 'sql/base/browser/ui/modal/webViewDialog'; import { MainThreadModalDialogShape, SqlMainContext, SqlExtHostContext, ExtHostModalDialogsShape } from 'sql/workbench/api/node/sqlExtHost.protocol'; import { IExtHostContext } from 'vs/workbench/api/node/extHost.protocol'; import { extHostNamedCustomer } from 'vs/workbench/api/electron-browser/extHostCustomers'; -import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; +import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import 'vs/css!sql/media/icons/common-icons'; @@ -19,7 +19,7 @@ export class MainThreadModalDialog implements MainThreadModalDialogShape { constructor( context: IExtHostContext, - @IWorkbenchEditorService private readonly _editorService: IWorkbenchEditorService, + @IEditorService private readonly _editorService: IEditorService, @IInstantiationService private readonly _instantiationService: IInstantiationService ) { this._proxy = context.getProxy(SqlExtHostContext.ExtHostModalDialogs); diff --git a/src/sql/workbench/api/node/extHostModelViewTree.ts b/src/sql/workbench/api/node/extHostModelViewTree.ts index e62db04b5a..ba94fa56e9 100644 --- a/src/sql/workbench/api/node/extHostModelViewTree.ts +++ b/src/sql/workbench/api/node/extHostModelViewTree.ts @@ -66,6 +66,15 @@ export class ExtHostModelViewTreeViews implements ExtHostModelViewTreeViewsShape } } + $setExpanded(treeViewId: string, treeItemHandle: string, expanded: boolean): void { + } + + $setSelection(treeViewId: string, treeItemHandles: string[]): void { + } + + $setVisible(treeViewId: string, visible: boolean): void { + } + private createExtHostTreeViewer(handle: number, id: string, dataProvider: sqlops.TreeComponentDataProvider): ExtHostTreeView { const treeView = new ExtHostTreeView(handle, id, dataProvider, this._proxy, undefined); this.treeViews.set(`${handle}-${id}`, treeView); @@ -76,11 +85,13 @@ export class ExtHostModelViewTreeViews implements ExtHostModelViewTreeViewsShape export class ExtHostTreeView extends vsTreeExt.ExtHostTreeView { private _onNodeCheckedChanged = new Emitter>(); - private _onDidChangeSelection = new Emitter(); + private _onChangeSelection = new Emitter>(); public readonly NodeCheckedChanged: vscode.Event> = this._onNodeCheckedChanged.event; - public readonly ChangeSelection: vscode.Event = this._onDidChangeSelection.event; - constructor(private handle: number, private componentId: string, private componentDataProvider: sqlops.TreeComponentDataProvider, private modelViewProxy: MainThreadModelViewShape, commands: CommandsConverter) { - super(componentId, componentDataProvider, undefined, commands); + public readonly ChangeSelection: vscode.Event> = this._onChangeSelection.event; + constructor( + private handle: number, private componentId: string, private componentDataProvider: sqlops.TreeComponentDataProvider, + private modelViewProxy: MainThreadModelViewShape, commands: CommandsConverter) { + super(componentId, componentDataProvider, undefined, commands, undefined); } onNodeCheckedChanged(parentHandle?: vsTreeExt.TreeItemHandle, checked?: boolean): void { @@ -97,7 +108,7 @@ export class ExtHostTreeView extends vsTreeExt.ExtHostTreeView { let nodes = parentHandles.map(parentHandle => { return parentHandle ? this.getExtensionElement(parentHandle) : void 0; }); - this._onDidChangeSelection.fire(nodes); + this._onChangeSelection.fire({ selection: nodes}); } } @@ -111,7 +122,7 @@ export class ExtHostTreeView extends vsTreeExt.ExtHostTreeView { .then(treeNode => i)); } - protected refresh(elements: T[]): void { + protected refreshElements(elements: T[]): void { const hasRoot = elements.some(element => !element); if (hasRoot) { this.clearAll(); // clear cache diff --git a/src/sql/workbench/api/node/mainThreadConnectionManagement.ts b/src/sql/workbench/api/node/mainThreadConnectionManagement.ts index 1b5cc67dac..9f20ae36c5 100644 --- a/src/sql/workbench/api/node/mainThreadConnectionManagement.ts +++ b/src/sql/workbench/api/node/mainThreadConnectionManagement.ts @@ -10,7 +10,7 @@ import { IExtHostContext } from 'vs/workbench/api/node/extHost.protocol'; import { extHostNamedCustomer } from 'vs/workbench/api/electron-browser/extHostCustomers'; import { IConnectionManagementService, IConnectionDialogService } from 'sql/parts/connection/common/connectionManagement'; import { IObjectExplorerService } from 'sql/parts/objectExplorer/common/objectExplorerService'; -import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; +import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import * as TaskUtilities from 'sql/workbench/common/taskUtilities'; import { IConnectionProfile } from 'sql/parts/connection/common/interfaces'; import { dispose, IDisposable } from 'vs/base/common/lifecycle'; @@ -25,7 +25,7 @@ export class MainThreadConnectionManagement implements MainThreadConnectionManag extHostContext: IExtHostContext, @IConnectionManagementService private _connectionManagementService: IConnectionManagementService, @IObjectExplorerService private _objectExplorerService: IObjectExplorerService, - @IWorkbenchEditorService private _workbenchEditorService: IWorkbenchEditorService, + @IEditorService private _workbenchEditorService: IEditorService, @IConnectionDialogService private _connectionDialogService: IConnectionDialogService, ) { if (extHostContext) { diff --git a/src/sql/workbench/api/node/mainThreadModelViewDialog.ts b/src/sql/workbench/api/node/mainThreadModelViewDialog.ts index e7bf51fb6e..b0b69042f4 100644 --- a/src/sql/workbench/api/node/mainThreadModelViewDialog.ts +++ b/src/sql/workbench/api/node/mainThreadModelViewDialog.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ 'use strict'; -import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; +import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { IEditorOptions } from 'vs/platform/editor/common/editor'; import { extHostNamedCustomer } from 'vs/workbench/api/electron-browser/extHostCustomers'; import { IExtHostContext } from 'vs/workbench/api/node/extHost.protocol'; @@ -33,7 +33,7 @@ export class MainThreadModelViewDialog implements MainThreadModelViewDialogShape constructor( context: IExtHostContext, @IInstantiationService private _instatiationService: IInstantiationService, - @IWorkbenchEditorService private _editorService: IWorkbenchEditorService + @IEditorService private _editorService: IEditorService ) { this._proxy = context.getProxy(SqlExtHostContext.ExtHostModelViewDialog); this._dialogService = new CustomDialogService(_instatiationService); diff --git a/src/sql/workbench/api/node/mainThreadObjectExplorer.ts b/src/sql/workbench/api/node/mainThreadObjectExplorer.ts index 66eb907350..49e76bdde2 100644 --- a/src/sql/workbench/api/node/mainThreadObjectExplorer.ts +++ b/src/sql/workbench/api/node/mainThreadObjectExplorer.ts @@ -11,7 +11,7 @@ import { IExtHostContext } from 'vs/workbench/api/node/extHost.protocol'; import { extHostNamedCustomer } from 'vs/workbench/api/electron-browser/extHostCustomers'; import { IConnectionManagementService } from 'sql/parts/connection/common/connectionManagement'; import { IObjectExplorerService, NodeInfoWithConnection } from 'sql/parts/objectExplorer/common/objectExplorerService'; -import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; +import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import * as TaskUtilities from 'sql/workbench/common/taskUtilities'; import { IConnectionProfile } from 'sql/parts/connection/common/interfaces'; import { dispose, IDisposable } from 'vs/base/common/lifecycle'; @@ -26,7 +26,7 @@ export class MainThreadObjectExplorer implements MainThreadObjectExplorerShape { extHostContext: IExtHostContext, @IConnectionManagementService private _connectionManagementService: IConnectionManagementService, @IObjectExplorerService private _objectExplorerService: IObjectExplorerService, - @IWorkbenchEditorService private _workbenchEditorService: IWorkbenchEditorService + @IEditorService private _workbenchEditorService: IEditorService ) { if (extHostContext) { this._proxy = extHostContext.getProxy(SqlExtHostContext.ExtHostObjectExplorer); diff --git a/src/sql/workbench/api/node/mainThreadQueryEditor.ts b/src/sql/workbench/api/node/mainThreadQueryEditor.ts index 9a95fe7b02..ff467dcffb 100644 --- a/src/sql/workbench/api/node/mainThreadQueryEditor.ts +++ b/src/sql/workbench/api/node/mainThreadQueryEditor.ts @@ -5,14 +5,12 @@ 'use strict'; import { SqlExtHostContext, SqlMainContext, ExtHostQueryEditorShape, MainThreadQueryEditorShape } from 'sql/workbench/api/node/sqlExtHost.protocol'; -import * as sqlops from 'sqlops'; -import * as vscode from 'vscode'; import { IExtHostContext } from 'vs/workbench/api/node/extHost.protocol'; import { extHostNamedCustomer } from 'vs/workbench/api/electron-browser/extHostCustomers'; import { IConnectionManagementService, IConnectionCompletionOptions, ConnectionType, RunQueryOnConnectionMode } from 'sql/parts/connection/common/connectionManagement'; import { IQueryEditorService } from 'sql/parts/query/common/queryEditorService'; import { QueryEditor } from 'sql/parts/query/editor/queryEditor'; -import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; +import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { dispose, IDisposable } from 'vs/base/common/lifecycle'; @extHostNamedCustomer(SqlMainContext.MainThreadQueryEditor) @@ -25,7 +23,7 @@ export class MainThreadQueryEditor implements MainThreadQueryEditorShape { extHostContext: IExtHostContext, @IConnectionManagementService private _connectionManagementService: IConnectionManagementService, @IQueryEditorService private _queryEditorService: IQueryEditorService, - @IWorkbenchEditorService private _editorService: IWorkbenchEditorService + @IEditorService private _editorService: IEditorService ) { if (extHostContext) { this._proxy = extHostContext.getProxy(SqlExtHostContext.ExtHostQueryEditor); @@ -39,7 +37,10 @@ export class MainThreadQueryEditor implements MainThreadQueryEditorShape { public $connect(fileUri: string, connectionId: string): Thenable { return new Promise((resolve, reject) => { - let editor = this._editorService.getVisibleEditors().find(editor => editor.input.getResource().toString() === fileUri); + let editors = this._editorService.visibleControls.filter(resource => { + return !!resource && resource.input.getResource().toString() === fileUri; + }); + let editor = editors && editors.length > 0 ? editors[0] : undefined; let options: IConnectionCompletionOptions = { params: { connectionType: ConnectionType.editor, runQueryOnCompletion: RunQueryOnConnectionMode.none, input: editor ? editor.input as any : undefined }, saveTheConnection: false, @@ -65,7 +66,7 @@ export class MainThreadQueryEditor implements MainThreadQueryEditorShape { } public $runQuery(fileUri: string): void { - let filteredEditors = this._editorService.getVisibleEditors().filter(editor => editor.input.getResource().toString() === fileUri); + let filteredEditors = this._editorService.visibleControls.filter(editor => editor.input.getResource().toString() === fileUri); if (filteredEditors && filteredEditors.length > 0) { let editor = filteredEditors[0]; if (editor instanceof QueryEditor) { diff --git a/src/sql/workbench/api/node/sqlExtHost.api.impl.ts b/src/sql/workbench/api/node/sqlExtHost.api.impl.ts index d706216467..f3c1fddbb7 100644 --- a/src/sql/workbench/api/node/sqlExtHost.api.impl.ts +++ b/src/sql/workbench/api/node/sqlExtHost.api.impl.ts @@ -451,7 +451,7 @@ function createExtensionPathIndex(extensionService: ExtHostExtensionService): TP return undefined; } return new TPromise((resolve, reject) => { - realpath(ext.extensionFolderPath, (err, path) => { + realpath(ext.extensionLocation.fsPath, (err, path) => { if (err) { reject(err); } else { @@ -533,8 +533,9 @@ const nullExtensionDescription: IExtensionDescription = { enableProposedApi: false, engines: undefined, extensionDependencies: undefined, - extensionFolderPath: undefined, + extensionLocation: undefined, isBuiltin: false, main: undefined, - version: undefined + version: undefined, + isUnderDevelopment: true }; diff --git a/src/sql/workbench/api/node/sqlExtHost.protocol.ts b/src/sql/workbench/api/node/sqlExtHost.protocol.ts index 455eddbbaa..8327772446 100644 --- a/src/sql/workbench/api/node/sqlExtHost.protocol.ts +++ b/src/sql/workbench/api/node/sqlExtHost.protocol.ts @@ -618,6 +618,10 @@ export interface ExtHostModelViewTreeViewsShape { $createTreeView(handle: number, componentId: string, options: { treeDataProvider: vscode.TreeDataProvider }): sqlops.TreeComponentView; $onNodeCheckedChanged(treeViewId: string, treeItemHandle?: string, checked?: boolean): void; $onNodeSelected(treeViewId: string, nodes: string[]): void; + + $setExpanded(treeViewId: string, treeItemHandle: string, expanded: boolean): void; + $setSelection(treeViewId: string, treeItemHandles: string[]): void; + $setVisible(treeViewId: string, visible: boolean): void; } export interface ExtHostBackgroundTaskManagementShape { diff --git a/src/sql/workbench/common/actions.ts b/src/sql/workbench/common/actions.ts index 725e5bbb1d..2acd0c4851 100644 --- a/src/sql/workbench/common/actions.ts +++ b/src/sql/workbench/common/actions.ts @@ -25,7 +25,7 @@ import { TPromise } from 'vs/base/common/winjs.base'; import { Action } from 'vs/base/common/actions'; import { IWindowsService } from 'vs/platform/windows/common/windows'; import * as nls from 'vs/nls'; -import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; +import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; export interface BaseActionContext { @@ -63,7 +63,7 @@ export class NewQueryAction extends Task { accessor.get(IConnectionManagementService), accessor.get(IQueryEditorService), accessor.get(IObjectExplorerService), - accessor.get(IWorkbenchEditorService) + accessor.get(IEditorService) ).then( result => { resolve(void 0); diff --git a/src/sql/workbench/common/sqlWorkbenchUtils.ts b/src/sql/workbench/common/sqlWorkbenchUtils.ts index 2bef833ad6..cb92313715 100644 --- a/src/sql/workbench/common/sqlWorkbenchUtils.ts +++ b/src/sql/workbench/common/sqlWorkbenchUtils.ts @@ -8,8 +8,8 @@ import ConnectionConstants = require('sql/parts/connection/common/constants'); import { QueryInput } from 'sql/parts/query/common/queryInput'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; -import { IEditorInput } from 'vs/platform/editor/common/editor'; import URI from 'vs/base/common/uri'; +import { IEditorInput } from 'vs/workbench/common/editor'; /** * Gets the 'sql' configuration section for use in looking up settings. Note that configs under diff --git a/src/sql/workbench/common/taskUtilities.ts b/src/sql/workbench/common/taskUtilities.ts index b3516cb515..05f3469fde 100644 --- a/src/sql/workbench/common/taskUtilities.ts +++ b/src/sql/workbench/common/taskUtilities.ts @@ -25,7 +25,7 @@ import nls = require('vs/nls'); import os = require('os'); import path = require('path'); import { IObjectExplorerService } from 'sql/parts/objectExplorer/common/objectExplorerService'; -import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; +import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { QueryInput } from 'sql/parts/query/common/queryInput'; import { DashboardInput } from 'sql/parts/dashboard/dashboardInput'; @@ -265,7 +265,7 @@ export function newQuery( connectionService: IConnectionManagementService, queryEditorService: IQueryEditorService, objectExplorerService: IObjectExplorerService, - workbenchEditorService: IWorkbenchEditorService, + workbenchEditorService: IEditorService, sqlContent?: string, executeOnOpen: RunQueryOnConnectionMode = RunQueryOnConnectionMode.none ): Promise { @@ -377,7 +377,7 @@ export function openInsight(query: IInsightsConfig, profile: IConnectionProfile, * @param workbenchEditorService * @param topLevelOnly If true, only return top-level (i.e. connected) Object Explorer connections instead of database connections when appropriate */ -export function getCurrentGlobalConnection(objectExplorerService: IObjectExplorerService, connectionManagementService: IConnectionManagementService, workbenchEditorService: IWorkbenchEditorService, topLevelOnly: boolean = false): IConnectionProfile { +export function getCurrentGlobalConnection(objectExplorerService: IObjectExplorerService, connectionManagementService: IConnectionManagementService, workbenchEditorService: IEditorService, topLevelOnly: boolean = false): IConnectionProfile { let connection: IConnectionProfile; let objectExplorerSelection = objectExplorerService.getSelectedProfileAndDatabase(); @@ -395,7 +395,7 @@ export function getCurrentGlobalConnection(objectExplorerService: IObjectExplore } } - let activeInput = workbenchEditorService.getActiveEditorInput(); + let activeInput = workbenchEditorService.activeEditor; if (activeInput) { if (activeInput instanceof QueryInput || activeInput instanceof EditDataInput || activeInput instanceof DashboardInput) { connection = connectionManagementService.getConnectionProfile(activeInput.uri); diff --git a/src/sql/workbench/common/views.ts b/src/sql/workbench/common/views.ts index d3d8621946..9c0d4933eb 100644 --- a/src/sql/workbench/common/views.ts +++ b/src/sql/workbench/common/views.ts @@ -18,9 +18,5 @@ export interface IModelViewTreeViewDataProvider extends ITreeViewDataProvider { } export interface IModelViewTreeViewDataProvider { - onDidChange: Event; - - onDispose: Event; - getChildren(element?: ITreeComponentItem): TPromise; } \ No newline at end of file diff --git a/src/sql/workbench/update/releaseNotes.ts b/src/sql/workbench/update/releaseNotes.ts index 9b5bb46f4b..fcc8ca45a3 100644 --- a/src/sql/workbench/update/releaseNotes.ts +++ b/src/sql/workbench/update/releaseNotes.ts @@ -10,7 +10,7 @@ import { TPromise } from 'vs/base/common/winjs.base'; import { Action } from 'vs/base/common/actions'; import pkg from 'vs/platform/node/package'; import product from 'vs/platform/node/product'; -import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; +import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IWorkbenchContribution } from 'vs/workbench/common/contributions'; import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage'; diff --git a/src/sqltest/parts/connection/connectionManagementService.test.ts b/src/sqltest/parts/connection/connectionManagementService.test.ts index 7792d3b818..08797fab38 100644 --- a/src/sqltest/parts/connection/connectionManagementService.test.ts +++ b/src/sqltest/parts/connection/connectionManagementService.test.ts @@ -99,7 +99,6 @@ suite('SQL ConnectionManagementService tests', () => { connectionStore.setup(x => x.addActiveConnection(TypeMoq.It.isAny())).returns(() => Promise.resolve()); connectionStore.setup(x => x.saveProfile(TypeMoq.It.isAny())).returns(() => Promise.resolve(connectionProfile)); workbenchEditorService.setup(x => x.openEditor(undefined, TypeMoq.It.isAny(), TypeMoq.It.isAny())).returns(() => TPromise.as(undefined)); - editorGroupService.setup(x => x.getStacksModel()).returns(() => undefined); connectionStore.setup(x => x.addSavedPassword(TypeMoq.It.is( c => c.serverName === connectionProfile.serverName))).returns(() => Promise.resolve({ profile: connectionProfile, savedCred: true })); connectionStore.setup(x => x.addSavedPassword(TypeMoq.It.is( diff --git a/src/sqltest/parts/query/editor/queryEditor.test.ts b/src/sqltest/parts/query/editor/queryEditor.test.ts index 098f06262e..8cc7bb961d 100644 --- a/src/sqltest/parts/query/editor/queryEditor.test.ts +++ b/src/sqltest/parts/query/editor/queryEditor.test.ts @@ -57,7 +57,6 @@ suite('SQL QueryEditor Tests', () => { undefined, editorDescriptorService.object, undefined, - undefined, undefined); }; @@ -112,14 +111,14 @@ suite('SQL QueryEditor Tests', () => { // Create a QueryInput let filePath = 'someFile.sql'; let uri: URI = URI.parse(filePath); - let fileInput = new UntitledEditorInput(uri, false, '', '', '', instantiationService.object, undefined, undefined, undefined, undefined); + let fileInput = new UntitledEditorInput(uri, false, '', '', '', instantiationService.object, undefined, undefined, undefined); let queryResultsInput: QueryResultsInput = new QueryResultsInput(uri.fsPath); queryInput = new QueryInput('first', fileInput, queryResultsInput, undefined, undefined, undefined, undefined, undefined); // Create a QueryInput to compare to the previous one let filePath2 = 'someFile2.sql'; let uri2: URI = URI.parse(filePath2); - let fileInput2 = new UntitledEditorInput(uri2, false, '', '', '', instantiationService.object, undefined, undefined, undefined, undefined); + let fileInput2 = new UntitledEditorInput(uri2, false, '', '', '', instantiationService.object, undefined, undefined, undefined); let queryResultsInput2: QueryResultsInput = new QueryResultsInput(uri2.fsPath); queryInput2 = new QueryInput('second', fileInput2, queryResultsInput2, undefined, undefined, undefined, undefined, undefined); @@ -342,7 +341,7 @@ suite('SQL QueryEditor Tests', () => { return new RunQueryAction(undefined, undefined, undefined); }); - let fileInput = new UntitledEditorInput(URI.parse('testUri'), false, '', '', '', instantiationService.object, undefined, undefined, undefined, undefined); + let fileInput = new UntitledEditorInput(URI.parse('testUri'), false, '', '', '', instantiationService.object, undefined, undefined, undefined); queryModelService = TypeMoq.Mock.ofType(QueryModelService, TypeMoq.MockBehavior.Loose, undefined, undefined); queryModelService.callBase = true; queryInput = new QueryInput( diff --git a/src/sqltest/stubs/editorGroupService.ts b/src/sqltest/stubs/editorGroupService.ts index 1ac98cd6df..578c01e564 100644 --- a/src/sqltest/stubs/editorGroupService.ts +++ b/src/sqltest/stubs/editorGroupService.ts @@ -6,15 +6,34 @@ 'use strict'; import { ServiceIdentifier, ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; -import { Position, IEditorInput } from 'vs/platform/editor/common/editor'; -import { IEditorStacksModel, IEditorGroup, EditorInput, IEditorOpeningEvent } from 'vs/workbench/common/editor'; import { Event } from 'vs/base/common/event'; -import { IEditorTabOptions, GroupArrangement, GroupOrientation, IEditorGroupService, IMoveOptions } from 'vs/workbench/services/group/common/groupService'; -import { EditorGroup } from 'vs/workbench/common/editor/editorStacksModel'; +import { IEditorGroupsService, GroupOrientation, IEditorGroup, GroupDirection, GroupsArrangement, IMoveEditorOptions, GroupsOrder, EditorGroupLayout, IFindGroupScope, IAddGroupOptions, IMergeGroupOptions } from 'vs/workbench/services/group/common/editorGroupsService'; +import { IEditorOpeningEvent } from 'vs/workbench/browser/parts/editor/editor'; +import { IEditorInput, EditorInput, GroupIdentifier } from 'vs/workbench/common/editor'; +import { EditorGroup } from 'vs/workbench/common/editor/editorGroup'; -export class EditorGroupTestService implements IEditorGroupService { +export class EditorGroupTestService implements IEditorGroupsService { _serviceBrand: ServiceIdentifier; + findGroup(scope: IFindGroupScope, source?: IEditorGroup | GroupIdentifier, wrap?: boolean): IEditorGroup { + return undefined; + } + + addGroup(location: IEditorGroup | GroupIdentifier, direction: GroupDirection, options?: IAddGroupOptions): IEditorGroup { + return undefined; + } + + removeGroup(group: IEditorGroup | GroupIdentifier): void { + } + + mergeGroup(group: IEditorGroup | GroupIdentifier, target: IEditorGroup | GroupIdentifier, options?: IMergeGroupOptions): IEditorGroup { + return undefined; + } + + copyGroup(group: IEditorGroup | GroupIdentifier, location: IEditorGroup | GroupIdentifier, direction: GroupDirection): IEditorGroup { + return undefined; + } + /** * Emitted when editors or inputs change. Examples: opening, closing of editors. Active editor change. */ @@ -24,6 +43,64 @@ export class EditorGroupTestService implements IEditorGroupService { onEditorGroupMoved: Event; + /** + * An event for when the active editor group changes. The active editor + * group is the default location for new editors to open. + */ + readonly onDidActiveGroupChange: Event; + + /** + * An event for when a new group was added. + */ + readonly onDidAddGroup: Event; + + /** + * An event for when a group was removed. + */ + readonly onDidRemoveGroup: Event; + + /** + * An event for when a group was moved. + */ + readonly onDidMoveGroup: Event; + + /** + * An active group is the default location for new editors to open. + */ + readonly activeGroup: IEditorGroup; + + /** + * All groups that are currently visible in the editor area in the + * order of their creation (oldest first). + */ + readonly groups: ReadonlyArray; + + /** + * The number of editor groups that are currently opened. + */ + readonly count: number; + + /** + * The current layout orientation of the root group. + */ + readonly orientation: GroupOrientation; + + /** + * Get all groups that are currently visible in the editor area optionally + * sorted by being most recent active or grid order. Will sort by creation + * time by default (oldest group first). + */ + getGroups(order?: GroupsOrder): ReadonlyArray { + return undefined; + } + + /** + * Allows to convert a group identifier to a group. + */ + getGroup(identifier: GroupIdentifier): IEditorGroup { + return undefined; + } + invokeWithinEditorContext(fn: (accessor: ServicesAccessor) => T): T { return undefined; } @@ -43,11 +120,6 @@ export class EditorGroupTestService implements IEditorGroupService { */ onGroupOrientationChanged: Event; - /** - * Emitted when tab options changed. - */ - onTabOptionsChanged: Event; - /** * Keyboard focus the editor group at the provided position. */ @@ -58,26 +130,27 @@ export class EditorGroupTestService implements IEditorGroupService { } /** - * Activate the editor group at the provided position without moving focus. + * Set a group as active. An active group is the default location for new editors to open. */ - public activateGroup(group: EditorGroup): void; - public activateGroup(position: Position): void; - public activateGroup(arg1: any): void { - } - /** - * Allows to move the editor group from one position to another. - */ - - - public moveGroup(from: EditorGroup, to: EditorGroup): void; - public moveGroup(from: Position, to: Position): void; - public moveGroup(arg1: any, arg2: any): void { + activateGroup(group: IEditorGroup | GroupIdentifier): IEditorGroup { + return undefined; } /** - * Allows to arrange editor groups according to the GroupArrangement enumeration. + * Move a group to a new group in the editor area. + * + * @param group the group to move + * @param location the group from which to split to add the moved group + * @param direction the direction of where to split to */ - arrangeGroups(arrangement: GroupArrangement): void { + moveGroup(group: IEditorGroup | GroupIdentifier, location: IEditorGroup | GroupIdentifier, direction: GroupDirection): IEditorGroup { + return undefined; + } + + /** + * Arrange all groups according to the provided arrangement. + */ + arrangeGroups(arrangement: GroupsArrangement): void { } @@ -97,28 +170,12 @@ export class EditorGroupTestService implements IEditorGroupService { } /** - * Moves an editor from one group to another. The index in the group is optional. + * Move an editor from this group either within this group or to another group. */ - moveEditor(input: IEditorInput, from: IEditorGroup, to: IEditorGroup, moveOptions?: IMoveOptions): void; - moveEditor(input: IEditorInput, from: Position, to: Position, moveOptions?: IMoveOptions): void; - moveEditor(input: EditorInput, arg2: any, arg3: any, index?: IMoveOptions): void { + moveEditor(editor: IEditorInput, target: IEditorGroup, options?: IMoveEditorOptions): void { } - /** - * Provides access to the editor stacks model - */ - getStacksModel(): IEditorStacksModel { - return undefined; - } - - /** - * Returns true if tabs are shown, false otherwise. - */ - getTabOptions(): IEditorTabOptions { - return undefined; - } - public pinEditor(group: EditorGroup, input: EditorInput): void; public pinEditor(position: Position, input: EditorInput): void; public pinEditor(arg1: any, input: EditorInput): void { @@ -138,4 +195,23 @@ export class EditorGroupTestService implements IEditorGroupService { } + /** + * Returns the size of a group. + */ + getSize(group: IEditorGroup | GroupIdentifier): number { + return 0; + } + + /** + * Sets the size of a group. + */ + setSize(group: IEditorGroup | GroupIdentifier, size: number): void { + } + + /** + * Applies the provided layout by either moving existing groups or creating new groups. + */ + applyLayout(layout: EditorGroupLayout): void { + } + } \ No newline at end of file diff --git a/src/sqltest/stubs/workbenchEditorTestService.ts b/src/sqltest/stubs/workbenchEditorTestService.ts index 30efc7b16e..078e68c7f4 100644 --- a/src/sqltest/stubs/workbenchEditorTestService.ts +++ b/src/sqltest/stubs/workbenchEditorTestService.ts @@ -3,38 +3,38 @@ * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ 'use strict'; -import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; -import { createDecorator, ServiceIdentifier } from 'vs/platform/instantiation/common/instantiation'; -import { IEditorService, IEditor, IEditorInput, IEditorOptions, ITextEditorOptions, Position, Direction, IResourceInput, IResourceDiffInput, IResourceSideBySideInput } - from 'vs/platform/editor/common/editor'; +import { IEditorService, SIDE_GROUP_TYPE, ACTIVE_GROUP_TYPE, IResourceEditor, IResourceEditorReplacement, IOpenEditorOverrideHandler } from 'vs/workbench/services/editor/common/editorService'; +import { ServiceIdentifier, ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; +import { IEditorOptions, IResourceInput, ITextEditorOptions } from 'vs/platform/editor/common/editor'; +import { IEditor, IEditorInput, IResourceDiffInput, IResourceSideBySideInput, GroupIdentifier, ITextEditor, IUntitledResourceInput, ITextDiffEditor, ITextSideBySideEditor, IEditorInputWithOptions } from 'vs/workbench/common/editor'; import { TPromise } from 'vs/base/common/winjs.base'; -import { BaseEditor } from 'vs/workbench/browser/parts/editor/baseEditor'; -import { EditorInput, EditorOptions, IFileEditorInput, TextEditorOptions, Extensions, SideBySideEditorInput } from 'vs/workbench/common/editor'; -import { ICloseEditorsFilter } from 'vs/workbench/browser/parts/editor/editorPart'; +import { Event } from 'vs/base/common/event'; +import { Position } from 'vs/editor/common/core/position'; +import { IEditorGroup, IEditorReplacement } from 'vs/workbench/services/group/common/editorGroupsService'; +import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; +import { IDisposable } from 'vs/base/common/lifecycle'; -export class WorkbenchEditorTestService implements IWorkbenchEditorService { +export class WorkbenchEditorTestService implements IEditorService { _serviceBrand: ServiceIdentifier; - /** - * Returns the currently active editor or null if none. - */ - getActiveEditor(): IEditor { - return undefined; - } + readonly onDidActiveEditorChange: Event; - /** - * Returns the currently active editor input or null if none. - */ - getActiveEditorInput(): IEditorInput { - return undefined; - } + readonly onDidVisibleEditorsChange: Event; + + readonly activeEditor: IEditorInput; + + readonly activeControl: IEditor; + + readonly activeTextEditorWidget: ICodeEditor; + + readonly visibleEditors: ReadonlyArray; + + readonly visibleControls: ReadonlyArray; + + readonly visibleTextEditorWidgets: ReadonlyArray; + + readonly editors: ReadonlyArray; - /** - * Returns an array of visible editors. - */ - getVisibleEditors(): IEditor[] { - return undefined; - } /** * Returns iff the provided input is currently visible. @@ -46,33 +46,23 @@ export class WorkbenchEditorTestService implements IWorkbenchEditorService { return undefined; } - protected doOpenEditor(input: IEditorInput, options?: EditorOptions, sideBySide?: boolean): TPromise; - protected doOpenEditor(input: IEditorInput, options?: EditorOptions, position?: Position): TPromise; - protected doOpenEditor(input: IEditorInput, options?: EditorOptions, arg3?: any): TPromise { + public openEditor(editor: IEditorInput, options?: IEditorOptions | ITextEditorOptions, group?: IEditorGroup | GroupIdentifier | SIDE_GROUP_TYPE | ACTIVE_GROUP_TYPE): TPromise; + public openEditor(editor: IResourceInput | IUntitledResourceInput, group?: IEditorGroup | GroupIdentifier | SIDE_GROUP_TYPE | ACTIVE_GROUP_TYPE): TPromise; + public openEditor(editor: IResourceDiffInput, group?: IEditorGroup | GroupIdentifier | SIDE_GROUP_TYPE | ACTIVE_GROUP_TYPE): TPromise; + public openEditor(editor: IResourceSideBySideInput, group?: IEditorGroup | GroupIdentifier | SIDE_GROUP_TYPE | ACTIVE_GROUP_TYPE): TPromise; + public openEditor(input: any, arg2?: any, arg3?: any): TPromise { return undefined; } - /** - * Opens an Editor on the given input with the provided options at the given position. If sideBySide parameter - * is provided, causes the editor service to decide in what position to open the input. - */ - public openEditor(input: IEditorInput, options?: IEditorOptions, sideBySide?: boolean): TPromise; - public openEditor(input: IEditorInput, options?: IEditorOptions, position?: Position): TPromise; - public openEditor(input: IResourceInput | IResourceDiffInput | IResourceSideBySideInput, position?: Position): TPromise; - public openEditor(input: IResourceInput | IResourceDiffInput | IResourceSideBySideInput, sideBySide?: boolean): TPromise; - public openEditor(input: any, arg2?: any, arg3?: any): TPromise { - return undefined; - } - - public openEditors(editors: { input: IResourceInput | IResourceDiffInput | IResourceSideBySideInput, position: Position }[]): TPromise; - public openEditors(editors: { input: IEditorInput, position: Position, options?: IEditorOptions }[]): TPromise; + public openEditors(editors: IEditorInputWithOptions[], group?: IEditorGroup | GroupIdentifier | SIDE_GROUP_TYPE | ACTIVE_GROUP_TYPE): TPromise>; + public openEditors(editors: IResourceEditor[], group?: IEditorGroup | GroupIdentifier | SIDE_GROUP_TYPE | ACTIVE_GROUP_TYPE): TPromise>; public openEditors(editors: any[]): TPromise { return undefined; } - public replaceEditors(editors: { toReplace: IResourceInput | IResourceDiffInput | IResourceSideBySideInput, replaceWith: IResourceInput | IResourceDiffInput | IResourceSideBySideInput }[], position?: Position): TPromise; - public replaceEditors(editors: { toReplace: IEditorInput, replaceWith: IEditorInput, options?: IEditorOptions }[], position?: Position): TPromise; - public replaceEditors(editors: any[], position?: Position): TPromise { + public replaceEditors(editors: IResourceEditorReplacement[], group: IEditorGroup | GroupIdentifier): TPromise; + public replaceEditors(editors: IEditorReplacement[], group: IEditorGroup | GroupIdentifier): TPromise; + public replaceEditors(editors: any[], group: any): TPromise { return undefined; } @@ -99,10 +89,21 @@ export class WorkbenchEditorTestService implements IWorkbenchEditorService { return undefined; } - /** - * Allows to resolve an untyped input to a workbench typed instanceof editor input - */ + createInput(input: IResourceInput | IResourceDiffInput | IResourceSideBySideInput): IEditorInput { return undefined; } + + + isOpen(editor: IEditorInput | IResourceInput | IUntitledResourceInput, group?: IEditorGroup | GroupIdentifier): boolean { + return true; + } + + overrideOpenEditor(handler: IOpenEditorOverrideHandler): IDisposable { + return undefined; + } + + invokeWithinEditorContext(fn: (accessor: ServicesAccessor) => T): T { + return undefined; + } } \ No newline at end of file diff --git a/src/sqltest/workbench/common/taskUtilities.test.ts b/src/sqltest/workbench/common/taskUtilities.test.ts index 584cb547e9..a65b6a6507 100644 --- a/src/sqltest/workbench/common/taskUtilities.test.ts +++ b/src/sqltest/workbench/common/taskUtilities.test.ts @@ -29,7 +29,6 @@ suite('TaskUtilities', function () { return { profile: expectedProfile, databaseName: undefined }; }); mockConnectionManagementService.setup(x => x.isProfileConnected(TypeMoq.It.is(profile => profile === expectedProfile))).returns(() => true); - mockWorkbenchEditorService.setup(x => x.getActiveEditorInput()).returns(() => undefined); // If I call getCurrentGlobalConnection, it should return the expected server profile let actualProfile = TaskUtilities.getCurrentGlobalConnection(mockObjectExplorerService.object, mockConnectionManagementService.object, mockWorkbenchEditorService.object); @@ -48,7 +47,6 @@ suite('TaskUtilities', function () { return { profile: serverProfile, databaseName: dbName }; }); mockConnectionManagementService.setup(x => x.isProfileConnected(TypeMoq.It.is(profile => profile === serverProfile))).returns(() => true); - mockWorkbenchEditorService.setup(x => x.getActiveEditorInput()).returns(() => undefined); // If I call getCurrentGlobalConnection, it should return the expected database profile let actualProfile = TaskUtilities.getCurrentGlobalConnection(mockObjectExplorerService.object, mockConnectionManagementService.object, mockWorkbenchEditorService.object); @@ -79,9 +77,8 @@ suite('TaskUtilities', function () { // Mock the workbench service to return the active tab connection let tabConnectionUri = 'test_uri'; - let editorInput = new UntitledEditorInput(URI.parse(tabConnectionUri), false, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined); + let editorInput = new UntitledEditorInput(URI.parse(tabConnectionUri), false, undefined, undefined, undefined, undefined, undefined, undefined, undefined); let queryInput = new QueryInput(undefined, editorInput, undefined, undefined, undefined, undefined, undefined, undefined); - mockWorkbenchEditorService.setup(x => x.getActiveEditorInput()).returns(() => queryInput); mockConnectionManagementService.setup(x => x.getConnectionProfile(tabConnectionUri)).returns(() => tabProfile); // If I call getCurrentGlobalConnection, it should return the expected profile from the active tab @@ -104,7 +101,6 @@ suite('TaskUtilities', function () { return { profile: oeProfile, databaseName: undefined }; }); mockConnectionManagementService.setup(x => x.isProfileConnected(TypeMoq.It.is(profile => profile === oeProfile))).returns(() => true); - mockWorkbenchEditorService.setup(x => x.getActiveEditorInput()).returns(() => undefined); // If I call getCurrentGlobalConnection, it should return the expected profile from OE let actualProfile = TaskUtilities.getCurrentGlobalConnection(mockObjectExplorerService.object, mockConnectionManagementService.object, mockWorkbenchEditorService.object); diff --git a/src/tsconfig.json b/src/tsconfig.json index ae23a80100..468dbedde9 100644 --- a/src/tsconfig.json +++ b/src/tsconfig.json @@ -18,5 +18,10 @@ "typeRoots": [ "typings" ] - } + }, + "exclude": [ + "../out", + "../out-build", + "../out-vscode" + ] } diff --git a/src/typings/chokidar.d.ts b/src/typings/chokidar.d.ts index 86b76cfa36..60ba996d5f 100644 --- a/src/typings/chokidar.d.ts +++ b/src/typings/chokidar.d.ts @@ -8,7 +8,7 @@ declare module 'vscode-chokidar' { /** * takes paths to be watched recursively and options */ - export function watch(paths: string, options: IOptions): FSWatcher; + export function watch(paths: string | string[], options: IOptions): FSWatcher; export interface IOptions { diff --git a/src/typings/electron.d.ts b/src/typings/electron.d.ts index daf41dbc73..445234b207 100644 --- a/src/typings/electron.d.ts +++ b/src/typings/electron.d.ts @@ -1,4 +1,4 @@ -// Type definitions for Electron 1.7.9 +// Type definitions for Electron 2.0.5 // Project: http://electron.atom.io/ // Definitions by: The Electron Team // Definitions: https://github.com/electron/electron-typescript-definitions @@ -58,6 +58,7 @@ declare namespace Electron { dialog: Dialog; DownloadItem: typeof DownloadItem; globalShortcut: GlobalShortcut; + inAppPurchase: InAppPurchase; IncomingMessage: typeof IncomingMessage; ipcMain: IpcMain; Menu: typeof Menu; @@ -94,6 +95,7 @@ declare namespace Electron { const desktopCapturer: DesktopCapturer; const dialog: Dialog; const globalShortcut: GlobalShortcut; + const inAppPurchase: InAppPurchase; const ipcMain: IpcMain; const ipcRenderer: IpcRenderer; type nativeImage = NativeImage; @@ -157,12 +159,54 @@ declare namespace Electron { hasVisibleWindows: boolean) => void): this; removeListener(event: 'activate', listener: (event: Event, hasVisibleWindows: boolean) => void): this; + /** + * Emitted during Handoff after an activity from this device was successfully + * resumed on another one. + */ + on(event: 'activity-was-continued', listener: (event: Event, + /** + * A string identifying the activity. Maps to . + */ + type: string, + /** + * Contains app-specific state stored by the activity. + */ + userInfo: any) => void): this; + once(event: 'activity-was-continued', listener: (event: Event, + /** + * A string identifying the activity. Maps to . + */ + type: string, + /** + * Contains app-specific state stored by the activity. + */ + userInfo: any) => void): this; + addListener(event: 'activity-was-continued', listener: (event: Event, + /** + * A string identifying the activity. Maps to . + */ + type: string, + /** + * Contains app-specific state stored by the activity. + */ + userInfo: any) => void): this; + removeListener(event: 'activity-was-continued', listener: (event: Event, + /** + * A string identifying the activity. Maps to . + */ + type: string, + /** + * Contains app-specific state stored by the activity. + */ + userInfo: any) => void): this; /** * Emitted before the application starts closing its windows. Calling * event.preventDefault() will prevent the default behaviour, which is terminating * the application. Note: If application quit was initiated by * autoUpdater.quitAndInstall() then before-quit is emitted after emitting close - * event on all windows and closing them. + * event on all windows and closing them. Note: On Windows, this event will not be + * emitted if the app is closed due to a shutdown/restart of the system or a user + * logout. */ on(event: 'before-quit', listener: (event: Event) => void): this; once(event: 'before-quit', listener: (event: Event) => void): this; @@ -286,6 +330,46 @@ declare namespace Electron { * Contains app-specific state stored by the activity on another device. */ userInfo: any) => void): this; + /** + * Emitted during Handoff when an activity from a different device fails to be + * resumed. + */ + on(event: 'continue-activity-error', listener: (event: Event, + /** + * A string identifying the activity. Maps to . + */ + type: string, + /** + * A string with the error's localized description. + */ + error: string) => void): this; + once(event: 'continue-activity-error', listener: (event: Event, + /** + * A string identifying the activity. Maps to . + */ + type: string, + /** + * A string with the error's localized description. + */ + error: string) => void): this; + addListener(event: 'continue-activity-error', listener: (event: Event, + /** + * A string identifying the activity. Maps to . + */ + type: string, + /** + * A string with the error's localized description. + */ + error: string) => void): this; + removeListener(event: 'continue-activity-error', listener: (event: Event, + /** + * A string identifying the activity. Maps to . + */ + type: string, + /** + * A string with the error's localized description. + */ + error: string) => void): this; /** * Emitted when the gpu process crashes or is killed. */ @@ -364,7 +448,9 @@ declare namespace Electron { removeListener(event: 'open-url', listener: (event: Event, url: string) => void): this; /** - * Emitted when the application is quitting. + * Emitted when the application is quitting. Note: On Windows, this event will not + * be emitted if the app is closed due to a shutdown/restart of the system or a + * user logout. */ on(event: 'quit', listener: (event: Event, exitCode: number) => void): this; @@ -410,6 +496,49 @@ declare namespace Electron { url: string, certificateList: Certificate[], callback: (certificate?: Certificate) => void) => void): this; + /** + * Emitted when Handoff is about to be resumed on another device. If you need to + * update the state to be transferred, you should call event.preventDefault() + * immediately, construct a new userInfo dictionary and call + * app.updateCurrentActiviy() in a timely manner. Otherwise the operation will fail + * and continue-activity-error will be called. + */ + on(event: 'update-activity-state', listener: (event: Event, + /** + * A string identifying the activity. Maps to . + */ + type: string, + /** + * Contains app-specific state stored by the activity. + */ + userInfo: any) => void): this; + once(event: 'update-activity-state', listener: (event: Event, + /** + * A string identifying the activity. Maps to . + */ + type: string, + /** + * Contains app-specific state stored by the activity. + */ + userInfo: any) => void): this; + addListener(event: 'update-activity-state', listener: (event: Event, + /** + * A string identifying the activity. Maps to . + */ + type: string, + /** + * Contains app-specific state stored by the activity. + */ + userInfo: any) => void): this; + removeListener(event: 'update-activity-state', listener: (event: Event, + /** + * A string identifying the activity. Maps to . + */ + type: string, + /** + * Contains app-specific state stored by the activity. + */ + userInfo: any) => void): this; /** * Emitted when a new webContents is created. */ @@ -421,6 +550,31 @@ declare namespace Electron { webContents: WebContents) => void): this; removeListener(event: 'web-contents-created', listener: (event: Event, webContents: WebContents) => void): this; + /** + * Emitted during Handoff before an activity from a different device wants to be + * resumed. You should call event.preventDefault() if you want to handle this + * event. + */ + on(event: 'will-continue-activity', listener: (event: Event, + /** + * A string identifying the activity. Maps to . + */ + type: string) => void): this; + once(event: 'will-continue-activity', listener: (event: Event, + /** + * A string identifying the activity. Maps to . + */ + type: string) => void): this; + addListener(event: 'will-continue-activity', listener: (event: Event, + /** + * A string identifying the activity. Maps to . + */ + type: string) => void): this; + removeListener(event: 'will-continue-activity', listener: (event: Event, + /** + * A string identifying the activity. Maps to . + */ + type: string) => void): this; /** * Emitted when the application has finished basic startup. On Windows and Linux, * the will-finish-launching event is the same as the ready event; on macOS, this @@ -437,7 +591,9 @@ declare namespace Electron { * Emitted when all windows have been closed and the application will quit. Calling * event.preventDefault() will prevent the default behaviour, which is terminating * the application. See the description of the window-all-closed event for the - * differences between the will-quit and window-all-closed events. + * differences between the will-quit and window-all-closed events. Note: On + * Windows, this event will not be emitted if the app is closed due to a + * shutdown/restart of the system or a user logout. */ on(event: 'will-quit', listener: (event: Event) => void): this; once(event: 'will-quit', listener: (event: Event) => void): this; @@ -482,7 +638,7 @@ declare namespace Electron { */ enableMixedSandbox(): void; /** - * Exits immediately with exitCode. exitCode defaults to 0. All windows will be + * Exits immediately with exitCode. exitCode defaults to 0. All windows will be * closed immediately without asking user and the before-quit and will-quit events * will not be emitted. */ @@ -492,7 +648,6 @@ declare namespace Electron { * the active app. On Windows, focuses on the application's first window. */ focus(): void; - getAppMemoryInfo(): ProcessMetric[]; getAppMetrics(): ProcessMetric[]; getAppPath(): string; getBadgeCount(): number; @@ -501,24 +656,24 @@ declare namespace Electron { * Fetches a path's associated icon. On Windows, there a 2 kinds of icons: On Linux * and macOS, icons depend on the application associated with file mime type. */ - getFileIcon(path: string, options: FileIconOptions, callback: (error: Error, icon: NativeImage) => void): void; + getFileIcon(path: string, callback: (error: Error, icon: NativeImage) => void): void; /** * Fetches a path's associated icon. On Windows, there a 2 kinds of icons: On Linux * and macOS, icons depend on the application associated with file mime type. */ - getFileIcon(path: string, callback: (error: Error, icon: NativeImage) => void): void; + getFileIcon(path: string, options: FileIconOptions, callback: (error: Error, icon: NativeImage) => void): void; getGPUFeatureStatus(): GPUFeatureStatus; getJumpListSettings(): JumpListSettings; /** - * Note: When distributing your packaged app, you have to also ship the locales - * folder. Note: On Windows you have to call it after the ready events gets - * emitted. + * To set the locale, you'll want to use a command line switch at app startup, + * which may be found here. Note: When distributing your packaged app, you have to + * also ship the locales folder. Note: On Windows you have to call it after the + * ready events gets emitted. */ getLocale(): string; /** * If you provided path and args options to app.setLoginItemSettings then you need - * to pass the same arguments here for openAtLogin to be set correctly. Note: This - * API has no effect on MAS builds. + * to pass the same arguments here for openAtLogin to be set correctly. */ getLoginItemSettings(options?: LoginItemSettingsOptions): LoginItemSettings; /** @@ -544,6 +699,10 @@ declare namespace Electron { * net_error_list. */ importCertificate(options: ImportCertificateOptions, callback: (result: number) => void): void; + /** + * Invalidates the current Handoff user activity. + */ + invalidateCurrentActivity(type: string): void; isAccessibilitySupportEnabled(): boolean; /** * This method checks if the current executable is the default handler for a @@ -555,6 +714,7 @@ declare namespace Electron { * the Windows Registry and LSCopyDefaultHandlerForURLScheme internally. */ isDefaultProtocolClient(protocol: string, path?: string, args?: string[]): boolean; + isInApplicationsFolder(): boolean; isReady(): boolean; isUnityRunning(): boolean; /** @@ -578,6 +738,15 @@ declare namespace Electron { * instance starts: */ makeSingleInstance(callback: (argv: string[], workingDirectory: string) => void): boolean; + /** + * No confirmation dialog will be presented by default, if you wish to allow the + * user to confirm the operation you may do so using the dialog API. NOTE: This + * method throws errors if anything other than the user causes the move to fail. + * For instance if the user cancels the authorization dialog this method returns + * false. If we fail to perform the copy then this method will throw an error. The + * message in the error should be informative and tell you exactly what went wrong + */ + moveToApplicationsFolder(): boolean; /** * Try to close all windows. The before-quit event will be emitted first. If all * windows are successfully closed, the will-quit event will be emitted and by @@ -615,6 +784,15 @@ declare namespace Electron { * .plist file. See the Apple docs for more details. */ setAboutPanelOptions(options: AboutPanelOptionsOptions): void; + /** + * Manually enables Chrome's accessibility support, allowing to expose + * accessibility switch to users in application settings. + * https://www.chromium.org/developers/design-documents/accessibility for more + * details. Disabled by default. Note: Rendering accessibility tree can + * significantly affect the performance of your app. It should not be enabled by + * default. + */ + setAccessibilitySupportEnabled(enabled: boolean): void; /** * Changes the Application User Model ID to id. */ @@ -660,8 +838,7 @@ declare namespace Electron { /** * Set the app's login item settings. To work with Electron's autoUpdater on * Windows, which uses Squirrel, you'll want to set the launch path to Update.exe, - * and pass arguments that specify your application name. For example: Note: This - * API has no effect on MAS builds. + * and pass arguments that specify your application name. For example: */ setLoginItemSettings(settings: Settings): void; /** @@ -694,6 +871,18 @@ declare namespace Electron { * them. */ show(): void; + /** + * Start accessing a security scoped resource. With this method electron + * applications that are packaged for the Mac App Store may reach outside their + * sandbox to access files chosen by the user. See Apple's documentation for a + * description of how this system works. + */ + startAccessingSecurityScopedResource(bookmarkData: string): Function; + /** + * Updates the current activity if its type matches type, merging the entries from + * userInfo into its current userInfo dictionary. + */ + updateCurrentActivity(type: string, userInfo: any): void; commandLine: CommandLine; dock: Dock; } @@ -763,16 +952,18 @@ declare namespace Electron { getFeedURL(): string; /** * Restarts the app and installs the update after it has been downloaded. It should - * only be called after update-downloaded has been emitted. Note: - * autoUpdater.quitAndInstall() will close all application windows first and only - * emit before-quit event on app after that. This is different from the normal quit - * event sequence. + * only be called after update-downloaded has been emitted. Under the hood calling + * autoUpdater.quitAndInstall() will close all application windows first, and + * automatically call app.quit() after all windows have been closed. Note: If the + * application is quit without calling this API after the update-downloaded event + * has been emitted, the application will still be replaced by the updated one on + * the next run. */ quitAndInstall(): void; /** * Sets the url and initialize the auto updater. */ - setFeedURL(url: string, requestHeaders?: any): void; + setFeedURL(options: FeedURLOptions): void; } interface BluetoothDevice { @@ -789,6 +980,15 @@ declare namespace Electron { constructor(options?: BrowserViewConstructorOptions); static fromId(id: number): BrowserView; + static fromWebContents(webContents: WebContents): BrowserView | null; + static getAllViews(): BrowserView[]; + /** + * Force closing the view, the unload and beforeunload events won't be emitted for + * the web page. After you're done with a view, call this function in order to free + * memory and other resources as soon as possible. + */ + destroy(): void; + isDestroyed(): boolean; setAutoResize(options: AutoResizeOptions): void; setBackgroundColor(color: string): void; /** @@ -831,7 +1031,11 @@ declare namespace Electron { * cancel the close. Usually you would want to use the beforeunload handler to * decide whether the window should be closed, which will also be called when the * window is reloaded. In Electron, returning any value other than undefined would - * cancel the close. For example: + * cancel the close. For example: Note: There is a subtle difference between the + * behaviors of window.onbeforeunload = handler and + * window.addEventListener('beforeunload', handler). It is recommended to always + * set the event.returnValue explicitly, instead of just returning a value, as the + * former works more consistently within Electron. */ on(event: 'close', listener: (event: Event) => void): this; once(event: 'close', listener: (event: Event) => void): this; @@ -1056,6 +1260,7 @@ declare namespace Electron { * This API cannot be called before the ready event of the app module is emitted. */ static addExtension(path: string): void; + static fromBrowserView(browserView: BrowserView): BrowserWindow | null; static fromId(id: number): BrowserWindow; static fromWebContents(webContents: WebContents): BrowserWindow; static getAllWindows(): BrowserWindow[]; @@ -1080,6 +1285,10 @@ declare namespace Electron { * ready event of the app module is emitted. */ static removeExtension(name: string): void; + /** + * Adds a window as a tab on this window, after the tab for the window instance. + */ + addTabbedWindow(browserWindow: BrowserWindow): void; /** * Removes focus from the window. */ @@ -1123,6 +1332,11 @@ declare namespace Electron { focus(): void; focusOnWebView(): void; getBounds(): Rectangle; + /** + * Note: The BrowserView API is currently experimental and may change or be removed + * in future Electron releases. + */ + getBrowserView(): BrowserView | null; getChildWindows(): BrowserWindow[]; getContentBounds(): Rectangle; getContentSize(): number[]; @@ -1133,6 +1347,7 @@ declare namespace Electron { * (unsigned long) on Linux. */ getNativeWindowHandle(): Buffer; + getOpacity(): number; getParentWindow(): BrowserWindow; getPosition(): number[]; getRepresentedFilename(): string; @@ -1184,12 +1399,18 @@ declare namespace Electron { */ isMovable(): boolean; isResizable(): boolean; + isSimpleFullScreen(): boolean; isVisible(): boolean; /** * Note: This API always returns false on Windows. */ isVisibleOnAllWorkspaces(): boolean; isWindowMessageHooked(message: number): boolean; + /** + * Same as webContents.loadFile, filePath should be a path to an HTML file relative + * to the root of your application. See the webContents docs for more information. + */ + loadFile(filePath: string): void; /** * Same as webContents.loadURL(url[, options]). The url can be a remote address * (e.g. http://) or a path to a local HTML file using the file:// protocol. To @@ -1203,11 +1424,21 @@ declare namespace Electron { * being displayed already. */ maximize(): void; + /** + * Merges all windows into one window with multiple tabs when native tabs are + * enabled and there is more than one open window. + */ + mergeAllWindows(): void; /** * Minimizes the window. On some platforms the minimized window will be shown in * the Dock. */ minimize(): void; + /** + * Moves the current tab into a new window if native tabs are enabled and there is + * more than one tab in the current window. + */ + moveTabToNewWindow(): void; /** * Uses Quick Look to preview a file at a given path. */ @@ -1220,6 +1451,16 @@ declare namespace Electron { * Restores the window from minimized state to its previous state. */ restore(): void; + /** + * Selects the next tab when native tabs are enabled and there are other tabs in + * the window. + */ + selectNextTab(): void; + /** + * Selects the previous tab when native tabs are enabled and there are other tabs + * in the window. + */ + selectPreviousTab(): void; /** * Sets whether the window should show always on top of other windows. After * setting this, the window is still a normal window, not a toolbox window which @@ -1261,10 +1502,6 @@ declare namespace Electron { * Resizes and moves the window to the supplied bounds */ setBounds(bounds: Rectangle, animate?: boolean): void; - /** - * Note: The BrowserView API is currently experimental and may change or be removed - * in future Electron releases. - */ setBrowserView(browserView: BrowserView): void; /** * Sets whether the window can be manually closed by user. On Linux does nothing. @@ -1290,6 +1527,10 @@ declare namespace Electron { * bar will become gray when set to true. */ setDocumentEdited(edited: boolean): void; + /** + * Disable or enable the window. + */ + setEnabled(enable: boolean): void; /** * Changes whether the window can be focused. */ @@ -1316,7 +1557,7 @@ declare namespace Electron { * window will be passed to the window below this window, but if this window has * focus, it will still receive keyboard events. */ - setIgnoreMouseEvents(ignore: boolean): void; + setIgnoreMouseEvents(ignore: boolean, options?: IgnoreMouseEventsOptions): void; /** * Enters or leaves the kiosk mode. */ @@ -1353,6 +1594,10 @@ declare namespace Electron { * Sets whether the window can be moved by user. On Linux does nothing. */ setMovable(movable: boolean): void; + /** + * Sets the opacity of the window. On Linux does nothing. + */ + setOpacity(opacity: number): void; /** * Sets a 16 x 16 pixel overlay onto the current taskbar icon, usually used to * convey some sort of application status or to passively notify the user. @@ -1393,6 +1638,11 @@ declare namespace Electron { * HTML-rendered toolbar. For example: */ setSheetOffset(offsetY: number, offsetX?: number): void; + /** + * Enters or leaves simple fullscreen mode. Simple fullscreen mode emulates the + * native fullscreen behavior found in versions of Mac OS X prior to Lion (10.7). + */ + setSimpleFullScreen(flag: boolean): void; /** * Resizes the window to width and height. */ @@ -1456,6 +1706,11 @@ declare namespace Electron { * Shows the window but doesn't focus on it. */ showInactive(): void; + /** + * Toggles the visibility of the tab bar if native tabs are enabled and there is + * only one tab in the current window. + */ + toggleTabBar(): void; /** * Unhooks all of the window messages. */ @@ -1689,7 +1944,7 @@ declare namespace Electron { * An object representing the HTTP response message. */ response: IncomingMessage) => void): this; - constructor(options: any | string); + constructor(options: 'method' | 'url' | 'session' | 'partition' | 'protocol' | 'host' | 'hostname' | 'port' | 'path' | 'redirect'); /** * Cancels an ongoing HTTP transaction. If the request has already emitted the * close event, the abort operation will have no effect. Otherwise an ongoing event @@ -1917,7 +2172,7 @@ declare namespace Electron { */ on(event: 'changed', listener: (event: Event, /** - * The cookie that was changed + * The cookie that was changed. */ cookie: Cookie, /** @@ -1930,7 +2185,7 @@ declare namespace Electron { removed: boolean) => void): this; once(event: 'changed', listener: (event: Event, /** - * The cookie that was changed + * The cookie that was changed. */ cookie: Cookie, /** @@ -1943,7 +2198,7 @@ declare namespace Electron { removed: boolean) => void): this; addListener(event: 'changed', listener: (event: Event, /** - * The cookie that was changed + * The cookie that was changed. */ cookie: Cookie, /** @@ -1956,7 +2211,7 @@ declare namespace Electron { removed: boolean) => void): this; removeListener(event: 'changed', listener: (event: Event, /** - * The cookie that was changed + * The cookie that was changed. */ cookie: Cookie, /** @@ -1972,8 +2227,8 @@ declare namespace Electron { */ flushStore(callback: Function): void; /** - * Sends a request to get all cookies matching details, callback will be called - * with callback(error, cookies) on complete. + * Sends a request to get all cookies matching filter, callback will be called with + * callback(error, cookies) on complete. */ get(filter: Filter, callback: (error: Error, cookies: Cookie[]) => void): void; /** @@ -1994,7 +2249,7 @@ declare namespace Electron { /** * The number of average idle cpu wakeups per second since the last call to - * getCPUUsage. First call returns 0. + * getCPUUsage. First call returns 0. Will always return 0 on Windows. */ idleWakeupsPerSecond: number; /** @@ -2007,19 +2262,31 @@ declare namespace Electron { // Docs: http://electron.atom.io/docs/api/structures/crash-report - date: string; - ID: number; + date: Date; + id: string; } interface CrashReporter extends EventEmitter { // Docs: http://electron.atom.io/docs/api/crash-reporter + /** + * Set an extra parameter to be sent with the crash report. The values specified + * here will be sent in addition to any values set via the extra option when start + * was called. This API is only available on macOS, if you need to add/update extra + * parameters on Linux and Windows after your first call to start you can call + * start again with the updated extra options. + */ + addExtraParameter(key: string, value: string): void; /** * Returns the date and ID of the last crash report. If no crash reports have been * sent or the crash reporter has not been started, null is returned. */ getLastCrashReport(): CrashReport; + /** + * See all of the current parameters being passed to the crash reporter. + */ + getParameters(): void; /** * Returns all uploaded crash reports. Each report contains the date and uploaded * ID. @@ -2030,13 +2297,10 @@ declare namespace Electron { */ getUploadToServer(): boolean; /** - * Set an extra parameter to be sent with the crash report. The values specified - * here will be sent in addition to any values set via the extra option when start - * was called. This API is only available on macOS, if you need to add/update extra - * parameters on Linux and Windows after your first call to start you can call - * start again with the updated extra options. + * Remove a extra parameter from the current set of parameters so that it will not + * be sent with the crash report. */ - setExtraParameter(key: string, value: string): void; + removeExtraParameter(key: string): void; /** * This would normally be controlled by user preferences. This has no effect if * called before start is called. Note: This API can only be called from the main @@ -2057,7 +2321,7 @@ declare namespace Electron { * well. This will start the process that will monitor and send the crash reports. * Replace submitURL, productName and crashesDirectory with appropriate values. * Note: If you need send additional/updated extra parameters after your first call - * start you can call setExtraParameter on macOS or call start again with the + * start you can call addExtraParameter on macOS or call start again with the * new/updated extra parameters on Linux and Windows. Note: On macOS, Electron uses * a new crashpad client for crash collection and reporting. If you want to enable * crash reporting, initializing crashpad from the main process using @@ -2225,7 +2489,7 @@ declare namespace Electron { /** * Displays a modal dialog that shows an error message. This API can be called * safely before the ready event the app module emits, it is usually used to report - * errors in early stage of startup. If called before the app readyevent on Linux, + * errors in early stage of startup. If called before the app readyevent on Linux, * the message will be emitted to stderr, and no GUI dialog will appear. */ showErrorBox(title: string, content: string): void; @@ -2253,11 +2517,11 @@ declare namespace Electron { * dots (e.g. 'png' is good but '.png' and '*.png' are bad). To show all files, use * the '*' wildcard (no other wildcard is supported). If a callback is passed, the * API call will be asynchronous and the result will be passed via - * callback(filenames) Note: On Windows and Linux an open dialog can not be both a + * callback(filenames). Note: On Windows and Linux an open dialog can not be both a * file selector and a directory selector, so if you set properties to ['openFile', * 'openDirectory'] on these platforms, a directory selector will be shown. */ - showOpenDialog(browserWindow: BrowserWindow, options: OpenDialogOptions, callback?: (filePaths: string[]) => void): string[]; + showOpenDialog(browserWindow: BrowserWindow, options: OpenDialogOptions, callback?: (filePaths: string[], bookmarks: string[]) => void): string[]; /** * The browserWindow argument allows the dialog to attach itself to a parent * window, making it modal. The filters specifies an array of file types that can @@ -2266,27 +2530,27 @@ declare namespace Electron { * dots (e.g. 'png' is good but '.png' and '*.png' are bad). To show all files, use * the '*' wildcard (no other wildcard is supported). If a callback is passed, the * API call will be asynchronous and the result will be passed via - * callback(filenames) Note: On Windows and Linux an open dialog can not be both a + * callback(filenames). Note: On Windows and Linux an open dialog can not be both a * file selector and a directory selector, so if you set properties to ['openFile', * 'openDirectory'] on these platforms, a directory selector will be shown. */ - showOpenDialog(options: OpenDialogOptions, callback?: (filePaths: string[]) => void): string[]; + showOpenDialog(options: OpenDialogOptions, callback?: (filePaths: string[], bookmarks: string[]) => void): string[]; /** * The browserWindow argument allows the dialog to attach itself to a parent * window, making it modal. The filters specifies an array of file types that can * be displayed, see dialog.showOpenDialog for an example. If a callback is passed, * the API call will be asynchronous and the result will be passed via - * callback(filename) + * callback(filename). */ - showSaveDialog(browserWindow: BrowserWindow, options: SaveDialogOptions, callback?: (filename: string) => void): string; + showSaveDialog(browserWindow: BrowserWindow, options: SaveDialogOptions, callback?: (filename: string, bookmark: string) => void): string; /** * The browserWindow argument allows the dialog to attach itself to a parent * window, making it modal. The filters specifies an array of file types that can * be displayed, see dialog.showOpenDialog for an example. If a callback is passed, * the API call will be asynchronous and the result will be passed via - * callback(filename) + * callback(filename). */ - showSaveDialog(options: SaveDialogOptions, callback?: (filename: string) => void): string; + showSaveDialog(options: SaveDialogOptions, callback?: (filename: string, bookmark: string) => void): string; } interface Display { @@ -2325,33 +2589,54 @@ declare namespace Electron { * download that can't be resumed. The state can be one of following: */ on(event: 'done', listener: (event: Event, - state: string) => void): this; + /** + * Can be `completed`, `cancelled` or `interrupted`. + */ + state: ('completed' | 'cancelled' | 'interrupted')) => void): this; once(event: 'done', listener: (event: Event, - state: string) => void): this; + /** + * Can be `completed`, `cancelled` or `interrupted`. + */ + state: ('completed' | 'cancelled' | 'interrupted')) => void): this; addListener(event: 'done', listener: (event: Event, - state: string) => void): this; + /** + * Can be `completed`, `cancelled` or `interrupted`. + */ + state: ('completed' | 'cancelled' | 'interrupted')) => void): this; removeListener(event: 'done', listener: (event: Event, - state: string) => void): this; + /** + * Can be `completed`, `cancelled` or `interrupted`. + */ + state: ('completed' | 'cancelled' | 'interrupted')) => void): this; /** * Emitted when the download has been updated and is not done. The state can be one * of following: */ on(event: 'updated', listener: (event: Event, - state: string) => void): this; + /** + * Can be `progressing` or `interrupted`. + */ + state: ('progressing' | 'interrupted')) => void): this; once(event: 'updated', listener: (event: Event, - state: string) => void): this; + /** + * Can be `progressing` or `interrupted`. + */ + state: ('progressing' | 'interrupted')) => void): this; addListener(event: 'updated', listener: (event: Event, - state: string) => void): this; + /** + * Can be `progressing` or `interrupted`. + */ + state: ('progressing' | 'interrupted')) => void): this; removeListener(event: 'updated', listener: (event: Event, - state: string) => void): this; + /** + * Can be `progressing` or `interrupted`. + */ + state: ('progressing' | 'interrupted')) => void): this; /** * Cancels the download operation. */ cancel(): void; - /** - * Resumes Boolean - Whether the download can resume. - */ - canResume(): void; + canResume(): boolean; getContentDisposition(): string; getETag(): string; /** @@ -2491,6 +2776,38 @@ declare namespace Electron { webgl2: string; } + interface InAppPurchase extends EventEmitter { + + // Docs: http://electron.atom.io/docs/api/in-app-purchase + + /** + * Emitted when one or more transactions have been updated. + */ + on(event: 'transactions-updated', listener: (event: Event, + /** + * Array of transactions. + */ + transactions: Transaction[]) => void): this; + once(event: 'transactions-updated', listener: (event: Event, + /** + * Array of transactions. + */ + transactions: Transaction[]) => void): this; + addListener(event: 'transactions-updated', listener: (event: Event, + /** + * Array of transactions. + */ + transactions: Transaction[]) => void): this; + removeListener(event: 'transactions-updated', listener: (event: Event, + /** + * Array of transactions. + */ + transactions: Transaction[]) => void): this; + canMakePayments(): boolean; + getReceiptURL(): string; + purchaseProduct(productID: string, quantity?: number, callback?: (isProductValid: boolean) => void): void; + } + class IncomingMessage extends EventEmitter { // Docs: http://electron.atom.io/docs/api/incoming-message @@ -2624,7 +2941,7 @@ declare namespace Electron { /** * Removes all listeners, or those of the specified channel. */ - removeAllListeners(channel?: string): this; + removeAllListeners(channel: string): this; /** * Removes the specified listener from the listener array for the specified * channel. @@ -2646,6 +2963,10 @@ declare namespace Electron { * renderer process, unless you know what you are doing you should never use it. */ sendSync(channel: string, ...args: any[]): any; + /** + * Sends a message to a window with windowid via channel. + */ + sendTo(windowId: number, channel: string, ...args: any[]): void; /** * Like ipcRenderer.send but the event will be sent to the element in the * host page instead of the main process. @@ -2760,6 +3081,20 @@ declare namespace Electron { // Docs: http://electron.atom.io/docs/api/menu + /** + * Emitted when a popup is closed either manually or with menu.closePopup(). + */ + on(event: 'menu-will-close', listener: (event: Event) => void): this; + once(event: 'menu-will-close', listener: (event: Event) => void): this; + addListener(event: 'menu-will-close', listener: (event: Event) => void): this; + removeListener(event: 'menu-will-close', listener: (event: Event) => void): this; + /** + * Emitted when menu.popup() is called. + */ + on(event: 'menu-will-show', listener: (event: Event) => void): this; + once(event: 'menu-will-show', listener: (event: Event) => void): this; + addListener(event: 'menu-will-show', listener: (event: Event) => void): this; + removeListener(event: 'menu-will-show', listener: (event: Event) => void): this; constructor(); /** * Generally, the template is just an array of options for constructing a MenuItem. @@ -2772,7 +3107,7 @@ declare namespace Electron { * Note: The returned Menu instance doesn't support dynamic addition or removal of * menu items. Instance properties can still be dynamically modified. */ - static getApplicationMenu(): Menu; + static getApplicationMenu(): Menu | null; /** * Sends the action to the first responder of application. This is used for * emulating default macOS menu behaviors. Usually you would just use the role @@ -2786,7 +3121,7 @@ declare namespace Electron { * Windows and Linux but has no effect on macOS. Note: This API has to be called * after the ready event of app module. */ - static setApplicationMenu(menu: Menu): void; + static setApplicationMenu(menu: Menu | null): void; /** * Appends the menuItem to the menu. */ @@ -2795,14 +3130,15 @@ declare namespace Electron { * Closes the context menu in the browserWindow. */ closePopup(browserWindow?: BrowserWindow): void; + getMenuItemById(id: string): MenuItem; /** * Inserts the menuItem to the pos position of the menu. */ insert(pos: number, menuItem: MenuItem): void; /** - * Pops up this menu as a context menu in the browserWindow. + * Pops up this menu as a context menu in the BrowserWindow. */ - popup(browserWindow?: BrowserWindow, options?: PopupOptions): void; + popup(options: PopupOptions): void; items: MenuItem[]; } @@ -2848,6 +3184,13 @@ declare namespace Electron { * Creates a new NativeImage instance from dataURL. */ static createFromDataURL(dataURL: string): NativeImage; + /** + * Creates a new NativeImage instance from the NSImage that maps to the given image + * name. See NSImageName for a list of possible values. The hslShift is applied to + * the image with the following rules This means that [-1, 0, 1] will make the + * image completely white and [-1, 1, 0] will make the image completely black. + */ + static createFromNamedImage(imageName: string, hslShift: number[]): NativeImage; /** * Creates a new NativeImage instance from a file located at path. This method * returns an empty image if the path does not exist, cannot be read, or is not a @@ -2911,22 +3254,22 @@ declare namespace Electron { on(event: 'action', listener: (event: Event, /** - * The index of the action that was activated + * The index of the action that was activated. */ index: number) => void): this; once(event: 'action', listener: (event: Event, /** - * The index of the action that was activated + * The index of the action that was activated. */ index: number) => void): this; addListener(event: 'action', listener: (event: Event, /** - * The index of the action that was activated + * The index of the action that was activated. */ index: number) => void): this; removeListener(event: 'action', listener: (event: Event, /** - * The index of the action that was activated + * The index of the action that was activated. */ index: number) => void): this; /** @@ -2938,7 +3281,7 @@ declare namespace Electron { removeListener(event: 'click', listener: (event: Event) => void): this; /** * Emitted when the notification is closed by manual intervention from the user. - * This event is not guarunteed to be emitted in all cases where the notification + * This event is not guaranteed to be emitted in all cases where the notification * is closed. */ on(event: 'close', listener: (event: Event) => void): this; @@ -2951,22 +3294,22 @@ declare namespace Electron { */ on(event: 'reply', listener: (event: Event, /** - * The string the user entered into the inline reply field + * The string the user entered into the inline reply field. */ reply: string) => void): this; once(event: 'reply', listener: (event: Event, /** - * The string the user entered into the inline reply field + * The string the user entered into the inline reply field. */ reply: string) => void): this; addListener(event: 'reply', listener: (event: Event, /** - * The string the user entered into the inline reply field + * The string the user entered into the inline reply field. */ reply: string) => void): this; removeListener(event: 'reply', listener: (event: Event, /** - * The string the user entered into the inline reply field + * The string the user entered into the inline reply field. */ reply: string) => void): this; /** @@ -2980,11 +3323,17 @@ declare namespace Electron { removeListener(event: 'show', listener: (event: Event) => void): this; constructor(options: NotificationConstructorOptions); static isSupported(): boolean; + /** + * Dismisses the notification. + */ + close(): void; /** * Immediately shows the notification to the user, please note this means unlike * the HTML5 Notification implementation, simply instantiating a new Notification * does not immediately show it to the user, you need to call this method before - * the OS will display it. + * the OS will display it. If the notification has been shown before, this method + * will dismiss the previously shown notification and create a new one with + * identical properties. */ show(): void; } @@ -3036,6 +3385,16 @@ declare namespace Electron { once(event: 'resume', listener: Function): this; addListener(event: 'resume', listener: Function): this; removeListener(event: 'resume', listener: Function): this; + /** + * Emitted when the system is about to reboot or shut down. If the event handler + * invokes e.preventDefault(), Electron will attempt to delay system shutdown in + * order for the app to exit cleanly. If e.preventDefault() is called, the app + * should exit as soon as possible by calling something like app.quit(). + */ + on(event: 'shutdown', listener: Function): this; + once(event: 'shutdown', listener: Function): this; + addListener(event: 'shutdown', listener: Function): this; + removeListener(event: 'shutdown', listener: Function): this; /** * Emitted when the system is suspending. */ @@ -3118,6 +3477,11 @@ declare namespace Electron { * sends a new HTTP request as a response. */ interceptHttpProtocol(scheme: string, handler: (request: InterceptHttpProtocolRequest, callback: (redirectRequest: RedirectRequest) => void) => void, completion?: (error: Error) => void): void; + /** + * Same as protocol.registerStreamProtocol, except that it replaces an existing + * protocol handler. + */ + interceptStreamProtocol(scheme: string, handler: (request: InterceptStreamProtocolRequest, callback: (stream?: ReadableStream | StreamProtocolResponse) => void) => void, completion?: (error: Error) => void): void; /** * Intercepts scheme protocol and uses handler as the protocol's new handler which * sends a String as a response. @@ -3178,6 +3542,15 @@ declare namespace Electron { * the ready event of the app module gets emitted. */ registerStandardSchemes(schemes: string[], options?: RegisterStandardSchemesOptions): void; + /** + * Registers a protocol of scheme that will send a Readable as a response. The + * usage is similar to the other register{Any}Protocol, except that the callback + * should be called with either a Readable object or an object that has the data, + * statusCode, and headers properties. Example: It is possible to pass any object + * that implements the readable stream API (emits data/end/error events). For + * example, here's how a file could be returned: + */ + registerStreamProtocol(scheme: string, handler: (request: RegisterStreamProtocolRequest, callback: (stream?: ReadableStream | StreamProtocolResponse) => void) => void, completion?: (error: Error) => void): void; /** * Registers a protocol of scheme that will send a String as a response. The usage * is the same with registerFileProtocol, except that the callback should be called @@ -3380,7 +3753,7 @@ declare namespace Electron { * options, you have to ensure the Session with the partition has never been used * before. There is no way to change the options of an existing Session object. */ - static fromPartition(partition: string, options: FromPartitionOptions): Session; + static fromPartition(partition: string, options?: FromPartitionOptions): Session; /** * A Session object, the default session object of the app. */ @@ -3444,11 +3817,12 @@ declare namespace Electron { * Writes any unwritten DOMStorage data to disk. */ flushStorageData(): void; - getBlobData(identifier: string, callback: (result: Buffer) => void): Blob; + getBlobData(identifier: string, callback: (result: Buffer) => void): void; /** * Callback is invoked with the session's current cache size. */ getCacheSize(callback: (size: number) => void): void; + getPreloads(): string[]; getUserAgent(): string; /** * Resolves the proxy information for url. The callback will be called with @@ -3471,9 +3845,14 @@ declare namespace Electron { /** * Sets the handler which can be used to respond to permission requests for the * session. Calling callback(true) will allow the permission and callback(false) - * will reject it. + * will reject it. To clear the handler, call setPermissionRequestHandler(null). */ - setPermissionRequestHandler(handler: (webContents: WebContents, permission: string, callback: (permissionGranted: boolean) => void) => void): void; + setPermissionRequestHandler(handler: (webContents: WebContents, permission: string, callback: (permissionGranted: boolean) => void, details: PermissionRequestHandlerDetails) => void | null): void; + /** + * Adds scripts that will be executed on ALL web contents that are associated with + * this session just before normal preload scripts run. + */ + setPreloads(preloads: string[]): void; /** * Sets the proxy settings. When pacScript and proxyRules are provided together, * the proxyRules option is ignored and pacScript configuration is applied. The @@ -3578,6 +3957,24 @@ declare namespace Electron { width: number; } + interface StreamProtocolResponse { + + // Docs: http://electron.atom.io/docs/api/structures/stream-protocol-response + + /** + * A Node.js readable stream representing the response body + */ + data: ReadableStream; + /** + * An object containing the response headers + */ + headers: Headers; + /** + * The HTTP response code + */ + statusCode: number; + } + interface SystemPreferences extends EventEmitter { // Docs: http://electron.atom.io/docs/api/system-preferences @@ -3633,7 +4030,7 @@ declare namespace Electron { getAccentColor(): string; getColor(color: '3d-dark-shadow' | '3d-face' | '3d-highlight' | '3d-light' | '3d-shadow' | 'active-border' | 'active-caption' | 'active-caption-gradient' | 'app-workspace' | 'button-text' | 'caption-text' | 'desktop' | 'disabled-text' | 'highlight' | 'highlight-text' | 'hotlight' | 'inactive-border' | 'inactive-caption' | 'inactive-caption-gradient' | 'inactive-caption-text' | 'info-background' | 'info-text' | 'menu' | 'menu-highlight' | 'menubar' | 'menu-text' | 'scrollbar' | 'window' | 'window-frame' | 'window-text'): string; /** - * This API uses NSUserDefaults on macOS. Some popular key and types are: + * Some popular key and types are: */ getUserDefault(key: string, type: 'string' | 'boolean' | 'integer' | 'float' | 'double' | 'url' | 'array' | 'dictionary'): any; /** @@ -3655,14 +4052,22 @@ declare namespace Electron { */ postNotification(event: string, userInfo: any): void; /** - * Set the value of key in system preferences. Note that type should match actual - * type of value. An exception is thrown if they don't. This API uses - * NSUserDefaults on macOS. Some popular key and types are: + * Add the specified defaults to your application's NSUserDefaults. + */ + registerDefaults(defaults: any): void; + /** + * Removes the key in NSUserDefaults. This can be used to restore the default or + * global value of a key previously set with setUserDefault. + */ + removeUserDefault(key: string): void; + /** + * Set the value of key in NSUserDefaults. Note that type should match actual type + * of value. An exception is thrown if they don't. Some popular key and types are: */ setUserDefault(key: string, type: string, value: string): void; /** * Same as subscribeNotification, but uses NSNotificationCenter for local defaults. - * This is necessary for events such as NSUserDefaultsDidChangeNotification + * This is necessary for events such as NSUserDefaultsDidChangeNotification. */ subscribeLocalNotification(event: string, callback: (event: string, userInfo: any) => void): void; /** @@ -3830,7 +4235,7 @@ declare namespace Electron { // Docs: http://electron.atom.io/docs/api/touch-bar constructor(options: TouchBarConstructorOptions); - escapeItem: any; + escapeItem: (TouchBarButton | TouchBarColorPicker | TouchBarGroup | TouchBarLabel | TouchBarPopover | TouchBarScrubber | TouchBarSegmentedControl | TouchBarSlider | TouchBarSpacer | null); static TouchBarButton: typeof TouchBarButton; static TouchBarColorPicker: typeof TouchBarColorPicker; static TouchBarGroup: typeof TouchBarGroup; @@ -3842,6 +4247,23 @@ declare namespace Electron { static TouchBarSpacer: typeof TouchBarSpacer; } + interface Transaction { + + // Docs: http://electron.atom.io/docs/api/structures/transaction + + errorCode: number; + errorMessage: string; + originalTransactionIdentifier: string; + payment: Payment; + transactionDate: string; + transactionIdentifier: string; + /** + * The transaction sate ("purchasing", "purchased", "failed", "restored", or + * "deferred") + */ + transactionState: string; + } + class Tray extends EventEmitter { // Docs: http://electron.atom.io/docs/api/tray @@ -3873,45 +4295,61 @@ declare namespace Electron { */ on(event: 'click', listener: (event: Event, /** - * The bounds of tray icon + * The bounds of tray icon. */ - bounds: Rectangle) => void): this; + bounds: Rectangle, + /** + * The position of the event. + */ + position: Point) => void): this; once(event: 'click', listener: (event: Event, /** - * The bounds of tray icon + * The bounds of tray icon. */ - bounds: Rectangle) => void): this; + bounds: Rectangle, + /** + * The position of the event. + */ + position: Point) => void): this; addListener(event: 'click', listener: (event: Event, /** - * The bounds of tray icon + * The bounds of tray icon. */ - bounds: Rectangle) => void): this; + bounds: Rectangle, + /** + * The position of the event. + */ + position: Point) => void): this; removeListener(event: 'click', listener: (event: Event, /** - * The bounds of tray icon + * The bounds of tray icon. */ - bounds: Rectangle) => void): this; + bounds: Rectangle, + /** + * The position of the event. + */ + position: Point) => void): this; /** * Emitted when the tray icon is double clicked. */ on(event: 'double-click', listener: (event: Event, /** - * The bounds of tray icon + * The bounds of tray icon. */ bounds: Rectangle) => void): this; once(event: 'double-click', listener: (event: Event, /** - * The bounds of tray icon + * The bounds of tray icon. */ bounds: Rectangle) => void): this; addListener(event: 'double-click', listener: (event: Event, /** - * The bounds of tray icon + * The bounds of tray icon. */ bounds: Rectangle) => void): this; removeListener(event: 'double-click', listener: (event: Event, /** - * The bounds of tray icon + * The bounds of tray icon. */ bounds: Rectangle) => void): this; /** @@ -3970,22 +4408,22 @@ declare namespace Electron { */ on(event: 'drop-text', listener: (event: Event, /** - * the dropped text string + * the dropped text string. */ text: string) => void): this; once(event: 'drop-text', listener: (event: Event, /** - * the dropped text string + * the dropped text string. */ text: string) => void): this; addListener(event: 'drop-text', listener: (event: Event, /** - * the dropped text string + * the dropped text string. */ text: string) => void): this; removeListener(event: 'drop-text', listener: (event: Event, /** - * the dropped text string + * the dropped text string. */ text: string) => void): this; /** @@ -3993,22 +4431,22 @@ declare namespace Electron { */ on(event: 'mouse-enter', listener: (event: Event, /** - * The position of the event + * The position of the event. */ position: Point) => void): this; once(event: 'mouse-enter', listener: (event: Event, /** - * The position of the event + * The position of the event. */ position: Point) => void): this; addListener(event: 'mouse-enter', listener: (event: Event, /** - * The position of the event + * The position of the event. */ position: Point) => void): this; removeListener(event: 'mouse-enter', listener: (event: Event, /** - * The position of the event + * The position of the event. */ position: Point) => void): this; /** @@ -4016,22 +4454,45 @@ declare namespace Electron { */ on(event: 'mouse-leave', listener: (event: Event, /** - * The position of the event + * The position of the event. */ position: Point) => void): this; once(event: 'mouse-leave', listener: (event: Event, /** - * The position of the event + * The position of the event. */ position: Point) => void): this; addListener(event: 'mouse-leave', listener: (event: Event, /** - * The position of the event + * The position of the event. */ position: Point) => void): this; removeListener(event: 'mouse-leave', listener: (event: Event, /** - * The position of the event + * The position of the event. + */ + position: Point) => void): this; + /** + * Emitted when the mouse moves in the tray icon. + */ + on(event: 'mouse-move', listener: (event: Event, + /** + * The position of the event. + */ + position: Point) => void): this; + once(event: 'mouse-move', listener: (event: Event, + /** + * The position of the event. + */ + position: Point) => void): this; + addListener(event: 'mouse-move', listener: (event: Event, + /** + * The position of the event. + */ + position: Point) => void): this; + removeListener(event: 'mouse-move', listener: (event: Event, + /** + * The position of the event. */ position: Point) => void): this; /** @@ -4039,22 +4500,22 @@ declare namespace Electron { */ on(event: 'right-click', listener: (event: Event, /** - * The bounds of tray icon + * The bounds of tray icon. */ bounds: Rectangle) => void): this; once(event: 'right-click', listener: (event: Event, /** - * The bounds of tray icon + * The bounds of tray icon. */ bounds: Rectangle) => void): this; addListener(event: 'right-click', listener: (event: Event, /** - * The bounds of tray icon + * The bounds of tray icon. */ bounds: Rectangle) => void): this; removeListener(event: 'right-click', listener: (event: Event, /** - * The bounds of tray icon + * The bounds of tray icon. */ bounds: Rectangle) => void): this; constructor(image: NativeImage | string); @@ -4096,7 +4557,8 @@ declare namespace Electron { */ setPressedImage(image: NativeImage): void; /** - * Sets the title displayed aside of the tray icon in the status bar. + * Sets the title displayed aside of the tray icon in the status bar (Support ANSI + * colors). */ setTitle(title: string): void; /** @@ -4150,7 +4612,7 @@ declare namespace Electron { */ length: number; /** - * Last Modification time in number of seconds sine the UNIX epoch. + * Last Modification time in number of seconds since the UNIX epoch. */ modificationTime: number; /** @@ -4176,7 +4638,7 @@ declare namespace Electron { */ length: number; /** - * Last Modification time in number of seconds sine the UNIX epoch. + * Last Modification time in number of seconds since the UNIX epoch. */ modificationTime: number; /** @@ -4217,22 +4679,22 @@ declare namespace Electron { */ on(event: 'before-input-event', listener: (event: Event, /** - * Input properties + * Input properties. */ input: Input) => void): this; once(event: 'before-input-event', listener: (event: Event, /** - * Input properties + * Input properties. */ input: Input) => void): this; addListener(event: 'before-input-event', listener: (event: Event, /** - * Input properties + * Input properties. */ input: Input) => void): this; removeListener(event: 'before-input-event', listener: (event: Event, /** - * Input properties + * Input properties. */ input: Input) => void): this; /** @@ -4242,7 +4704,7 @@ declare namespace Electron { on(event: 'certificate-error', listener: (event: Event, url: string, /** - * The error code + * The error code. */ error: string, certificate: Certificate, @@ -4250,7 +4712,7 @@ declare namespace Electron { once(event: 'certificate-error', listener: (event: Event, url: string, /** - * The error code + * The error code. */ error: string, certificate: Certificate, @@ -4258,7 +4720,7 @@ declare namespace Electron { addListener(event: 'certificate-error', listener: (event: Event, url: string, /** - * The error code + * The error code. */ error: string, certificate: Certificate, @@ -4266,11 +4728,31 @@ declare namespace Electron { removeListener(event: 'certificate-error', listener: (event: Event, url: string, /** - * The error code + * The error code. */ error: string, certificate: Certificate, callback: (isTrusted: boolean) => void) => void): this; + /** + * Emitted when the associated window logs a console message. Will not be emitted + * for windows with offscreen rendering enabled. + */ + on(event: 'console-message', listener: (level: number, + message: string, + line: number, + sourceId: string) => void): this; + once(event: 'console-message', listener: (level: number, + message: string, + line: number, + sourceId: string) => void): this; + addListener(event: 'console-message', listener: (level: number, + message: string, + line: number, + sourceId: string) => void): this; + removeListener(event: 'console-message', listener: (level: number, + message: string, + line: number, + sourceId: string) => void): this; /** * Emitted when there is a new context menu that needs to be handled. */ @@ -4300,69 +4782,69 @@ declare namespace Electron { * nwse-resize, col-resize, row-resize, m-panning, e-panning, n-panning, * ne-panning, nw-panning, s-panning, se-panning, sw-panning, w-panning, move, * vertical-text, cell, context-menu, alias, progress, nodrop, copy, none, - * not-allowed, zoom-in, zoom-out, grab, grabbing, custom. If the type parameter is - * custom, the image parameter will hold the custom cursor image in a NativeImage, - * and scale, size and hotspot will hold additional information about the custom - * cursor. + * not-allowed, zoom-in, zoom-out, grab, grabbing or custom. If the type parameter + * is custom, the image parameter will hold the custom cursor image in a + * NativeImage, and scale, size and hotspot will hold additional information about + * the custom cursor. */ on(event: 'cursor-changed', listener: (event: Event, type: string, image?: NativeImage, /** - * scaling factor for the custom cursor + * scaling factor for the custom cursor. */ scale?: number, /** - * the size of the `image` + * the size of the `image`. */ size?: Size, /** - * coordinates of the custom cursor's hotspot + * coordinates of the custom cursor's hotspot. */ hotspot?: Point) => void): this; once(event: 'cursor-changed', listener: (event: Event, type: string, image?: NativeImage, /** - * scaling factor for the custom cursor + * scaling factor for the custom cursor. */ scale?: number, /** - * the size of the `image` + * the size of the `image`. */ size?: Size, /** - * coordinates of the custom cursor's hotspot + * coordinates of the custom cursor's hotspot. */ hotspot?: Point) => void): this; addListener(event: 'cursor-changed', listener: (event: Event, type: string, image?: NativeImage, /** - * scaling factor for the custom cursor + * scaling factor for the custom cursor. */ scale?: number, /** - * the size of the `image` + * the size of the `image`. */ size?: Size, /** - * coordinates of the custom cursor's hotspot + * coordinates of the custom cursor's hotspot. */ hotspot?: Point) => void): this; removeListener(event: 'cursor-changed', listener: (event: Event, type: string, image?: NativeImage, /** - * scaling factor for the custom cursor + * scaling factor for the custom cursor. */ scale?: number, /** - * the size of the `image` + * the size of the `image`. */ size?: Size, /** - * coordinates of the custom cursor's hotspot + * coordinates of the custom cursor's hotspot. */ hotspot?: Point) => void): this; /** @@ -4400,14 +4882,53 @@ declare namespace Electron { once(event: 'devtools-reload-page', listener: Function): this; addListener(event: 'devtools-reload-page', listener: Function): this; removeListener(event: 'devtools-reload-page', listener: Function): this; + /** + * Emitted when a has been attached to this web contents. + */ + on(event: 'did-attach-webview', listener: (event: Event, + /** + * The guest web contents that is used by the ``. + */ + webContents: WebContents) => void): this; + once(event: 'did-attach-webview', listener: (event: Event, + /** + * The guest web contents that is used by the ``. + */ + webContents: WebContents) => void): this; + addListener(event: 'did-attach-webview', listener: (event: Event, + /** + * The guest web contents that is used by the ``. + */ + webContents: WebContents) => void): this; + removeListener(event: 'did-attach-webview', listener: (event: Event, + /** + * The guest web contents that is used by the ``. + */ + webContents: WebContents) => void): this; /** * Emitted when a page's theme color changes. This is usually due to encountering a * meta tag: */ - on(event: 'did-change-theme-color', listener: Function): this; - once(event: 'did-change-theme-color', listener: Function): this; - addListener(event: 'did-change-theme-color', listener: Function): this; - removeListener(event: 'did-change-theme-color', listener: Function): this; + on(event: 'did-change-theme-color', listener: (event: Event, + /** + * Theme color is in format of '#rrggbb'. It is `null` when no theme color is set. + */ + color: string | null) => void): this; + once(event: 'did-change-theme-color', listener: (event: Event, + /** + * Theme color is in format of '#rrggbb'. It is `null` when no theme color is set. + */ + color: string | null) => void): this; + addListener(event: 'did-change-theme-color', listener: (event: Event, + /** + * Theme color is in format of '#rrggbb'. It is `null` when no theme color is set. + */ + color: string | null) => void): this; + removeListener(event: 'did-change-theme-color', listener: (event: Event, + /** + * Theme color is in format of '#rrggbb'. It is `null` when no theme color is set. + */ + color: string | null) => void): this; /** * This event is like did-finish-load but emitted when the load failed or was * cancelled, e.g. window.stop() is invoked. The full list of error codes and their @@ -4643,7 +5164,7 @@ declare namespace Electron { */ disposition: ('default' | 'foreground-tab' | 'background-tab' | 'new-window' | 'save-to-disk' | 'other'), /** - * The options which will be used for creating the new `BrowserWindow`. + * The options which will be used for creating the new . */ options: any, /** @@ -4660,7 +5181,7 @@ declare namespace Electron { */ disposition: ('default' | 'foreground-tab' | 'background-tab' | 'new-window' | 'save-to-disk' | 'other'), /** - * The options which will be used for creating the new `BrowserWindow`. + * The options which will be used for creating the new . */ options: any, /** @@ -4677,7 +5198,7 @@ declare namespace Electron { */ disposition: ('default' | 'foreground-tab' | 'background-tab' | 'new-window' | 'save-to-disk' | 'other'), /** - * The options which will be used for creating the new `BrowserWindow`. + * The options which will be used for creating the new . */ options: any, /** @@ -4694,7 +5215,7 @@ declare namespace Electron { */ disposition: ('default' | 'foreground-tab' | 'background-tab' | 'new-window' | 'save-to-disk' | 'other'), /** - * The options which will be used for creating the new `BrowserWindow`. + * The options which will be used for creating the new . */ options: any, /** @@ -4707,22 +5228,22 @@ declare namespace Electron { */ on(event: 'page-favicon-updated', listener: (event: Event, /** - * Array of URLs + * Array of URLs. */ favicons: string[]) => void): this; once(event: 'page-favicon-updated', listener: (event: Event, /** - * Array of URLs + * Array of URLs. */ favicons: string[]) => void): this; addListener(event: 'page-favicon-updated', listener: (event: Event, /** - * Array of URLs + * Array of URLs. */ favicons: string[]) => void): this; removeListener(event: 'page-favicon-updated', listener: (event: Event, /** - * Array of URLs + * Array of URLs. */ favicons: string[]) => void): this; /** @@ -4771,8 +5292,8 @@ declare namespace Electron { /** * Emitted when bluetooth device needs to be selected on call to * navigator.bluetooth.requestDevice. To use navigator.bluetooth api webBluetooth - * should be enabled. If event.preventDefault is not called, first available - * device will be selected. callback should be called with deviceId to be selected, + * should be enabled. If event.preventDefault is not called, first available device + * will be selected. callback should be called with deviceId to be selected, * passing empty string to callback will cancel the request. */ on(event: 'select-bluetooth-device', listener: (event: Event, @@ -4935,13 +5456,13 @@ declare namespace Electron { * called with callback(image). The image is an instance of NativeImage that stores * data of the snapshot. Omitting rect will capture the whole visible page. */ - capturePage(rect: Rectangle, callback: (image: NativeImage) => void): void; + capturePage(callback: (image: NativeImage) => void): void; /** * Captures a snapshot of the page within rect. Upon completion callback will be * called with callback(image). The image is an instance of NativeImage that stores * data of the snapshot. Omitting rect will capture the whole visible page. */ - capturePage(callback: (image: NativeImage) => void): void; + capturePage(rect: Rectangle, callback: (image: NativeImage) => void): void; /** * Clears the navigation history. */ @@ -4988,16 +5509,15 @@ declare namespace Electron { * requestFullScreen can only be invoked by a gesture from the user. Setting * userGesture to true will remove this limitation. If the result of the executed * code is a promise the callback result will be the resolved value of the promise. - * We recommend that you use the returned Promise to handle code that results in a + * We recommend that you use the returned Promise to handle code that results in a * Promise. */ executeJavaScript(code: string, userGesture?: boolean, callback?: (result: any) => void): Promise; /** - * Starts a request to find all matches for the text in the web page and returns an - * Integer representing the request id used for the request. The result of the - * request can be obtained by subscribing to found-in-page event. + * Starts a request to find all matches for the text in the web page. The result of + * the request can be obtained by subscribing to found-in-page event. */ - findInPage(text: string, options?: FindInPageOptions): void; + findInPage(text: string, options?: FindInPageOptions): number; /** * Focuses the web page. */ @@ -5076,6 +5596,12 @@ declare namespace Electron { isOffscreen(): boolean; isPainting(): boolean; isWaitingForResponse(): boolean; + /** + * Loads the given file in the window, filePath should be a path to an HTML file + * relative to the root of your application. For instance an app structure like + * this: Would require code like this + */ + loadFile(filePath: string): void; /** * Loads the url in the window. The url must contain the protocol prefix, e.g. the * http:// or file://. If the load should bypass http cache then use the pragma @@ -5083,7 +5609,9 @@ declare namespace Electron { */ loadURL(url: string, options?: LoadURLOptions): void; /** - * Opens the devtools. + * Opens the devtools. When contents is a tag, the mode would be detach + * by default, explicitly passing an empty mode can force using last used dock + * state. */ openDevTools(options?: OpenDevToolsOptions): void; /** @@ -5101,7 +5629,7 @@ declare namespace Electron { * webContents.print({silent: false, printBackground: false, deviceName: ''}). Use * page-break-before: always; CSS style to force to print to a new page. */ - print(options?: PrintOptions): void; + print(options?: PrintOptions, callback?: (success: boolean) => void): void; /** * Prints window's web page as PDF with Chromium's preview printing custom * settings. The callback will be called with callback(error, data) on completion. @@ -5160,6 +5688,19 @@ declare namespace Electron { * Mute the audio on the current web page. */ setAudioMuted(muted: boolean): void; + /** + * Uses the devToolsWebContents as the target WebContents to show devtools. The + * devToolsWebContents must not have done any navigation, and it should not be used + * for other purposes after the call. By default Electron manages the devtools by + * creating an internal WebContents with native view, which developers have very + * limited control of. With the setDevToolsWebContents method, developers can use + * any WebContents to show the devtools in it, including BrowserWindow, BrowserView + * and tag. Note that closing the devtools does not destroy the + * devToolsWebContents, it is caller's responsibility to destroy + * devToolsWebContents. An example of showing devtools in a tag: An + * example of showing devtools in a BrowserWindow: + */ + setDevToolsWebContents(devToolsWebContents: WebContents): void; /** * If offscreen rendering is enabled sets the frame rate to the specified number. * Only values between 1 and 60 are accepted. @@ -5187,7 +5728,7 @@ declare namespace Electron { setVisualZoomLevelLimits(minimumLevel: number, maximumLevel: number): void; /** * Setting the WebRTC IP handling policy allows you to control which IPs are - * exposed via WebRTC. See BrowserLeaks for more details. + * exposed via WebRTC. See BrowserLeaks for more details. */ setWebRTCIPHandlingPolicy(policy: 'default' | 'default_public_interface_only' | 'default_public_and_private_interfaces' | 'disable_non_proxied_udp'): void; /** @@ -5198,14 +5739,10 @@ declare namespace Electron { /** * Changes the zoom level to the specified level. The original size is 0 and each * increment above or below represents zooming 20% larger or smaller to default - * limits of 300% and 50% of original size, respectively. + * limits of 300% and 50% of original size, respectively. The formula for this is + * scale := 1.2 ^ level. */ setZoomLevel(level: number): void; - /** - * Deprecated: Call setVisualZoomLevelLimits instead to set the visual zoom level - * limits. This method will be removed in Electron 2.0. - */ - setZoomLevelLimits(minimumLevel: number, maximumLevel: number): void; /** * Shows pop-up dictionary that searches the selected word on the page. */ @@ -5276,6 +5813,10 @@ declare namespace Electron { * userGesture to true will remove this limitation. */ executeJavaScript(code: string, userGesture?: boolean, callback?: (result: any) => void): Promise; + /** + * Work like executeJavaScript but evaluates scripts in isolated context. + */ + executeJavaScriptInIsolatedWorld(worldId: number, scripts: WebSource[], userGesture?: boolean, callback?: (result: any) => void): void; /** * Returns an object describing usage information of Blink's internal memory * caches. This will generate: @@ -5305,6 +5846,18 @@ declare namespace Electron { * cannot be corrupted by active network attackers. */ registerURLSchemeAsSecure(scheme: string): void; + /** + * Set the content security policy of the isolated world. + */ + setIsolatedWorldContentSecurityPolicy(worldId: number, csp: string): void; + /** + * Set the name of the isolated world. Useful in devtools. + */ + setIsolatedWorldHumanReadableName(worldId: number, name: string): void; + /** + * Set the security origin of the isolated world. + */ + setIsolatedWorldSecurityOrigin(worldId: number, securityOrigin: string): void; /** * Sets the maximum and minimum layout-based (i.e. non-visual) zoom level. */ @@ -5330,22 +5883,28 @@ declare namespace Electron { * limits of 300% and 50% of original size, respectively. */ setZoomLevel(level: number): void; - /** - * Deprecated: Call setVisualZoomLevelLimits instead to set the visual zoom level - * limits. This method will be removed in Electron 2.0. - */ - setZoomLevelLimits(minimumLevel: number, maximumLevel: number): void; } class WebRequest extends EventEmitter { // Docs: http://electron.atom.io/docs/api/web-request + /** + * The listener will be called with listener(details) when a server initiated + * redirect is about to occur. + */ + onBeforeRedirect(listener: (details: OnBeforeRedirectDetails) => void): void; /** * The listener will be called with listener(details) when a server initiated * redirect is about to occur. */ onBeforeRedirect(filter: OnBeforeRedirectFilter, listener: (details: OnBeforeRedirectDetails) => void): void; + /** + * The listener will be called with listener(details, callback) when a request is + * about to occur. The uploadData is an array of UploadData objects. The callback + * has to be called with an response object. + */ + onBeforeRequest(listener: (details: OnBeforeRequestDetails, callback: (response: Response) => void) => void): void; /** * The listener will be called with listener(details, callback) when a request is * about to occur. The uploadData is an array of UploadData objects. The callback @@ -5359,10 +5918,25 @@ declare namespace Electron { * has to be called with an response object. */ onBeforeSendHeaders(filter: OnBeforeSendHeadersFilter, listener: Function): void; + /** + * The listener will be called with listener(details, callback) before sending an + * HTTP request, once the request headers are available. This may occur after a TCP + * connection is made to the server, but before any http data is sent. The callback + * has to be called with an response object. + */ + onBeforeSendHeaders(listener: Function): void; /** * The listener will be called with listener(details) when a request is completed. */ onCompleted(filter: OnCompletedFilter, listener: (details: OnCompletedDetails) => void): void; + /** + * The listener will be called with listener(details) when a request is completed. + */ + onCompleted(listener: (details: OnCompletedDetails) => void): void; + /** + * The listener will be called with listener(details) when an error occurs. + */ + onErrorOccurred(listener: (details: OnErrorOccurredDetails) => void): void; /** * The listener will be called with listener(details) when an error occurs. */ @@ -5373,6 +5947,18 @@ declare namespace Electron { * response object. */ onHeadersReceived(filter: OnHeadersReceivedFilter, listener: Function): void; + /** + * The listener will be called with listener(details, callback) when HTTP response + * headers of a request have been received. The callback has to be called with an + * response object. + */ + onHeadersReceived(listener: Function): void; + /** + * The listener will be called with listener(details) when first byte of the + * response body is received. For HTTP requests, this means that the status line + * and response headers are available. + */ + onResponseStarted(listener: (details: OnResponseStartedDetails) => void): void; /** * The listener will be called with listener(details) when first byte of the * response body is received. For HTTP requests, this means that the status line @@ -5385,6 +5971,24 @@ declare namespace Electron { * response are visible by the time this listener is fired. */ onSendHeaders(filter: OnSendHeadersFilter, listener: (details: OnSendHeadersDetails) => void): void; + /** + * The listener will be called with listener(details) just before a request is + * going to be sent to the server, modifications of previous onBeforeSendHeaders + * response are visible by the time this listener is fired. + */ + onSendHeaders(listener: (details: OnSendHeadersDetails) => void): void; + } + + interface WebSource { + + // Docs: http://electron.atom.io/docs/api/structures/web-source + + code: string; + /** + * Default is 1. + */ + startLine?: number; + url?: string; } interface WebviewTag extends HTMLElement { @@ -5575,6 +6179,10 @@ declare namespace Electron { */ addEventListener(event: 'devtools-focused', listener: (event: Event) => void, useCapture?: boolean): this; removeEventListener(event: 'devtools-focused', listener: (event: Event) => void): this; + addEventListener(type: K, listener: (this: HTMLElement, ev: HTMLElementEventMap[K]) => any, useCapture?: boolean): void; + addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void; + removeEventListener(type: K, listener: (this: HTMLElement, ev: HTMLElementEventMap[K]) => any, useCapture?: boolean): void; + removeEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void; canGoBack(): boolean; canGoForward(): boolean; canGoToOffset(offset: number): boolean; @@ -5613,13 +6221,12 @@ declare namespace Electron { * context in the page. HTML APIs like requestFullScreen, which require user * action, can take advantage of this option for automation. */ - executeJavaScript(code: string, userGesture: boolean, callback?: (result: any) => void): void; + executeJavaScript(code: string, userGesture?: boolean, callback?: (result: any) => void): void; /** - * Starts a request to find all matches for the text in the web page and returns an - * Integer representing the request id used for the request. The result of the - * request can be obtained by subscribing to found-in-page event. + * Starts a request to find all matches for the text in the web page. The result of + * the request can be obtained by subscribing to found-in-page event. */ - findInPage(text: string, options?: FindInPageOptions): void; + findInPage(text: string, options?: FindInPageOptions): number; getTitle(): string; getURL(): string; getUserAgent(): string; @@ -6062,6 +6669,10 @@ declare namespace Electron { * is true. */ fullscreenable?: boolean; + /** + * Use pre-Lion fullscreen on macOS. Default is false. + */ + simpleFullscreen?: boolean; /** * Whether to show the window in taskbar. Default is false. */ @@ -6115,7 +6726,7 @@ declare namespace Electron { */ enableLargerThanScreen?: boolean; /** - * Window's background color as Hexadecimal value, like #66CD00 or #FFF or + * Window's background color as a hexadecimal value, like #66CD00 or #FFF or * #80FFFFFF (alpha is supported). Default is #FFF (white). */ backgroundColor?: string; @@ -6124,6 +6735,11 @@ declare namespace Electron { * is true. */ hasShadow?: boolean; + /** + * Set the initial opacity of the window, between 0.0 (fully transparent) and 1.0 + * (fully opaque). This is only implemented on Windows and macOS. + */ + opacity?: number; /** * Forces using dark theme for the window, only works on some GTK+3 desktop * environments. Default is false. @@ -6140,9 +6756,9 @@ declare namespace Electron { /** * The style of window title bar. Default is default. Possible values are: */ - titleBarStyle?: ('default' | 'hidden' | 'hidden-inset' | 'hiddenInset' | 'customButtonsOnHover'); + titleBarStyle?: ('default' | 'hidden' | 'hiddenInset' | 'customButtonsOnHover'); /** - * Shows the title in the tile bar in full screen mode on macOS for all + * Shows the title in the title bar in full screen mode on macOS for all * titleBarStyle options. Default is false. */ fullscreenWindowTitle?: boolean; @@ -6155,7 +6771,8 @@ declare namespace Electron { /** * Add a type of vibrancy effect to the window, only on macOS. Can be * appearance-based, light, dark, titlebar, selection, menu, popover, sidebar, - * medium-light or ultra-dark. + * medium-light or ultra-dark. Please note that using frame: false in combination + * with a vibrancy value requires that you use a non-default titleBarStyle as well. */ vibrancy?: ('appearance-based' | 'light' | 'dark' | 'titlebar' | 'selection' | 'menu' | 'popover' | 'sidebar' | 'medium-light' | 'ultra-dark'); /** @@ -6196,7 +6813,11 @@ declare namespace Electron { /** * Verification result from chromium. */ - error: string; + verificationResult: string; + /** + * Error code. + */ + errorCode: number; } interface ClearStorageDataOptions { @@ -6206,7 +6827,7 @@ declare namespace Electron { origin?: string; /** * The types of storages to clear, can contain: appcache, cookies, filesystem, - * indexdb, localstorage, shadercache, websql, serviceworkers + * indexdb, localstorage, shadercache, websql, serviceworkers. */ storages?: string[]; /** @@ -6253,11 +6874,11 @@ declare namespace Electron { interface ContextMenuParams { /** - * x coordinate + * x coordinate. */ x: number; /** - * y coordinate + * y coordinate. */ y: number; /** @@ -6317,8 +6938,8 @@ declare namespace Electron { */ inputFieldType: string; /** - * Input source that invoked the context menu. Can be none, mouse, keyboard, touch, - * touchMenu. + * Input source that invoked the context menu. Can be none, mouse, keyboard, touch + * or touchMenu. */ menuSourceType: ('none' | 'mouse' | 'keyboard' | 'touch' | 'touchMenu'); /** @@ -6355,9 +6976,10 @@ declare namespace Electron { * properties are sent correctly. Nested objects are not supported and the property * names and values must be less than 64 characters long. */ - extra?: any; + extra?: Extra; /** - * Only used when the crash reporter is used in a forked process (macOS only). + * Directory to store the crashreports temporarily (only used when the crash + * reporter is started via process.crashReporter.start). */ crashesDirectory?: string; } @@ -6502,9 +7124,12 @@ declare namespace Electron { } interface DisplayBalloonOptions { + /** + * - + */ icon?: NativeImage | string; - title?: string; - content?: string; + title: string; + content: string; } interface Dock { @@ -6569,6 +7194,18 @@ declare namespace Electron { interface Extensions { } + interface FeedURLOptions { + url: string; + /** + * HTTP request headers. + */ + headers?: Headers; + /** + * Either json or default, see the README for more information. + */ + serverType?: string; + } + interface FileIconOptions { size: ('small' | 'normal' | 'large'); } @@ -6584,7 +7221,7 @@ declare namespace Electron { */ name?: string; /** - * Retrieves cookies whose domains match or are subdomains of domains + * Retrieves cookies whose domains match or are subdomains of domains. */ domain?: string; /** @@ -6644,6 +7281,18 @@ declare namespace Electron { name: string; } + interface Headers { + } + + interface IgnoreMouseEventsOptions { + /** + * If true, forwards mouse move messages to Chromium, enabling mouse related events + * such as mouseleave. Only used when ignore is true. If ignore is false, + * forwarding is always disabled regardless of this value. + */ + forward?: boolean; + } + interface ImportCertificateOptions { /** * Path for the pkcs12 file. @@ -6657,35 +7306,35 @@ declare namespace Electron { interface Input { /** - * Either keyUp or keyDown + * Either keyUp or keyDown. */ type: string; /** - * Equivalent to + * Equivalent to . */ key: string; /** - * Equivalent to + * Equivalent to . */ code: string; /** - * Equivalent to + * Equivalent to . */ isAutoRepeat: boolean; /** - * Equivalent to + * Equivalent to . */ shift: boolean; /** - * Equivalent to + * Equivalent to . */ control: boolean; /** - * Equivalent to + * Equivalent to . */ alt: boolean; /** - * Equivalent to + * Equivalent to . */ meta: boolean; } @@ -6711,6 +7360,14 @@ declare namespace Electron { uploadData: UploadData[]; } + interface InterceptStreamProtocolRequest { + url: string; + headers: Headers; + referrer: string; + method: string; + uploadData: UploadData[]; + } + interface InterceptStringProtocolRequest { url: string; referrer: string; @@ -6767,6 +7424,9 @@ declare namespace Electron { * Extra headers separated by "\n" */ extraHeaders?: string; + /** + * - + */ postData?: UploadRawData[] | UploadFile[] | UploadFileSystem[] | UploadBlob[]; /** * Base url (with trailing path separator) for files to be loaded by the data url. @@ -6783,25 +7443,25 @@ declare namespace Electron { */ openAtLogin: boolean; /** - * true if the app is set to open as hidden at login. This setting is only - * supported on macOS. + * true if the app is set to open as hidden at login. This setting is not available + * on . */ openAsHidden: boolean; /** - * true if the app was opened at login automatically. This setting is only - * supported on macOS. + * true if the app was opened at login automatically. This setting is not available + * on . */ wasOpenedAtLogin: boolean; /** * true if the app was opened as a hidden login item. This indicates that the app - * should not open any windows at startup. This setting is only supported on macOS. + * should not open any windows at startup. This setting is not available on . */ wasOpenedAsHidden: boolean; /** * true if the app was opened as a login item that should restore the state from * the previous session. This indicates that the app should restore the windows - * that were open the last time the app was closed. This setting is only supported - * on macOS. + * that were open the last time the app was closed. This setting is not available + * on . */ restoreState: boolean; } @@ -6827,7 +7487,7 @@ declare namespace Electron { * Define the action of the menu item, when specified the click property will be * ignored. See . */ - role?: MenuItemRole; + role?: string; /** * Can be normal, separator, submenu, checkbox or radio. */ @@ -6850,7 +7510,7 @@ declare namespace Electron { checked?: boolean; /** * Should be specified for submenu type menu items. If submenu is specified, the - * type: 'submenu' can be omitted. If the value is not a Menu then it will be + * type: 'submenu' can be omitted. If the value is not a then it will be * automatically converted to one using Menu.buildFromTemplate. */ submenu?: MenuItemConstructorOptions[] | Menu; @@ -6940,7 +7600,7 @@ declare namespace Electron { */ disposition: ('default' | 'foreground-tab' | 'background-tab' | 'new-window' | 'save-to-disk' | 'other'); /** - * The options which should be used for creating the new `BrowserWindow`. + * The options which should be used for creating the new . */ options: Options; } @@ -6948,7 +7608,7 @@ declare namespace Electron { interface NotificationConstructorOptions { /** * A title for the notification, which will be shown at the top of the notification - * window when it is shown + * window when it is shown. */ title: string; /** @@ -6957,17 +7617,17 @@ declare namespace Electron { subtitle?: string; /** * The body text of the notification, which will be displayed below the title or - * subtitle + * subtitle. */ body: string; /** - * Whether or not to emit an OS notification noise when showing the notification + * Whether or not to emit an OS notification noise when showing the notification. */ silent?: boolean; /** - * An icon to use in the notification + * An icon to use in the notification. */ - icon?: NativeImage; + icon?: string | NativeImage; /** * Whether or not to add an inline reply option to the notification. */ @@ -6982,15 +7642,21 @@ declare namespace Electron { sound?: string; /** * Actions to add to the notification. Please read the available actions and - * limitations in the NotificationAction documentation + * limitations in the NotificationAction documentation. */ actions?: NotificationAction[]; + /** + * A custom title for the close button of an alert. An empty string will cause the + * default localized text to be used. + */ + closeButtonText?: string; } interface OnBeforeRedirectDetails { - id: string; + id: number; url: string; method: string; + webContentsId?: number; resourceType: string; timestamp: number; redirectURL: string; @@ -7015,6 +7681,7 @@ declare namespace Electron { id: number; url: string; method: string; + webContentsId?: number; resourceType: string; timestamp: number; uploadData: UploadData[]; @@ -7040,6 +7707,7 @@ declare namespace Electron { id: number; url: string; method: string; + webContentsId?: number; resourceType: string; timestamp: number; responseHeaders: ResponseHeaders; @@ -7060,6 +7728,7 @@ declare namespace Electron { id: number; url: string; method: string; + webContentsId?: number; resourceType: string; timestamp: number; fromCache: boolean; @@ -7089,6 +7758,7 @@ declare namespace Electron { id: number; url: string; method: string; + webContentsId?: number; resourceType: string; timestamp: number; responseHeaders: ResponseHeaders; @@ -7112,6 +7782,7 @@ declare namespace Electron { id: number; url: string; method: string; + webContentsId?: number; resourceType: string; timestamp: number; requestHeaders: RequestHeaders; @@ -7152,6 +7823,10 @@ declare namespace Electron { * Message to display above input boxes. */ message?: string; + /** + * Create when packaged for the Mac App Store. + */ + securityScopedBookmarks?: boolean; } interface OpenExternalOptions { @@ -7175,50 +7850,56 @@ declare namespace Electron { interface Parameters { /** - * Specify the screen type to emulate (default: desktop) + * Specify the screen type to emulate (default: desktop): */ screenPosition: ('desktop' | 'mobile'); /** - * Set the emulated screen size (screenPosition == mobile) + * Set the emulated screen size (screenPosition == mobile). */ screenSize: Size; /** * Position the view on the screen (screenPosition == mobile) (default: {x: 0, y: - * 0}) + * 0}). */ viewPosition: Point; /** * Set the device scale factor (if zero defaults to original device scale factor) - * (default: 0) + * (default: 0). */ deviceScaleFactor: number; /** * Set the emulated view size (empty means no override) */ viewSize: Size; - /** - * Whether emulated view should be scaled down if necessary to fit into available - * space (default: false) - */ - fitToView: boolean; - /** - * Offset of the emulated view inside available space (not in fit to view mode) - * (default: {x: 0, y: 0}) - */ - offset: Point; /** * Scale of emulated view inside available space (not in fit to view mode) - * (default: 1) + * (default: 1). */ scale: number; } + interface Payment { + productIdentifier: string; + quantity: number; + } + + interface PermissionRequestHandlerDetails { + /** + * The url of the openExternal request. + */ + externalURL: string; + } + interface PluginCrashedEvent extends Event { name: string; version: string; } interface PopupOptions { + /** + * Default is the focused window. + */ + window?: BrowserWindow; /** * Default is the current mouse cursor position. Must be declared if y is declared. */ @@ -7227,16 +7908,15 @@ declare namespace Electron { * Default is the current mouse cursor position. Must be declared if x is declared. */ y?: number; - /** - * Set to true to have this method return immediately called, false to return after - * the menu has been selected or closed. Defaults to false. - */ - async?: boolean; /** * The index of the menu item to be positioned under the mouse cursor at the * specified coordinates. Default is -1. */ positioningItem?: number; + /** + * Called when menu is closed. + */ + callback?: () => void; } interface PrintOptions { @@ -7295,21 +7975,21 @@ declare namespace Electron { privateBytes: number; /** * The amount of memory shared between processes, typically memory consumed by the - * Electron code itself + * Electron code itself. */ sharedBytes: number; } interface ProgressBarOptions { /** - * Mode for the progress bar. Can be none, normal, indeterminate, error, or paused. + * Mode for the progress bar. Can be none, normal, indeterminate, error or paused. */ - mode: ('none' | 'normal' | 'indeterminate' | 'error'); + mode: ('none' | 'normal' | 'indeterminate' | 'error' | 'paused'); } interface Provider { /** - * Returns Boolean + * Returns Boolean. */ spellCheck: (text: string) => void; } @@ -7354,6 +8034,14 @@ declare namespace Electron { secure?: boolean; } + interface RegisterStreamProtocolRequest { + url: string; + headers: Headers; + referrer: string; + method: string; + uploadData: UploadData[]; + } + interface RegisterStringProtocolRequest { url: string; referrer: string; @@ -7401,7 +8089,7 @@ declare namespace Electron { */ width?: number; /** - * Defaults to the image's height + * Defaults to the image's height. */ height?: number; /** @@ -7472,6 +8160,11 @@ declare namespace Electron { * Show the tags input box, defaults to true. */ showsTagField?: boolean; + /** + * Create a when packaged for the Mac App Store. If this option is enabled and the + * file doesn't already exist a blank file will be created at the chosen path. + */ + securityScopedBookmarks?: boolean; } interface Settings { @@ -7484,7 +8177,7 @@ declare namespace Electron { * true to open the app as hidden. Defaults to false. The user can edit this * setting from the System Preferences so * app.getLoginItemStatus().wasOpenedAsHidden should be checked when the app is - * opened to know the current value. This setting is only supported on macOS. + * opened to know the current value. This setting is not available on . */ openAsHidden?: boolean; /** @@ -7499,11 +8192,26 @@ declare namespace Electron { } interface SizeOptions { + /** + * true to make the webview container automatically resize within the bounds + * specified by the attributes normal, min and max. + */ + enableAutoSize?: boolean; /** * Normal size of the page. This can be used in combination with the attribute to * manually resize the webview guest contents. */ - normal?: Normal; + normal?: Size; + /** + * Minimum size of the page. This can be used in combination with the attribute to + * manually resize the webview guest contents. + */ + min?: Size; + /** + * Maximium size of the page. This can be used in combination with the attribute to + * manually resize the webview guest contents. + */ + max?: Size; } interface SourcesOptions { @@ -7585,7 +8293,7 @@ declare namespace Electron { /** * Can be left, right or overlay. */ - iconPosition: ('left' | 'right' | 'overlay'); + iconPosition?: ('left' | 'right' | 'overlay'); /** * Function to call when the button is clicked. */ @@ -7608,8 +8316,8 @@ declare namespace Electron { } interface TouchBarConstructorOptions { - items: (TouchBarButton | TouchBarColorPicker | TouchBarGroup | TouchBarLabel | TouchBarPopover | TouchBarScrubber | TouchBarSegmentedControl | TouchBarSlider | TouchBarSpacer)[]; - escapeItem?: TouchBarButton | TouchBarColorPicker | TouchBarGroup | TouchBarLabel | TouchBarPopover | TouchBarScrubber | TouchBarSegmentedControl | TouchBarSlider | TouchBarSpacer; + items: Array; + escapeItem?: TouchBarButton | TouchBarColorPicker | TouchBarGroup | TouchBarLabel | TouchBarPopover | TouchBarScrubber | TouchBarSegmentedControl | TouchBarSlider | TouchBarSpacer | null; } interface TouchBarGroupConstructorOptions { @@ -7652,15 +8360,15 @@ declare namespace Electron { interface TouchBarScrubberConstructorOptions { /** - * An array of items to place in this scrubber + * An array of items to place in this scrubber. */ items: ScrubberItem[]; /** - * Called when the user taps an item that was not the last tapped item + * Called when the user taps an item that was not the last tapped item. */ select: (selectedIndex: number) => void; /** - * Called when the user taps any item + * Called when the user taps any item. */ highlight: (highlightedIndex: number) => void; /** @@ -7704,7 +8412,7 @@ declare namespace Electron { */ selectedIndex?: number; /** - * Called when the user selects a new segment + * Called when the user selects a new segment. */ change: (selectedIndex: number, isSelected: boolean) => void; } @@ -7809,9 +8517,6 @@ declare namespace Electron { finalUpdate: boolean; } - interface Headers { - } - interface MediaFlags { /** * Whether the media element has crashed. @@ -7847,11 +8552,6 @@ declare namespace Electron { canRotate: boolean; } - interface Normal { - width: number; - height: number; - } - interface Options { } @@ -7911,6 +8611,15 @@ declare namespace Electron { * session. */ partition?: string; + /** + * When specified, web pages with the same affinity will run in the same renderer + * process. Note that due to reusing the renderer process, certain webPreferences + * options will also be shared between the web pages even when you specified + * different values for them, including but not limited to preload, sandbox and + * nodeIntegration. So it is suggested to use exact same webPreferences for web + * pages with the same affinity. + */ + affinity?: string; /** * The default zoom factor of the page, 3.0 represents 300%. Default is 1.0. */ @@ -7994,7 +8703,7 @@ declare namespace Electron { defaultEncoding?: string; /** * Whether to throttle animations and timers when the page becomes background. This - * also affects the [Page Visibility API][#page-visibility]. Defaults to true. + * also affects the . Defaults to true. */ backgroundThrottling?: boolean; /** @@ -8031,6 +8740,12 @@ declare namespace Electron { * alter the 's initial settings. */ webviewTag?: boolean; + /** + * A list of strings that will be appended to process.argv in the renderer process + * of this app. Useful for passing small bits of data down to renderer process + * preload scripts. + */ + additionArguments?: string[]; } interface DefaultFontFamily { @@ -8108,6 +8823,7 @@ declare namespace NodeJS { // Docs: http://electron.atom.io/docs/api/process + // ### BEGIN VSCODE MODIFICATION ### // /** // * Emitted when Electron has loaded its internal initialization script and is // * beginning to load the web page or the main script. It can be used by the preload @@ -8118,6 +8834,8 @@ declare namespace NodeJS { // once(event: 'loaded', listener: Function): this; // addListener(event: 'loaded', listener: Function): this; // removeListener(event: 'loaded', listener: Function): this; + // ### END VSCODE MODIFICATION ### + /** * Causes the main thread of the current process crash. */ @@ -8160,8 +8878,8 @@ declare namespace NodeJS { noAsar?: boolean; /** * A Boolean that controls whether or not deprecation warnings are printed to - * stderr. Setting this to true will silence deprecation warnings. This property - * is used instead of the --no-deprecation command line flag. + * stderr. Setting this to true will silence deprecation warnings. This property is + * used instead of the --no-deprecation command line flag. */ noDeprecation?: boolean; /** @@ -8170,21 +8888,21 @@ declare namespace NodeJS { resourcesPath?: string; /** * A Boolean that controls whether or not deprecation warnings will be thrown as - * exceptions. Setting this to true will throw errors for deprecations. This + * exceptions. Setting this to true will throw errors for deprecations. This * property is used instead of the --throw-deprecation command line flag. */ throwDeprecation?: boolean; /** * A Boolean that controls whether or not deprecations printed to stderr include - * their stack trace. Setting this to true will print stack traces for + * their stack trace. Setting this to true will print stack traces for * deprecations. This property is instead of the --trace-deprecation command line * flag. */ traceDeprecation?: boolean; /** * A Boolean that controls whether or not process warnings printed to stderr - * include their stack trace. Setting this to true will print stack traces for - * process warnings (including deprecations). This property is instead of the + * include their stack trace. Setting this to true will print stack traces for + * process warnings (including deprecations). This property is instead of the * --trace-warnings command line flag. */ traceProcessWarnings?: boolean; diff --git a/src/typings/globals/core-js/index.d.ts b/src/typings/globals/core-js/index.d.ts index 4d157729c4..be5fd8f2c5 100644 --- a/src/typings/globals/core-js/index.d.ts +++ b/src/typings/globals/core-js/index.d.ts @@ -1,6 +1,6 @@ // Generated by typings // Source: https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/3c56e866d6edd234416a92c3d35c15ccd7fe6b72/core-js/index.d.ts -declare type PropertyKey = string | number | symbol; +//declare type PropertyKey = string | number | symbol; // ############################################################################################# // ECMAScript 6: Object & Function diff --git a/src/typings/node-pty.d.ts b/src/typings/node-pty.d.ts index e3ee561a60..7777af0fc2 100644 --- a/src/typings/node-pty.d.ts +++ b/src/typings/node-pty.d.ts @@ -1,5 +1,5 @@ /** - * Copyright (c) 2017, Daniel Imms (MIT License). + * Copyright (c) 2017, Daniel Imms (Source EULA). */ declare module 'node-pty' { diff --git a/src/typings/node.d.ts b/src/typings/node.d.ts index 1b6661edd7..b8e246d1ec 100644 --- a/src/typings/node.d.ts +++ b/src/typings/node.d.ts @@ -1,41 +1,67 @@ -// Type definitions for Node.js v7.x +// Type definitions for Node.js 8.9.x // Project: http://nodejs.org/ // Definitions by: Microsoft TypeScript // DefinitelyTyped // Parambir Singh -// Roberto Desideri // Christian Vaagland Tellnes // Wilco Bakker -// Daniel Imms +// Nicolas Voigt +// Chigozirim C. +// Flarna +// Mariusz Wiktorczyk +// wwwy3y3 +// Deividas Bakanas +// Kelvin Jin +// Alvis HT Tang +// Sebastian Silbermann +// Hannes Magnusson +// Alberto Schiabel +// Huw +// Nicolas Even +// Bruno Scheufler +// Hoàng Văn Khải +// Lishude +// Andrew Makarov // Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped +// TypeScript Version: 2.1 -/************************************************ -* * -* Node.js v7.x API * -* * -************************************************/ +// ### BEGIN VSCODE MODIFICATION ### +// /** inspector module types */ +// /// +// ### BEGIN VSCODE MODIFICATION ### // This needs to be global to avoid TS2403 in case lib.dom.d.ts is present in the same build interface Console { - Console: NodeJS.ConsoleConstructor; - assert(value: any, message?: string, ...optionalParams: any[]): void; - dir(obj: any, options?: NodeJS.InspectOptions): void; - error(message?: any, ...optionalParams: any[]): void; - info(message?: any, ...optionalParams: any[]): void; - log(message?: any, ...optionalParams: any[]): void; - time(label: string): void; - timeEnd(label: string): void; - trace(message?: any, ...optionalParams: any[]): void; - warn(message?: any, ...optionalParams: any[]): void; + Console: NodeJS.ConsoleConstructor; + assert(value: any, message?: string, ...optionalParams: any[]): void; + dir(obj: any, options?: NodeJS.InspectOptions): void; + debug(message?: any, ...optionalParams: any[]): void; + error(message?: any, ...optionalParams: any[]): void; + info(message?: any, ...optionalParams: any[]): void; + log(message?: any, ...optionalParams: any[]): void; + time(label: string): void; + timeEnd(label: string): void; + trace(message?: any, ...optionalParams: any[]): void; + warn(message?: any, ...optionalParams: any[]): void; } interface Error { - stack?: string; + stack?: string; } +// Declare "static" methods in Error interface ErrorConstructor { - captureStackTrace(targetObject: Object, constructorOpt?: Function): void; - stackTraceLimit: number; + /** Create .stack property on a target object */ + captureStackTrace(targetObject: Object, constructorOpt?: Function): void; + + /** + * Optional override for formatting stack traces + * + * @see https://github.com/v8/v8/wiki/Stack%20Trace%20API#customizing-stack-traces + */ + prepareStackTrace?: (err: Error, stackTraces: NodeJS.CallSite[]) => any; + + stackTraceLimit: number; } // compat for TypeScript 1.8 @@ -49,55 +75,90 @@ interface WeakSetConstructor { } // Forward-declare needed types from lib.es2015.d.ts (in case users are using `--lib es5`) interface Iterable { } interface Iterator { - next(value?: any): IteratorResult; + next(value?: any): IteratorResult; } interface IteratorResult { } interface SymbolConstructor { - readonly iterator: symbol; + readonly iterator: symbol; } declare var Symbol: SymbolConstructor; +// Node.js ESNEXT support +interface String { + /** Removes whitespace from the left end of a string. */ + trimLeft(): string; + /** Removes whitespace from the right end of a string. */ + trimRight(): string; +} + /************************************************ * * * GLOBAL * * * ************************************************/ declare var process: NodeJS.Process; -declare var global: any; +declare var global: NodeJS.Global; declare var console: Console; -// Don't use these!! :) +// ### BEGIN VSCODE MODIFICATION ### // declare var __filename: string; // declare var __dirname: string; // declare function setTimeout(callback: (...args: any[]) => void, ms: number, ...args: any[]): NodeJS.Timer; +// declare namespace setTimeout { +// export function __promisify__(ms: number): Promise; +// export function __promisify__(ms: number, value: T): Promise; +// } // declare function clearTimeout(timeoutId: NodeJS.Timer): void; // declare function setInterval(callback: (...args: any[]) => void, ms: number, ...args: any[]): NodeJS.Timer; // declare function clearInterval(intervalId: NodeJS.Timer): void; +// ### END VSCODE MODIFICATION ### + declare function setImmediate(callback: (...args: any[]) => void, ...args: any[]): any; +declare namespace setImmediate { + export function __promisify__(): Promise; + export function __promisify__(value: T): Promise; +} declare function clearImmediate(immediateId: any): void; +// TODO: change to `type NodeRequireFunction = (id: string) => any;` in next mayor version. interface NodeRequireFunction { - (id: string): any; + /* tslint:disable-next-line:callable-types */ + (id: string): any; } +// ### BEGIN VSCODE MODIFICATION ### // interface NodeRequire extends NodeRequireFunction { -// resolve(id: string): string; +// resolve: RequireResolve; // cache: any; -// extensions: any; +// extensions: NodeExtensions; // main: NodeModule | undefined; // } +// interface RequireResolve { +// (id: string, options?: { paths?: string[]; }): string; +// paths(request: string): string[] | null; +// } + +// interface NodeExtensions { +// '.js': (m: NodeModule, filename: string) => any; +// '.json': (m: NodeModule, filename: string) => any; +// '.node': (m: NodeModule, filename: string) => any; +// [ext: string]: (m: NodeModule, filename: string) => any; +// } + // declare var require: NodeRequire; +// ### END VSCODE MODIFICATION ### interface NodeModule { - exports: any; - require: NodeRequireFunction; - id: string; - filename: string; - loaded: boolean; - parent: NodeModule | null; - children: NodeModule[]; + exports: any; + require: NodeRequireFunction; + id: string; + filename: string; + loaded: boolean; + parent: NodeModule | null; + children: NodeModule[]; + paths: string[]; } declare var module: NodeModule; @@ -105,17 +166,16 @@ declare var module: NodeModule; // Same as module.exports declare var exports: any; declare var SlowBuffer: { - new(str: string, encoding?: string): Buffer; - new(size: number): Buffer; - new(size: Uint8Array): Buffer; - new(array: any[]): Buffer; - prototype: Buffer; - isBuffer(obj: any): boolean; - byteLength(string: string, encoding?: string): number; - concat(list: Buffer[], totalLength?: number): Buffer; + new(str: string, encoding?: string): Buffer; + new(size: number): Buffer; + new(size: Uint8Array): Buffer; + new(array: any[]): Buffer; + prototype: Buffer; + isBuffer(obj: any): boolean; + byteLength(string: string, encoding?: string): number; + concat(list: Buffer[], totalLength?: number): Buffer; }; - // Buffer class type BufferEncoding = "ascii" | "utf8" | "utf16le" | "ucs2" | "base64" | "latin1" | "binary" | "hex"; interface Buffer extends NodeBuffer { } @@ -132,19 +192,19 @@ declare var Buffer: { * @param str String to store in buffer. * @param encoding encoding to use, optional. Default is 'utf8' */ - new(str: string, encoding?: string): Buffer; + new(str: string, encoding?: string): Buffer; /** * Allocates a new buffer of {size} octets. * * @param size count of octets to allocate. */ - new(size: number): Buffer; + new(size: number): Buffer; /** * Allocates a new buffer containing the given {array} of octets. * * @param array The octets to store. */ - new(array: Uint8Array): Buffer; + new(array: Uint8Array): Buffer; /** * Produces a Buffer backed by the same allocated memory as * the given {ArrayBuffer}. @@ -152,26 +212,20 @@ declare var Buffer: { * * @param arrayBuffer The ArrayBuffer with which to share memory. */ - new(arrayBuffer: ArrayBuffer): Buffer; + new(arrayBuffer: ArrayBuffer): Buffer; /** * Allocates a new buffer containing the given {array} of octets. * * @param array The octets to store. */ - new(array: any[]): Buffer; + new(array: any[]): Buffer; /** * Copies the passed {buffer} data onto a new {Buffer} instance. * * @param buffer The buffer to copy. */ - new(buffer: Buffer): Buffer; - prototype: Buffer; - /** - * Allocates a new Buffer using an {array} of octets. - * - * @param array - */ - from(array: any[]): Buffer; + new(buffer: Buffer): Buffer; + prototype: Buffer; /** * When passed a reference to the .buffer property of a TypedArray instance, * the newly created Buffer will share the same allocated memory as the TypedArray. @@ -179,45 +233,40 @@ declare var Buffer: { * within the {arrayBuffer} that will be shared by the Buffer. * * @param arrayBuffer The .buffer property of a TypedArray or a new ArrayBuffer() - * @param byteOffset - * @param length */ - from(arrayBuffer: ArrayBuffer, byteOffset?: number, length?: number): Buffer; + from(arrayBuffer: ArrayBuffer, byteOffset?: number, length?: number): Buffer; /** - * Copies the passed {buffer} data onto a new Buffer instance. - * - * @param buffer + * Creates a new Buffer using the passed {data} + * @param data data to create a new Buffer */ - from(buffer: Buffer): Buffer; + from(data: any[] | string | Buffer | ArrayBuffer /*| TypedArray*/): Buffer; /** * Creates a new Buffer containing the given JavaScript string {str}. * If provided, the {encoding} parameter identifies the character encoding. * If not provided, {encoding} defaults to 'utf8'. - * - * @param str */ - from(str: string, encoding?: string): Buffer; + from(str: string, encoding?: string): Buffer; /** * Returns true if {obj} is a Buffer * * @param obj object to test. */ - isBuffer(obj: any): obj is Buffer; + isBuffer(obj: any): obj is Buffer; /** * Returns true if {encoding} is a valid encoding argument. * Valid string encodings in Node 0.12: 'ascii'|'utf8'|'utf16le'|'ucs2'(alias of 'utf16le')|'base64'|'binary'(deprecated)|'hex' * * @param encoding string to test. */ - isEncoding(encoding: string): boolean; + isEncoding(encoding: string): boolean; /** * Gives the actual byte length of a string. encoding defaults to 'utf8'. * This is not the same as String.prototype.length since that returns the number of characters in a string. * - * @param string string to test. + * @param string string to test. (TypedArray is also allowed, but it is only available starting ES2017) * @param encoding encoding used to evaluate (defaults to 'utf8') */ - byteLength(string: string, encoding?: string): number; + byteLength(string: string | Buffer | DataView | ArrayBuffer, encoding?: string): number; /** * Returns a buffer which is the result of concatenating all the buffers in the list together. * @@ -229,11 +278,11 @@ declare var Buffer: { * @param totalLength Total length of the buffers when concatenated. * If totalLength is not provided, it is read from the buffers in the list. However, this adds an additional loop to the function, so it is faster to provide the length explicitly. */ - concat(list: Buffer[], totalLength?: number): Buffer; + concat(list: Buffer[], totalLength?: number): Buffer; /** * The same as buf1.compare(buf2). */ - compare(buf1: Buffer, buf2: Buffer): number; + compare(buf1: Buffer, buf2: Buffer): number; /** * Allocates a new buffer of {size} octets. * @@ -242,21 +291,25 @@ declare var Buffer: { * If parameter is omitted, buffer will be filled with zeros. * @param encoding encoding used for call to buf.fill while initalizing */ - alloc(size: number, fill?: string | Buffer | number, encoding?: string): Buffer; + alloc(size: number, fill?: string | Buffer | number, encoding?: string): Buffer; /** * Allocates a new buffer of {size} octets, leaving memory not initialized, so the contents * of the newly created Buffer are unknown and may contain sensitive data. * * @param size count of octets to allocate */ - allocUnsafe(size: number): Buffer; + allocUnsafe(size: number): Buffer; /** * Allocates a new non-pooled buffer of {size} octets, leaving memory not initialized, so the contents * of the newly created Buffer are unknown and may contain sensitive data. * * @param size count of octets to allocate */ - allocUnsafeSlow(size: number): Buffer; + allocUnsafeSlow(size: number): Buffer; + /** + * This is the number of bytes used to determine the size of pre-allocated, internal Buffer instances used for pooling. This value may be modified. + */ + poolSize: number; }; /************************************************ @@ -265,273 +318,506 @@ declare var Buffer: { * * ************************************************/ declare namespace NodeJS { - export interface InspectOptions { - showHidden?: boolean; - depth?: number | null; - colors?: boolean; - customInspect?: boolean; - showProxy?: boolean; - maxArrayLength?: number | null; - breakLength?: number; - } + export interface InspectOptions { + showHidden?: boolean; + depth?: number | null; + colors?: boolean; + customInspect?: boolean; + showProxy?: boolean; + maxArrayLength?: number | null; + breakLength?: number; + } - export interface ConsoleConstructor { - prototype: Console; - new(stdout: WritableStream, stderr?: WritableStream): Console; - } + export interface ConsoleConstructor { + prototype: Console; + new(stdout: WritableStream, stderr?: WritableStream): Console; + } - export interface ErrnoException extends Error { - errno?: number; - code?: string; - path?: string; - syscall?: string; - stack?: string; - } + export interface CallSite { + /** + * Value of "this" + */ + getThis(): any; - export class EventEmitter { - addListener(event: string | symbol, listener: Function): this; - on(event: string | symbol, listener: Function): this; - once(event: string | symbol, listener: Function): this; - removeListener(event: string | symbol, listener: Function): this; - removeAllListeners(event?: string | symbol): this; - setMaxListeners(n: number): this; - getMaxListeners(): number; - listeners(event: string | symbol): Function[]; - emit(event: string | symbol, ...args: any[]): boolean; - listenerCount(type: string | symbol): number; - // Added in Node 6... - prependListener(event: string | symbol, listener: Function): this; - prependOnceListener(event: string | symbol, listener: Function): this; - eventNames(): (string | symbol)[]; - } + /** + * Type of "this" as a string. + * This is the name of the function stored in the constructor field of + * "this", if available. Otherwise the object's [[Class]] internal + * property. + */ + getTypeName(): string | null; - export interface ReadableStream extends EventEmitter { - readable: boolean; - read(size?: number): string | Buffer; - setEncoding(encoding: string | null): this; - pause(): this; - resume(): this; - isPaused(): boolean; - pipe(destination: T, options?: { end?: boolean; }): T; - unpipe(destination?: T): this; - unshift(chunk: string): void; - unshift(chunk: Buffer): void; - wrap(oldStream: ReadableStream): ReadableStream; - } + /** + * Current function + */ + getFunction(): Function | undefined; - export interface WritableStream extends EventEmitter { - writable: boolean; - write(buffer: Buffer | string, cb?: Function): boolean; - write(str: string, encoding?: string, cb?: Function): boolean; - end(): void; - end(buffer: Buffer, cb?: Function): void; - end(str: string, cb?: Function): void; - end(str: string, encoding?: string, cb?: Function): void; - } + /** + * Name of the current function, typically its name property. + * If a name property is not available an attempt will be made to try + * to infer a name from the function's context. + */ + getFunctionName(): string | null; - export interface ReadWriteStream extends ReadableStream, WritableStream { } + /** + * Name of the property [of "this" or one of its prototypes] that holds + * the current function + */ + getMethodName(): string | null; - export interface Events extends EventEmitter { } + /** + * Name of the script [if this function was defined in a script] + */ + getFileName(): string | null; - export interface Domain extends Events { - run(fn: Function): void; - add(emitter: Events): void; - remove(emitter: Events): void; - bind(cb: (err: Error, data: any) => any): any; - intercept(cb: (data: any) => any): any; - dispose(): void; + /** + * Current line number [if this function was defined in a script] + */ + getLineNumber(): number | null; - addListener(event: string, listener: Function): this; - on(event: string, listener: Function): this; - once(event: string, listener: Function): this; - removeListener(event: string, listener: Function): this; - removeAllListeners(event?: string): this; - } + /** + * Current column number [if this function was defined in a script] + */ + getColumnNumber(): number | null; - export interface MemoryUsage { - rss: number; - heapTotal: number; - heapUsed: number; - } + /** + * A call site object representing the location where eval was called + * [if this function was created using a call to eval] + */ + getEvalOrigin(): string | undefined; - export interface CpuUsage { - user: number; - system: number; - } + /** + * Is this a toplevel invocation, that is, is "this" the global object? + */ + isToplevel(): boolean; - export interface ProcessVersions { - http_parser: string; - node: string; - v8: string; - ares: string; - uv: string; - zlib: string; - modules: string; - openssl: string; - } + /** + * Does this call take place in code defined by a call to eval? + */ + isEval(): boolean; - type Platform = 'aix' - | 'android' - | 'darwin' - | 'freebsd' - | 'linux' - | 'openbsd' - | 'sunos' - | 'win32'; + /** + * Is this call in native V8 code? + */ + isNative(): boolean; - export interface Socket extends ReadWriteStream { - isTTY?: true; - } + /** + * Is this a constructor call? + */ + isConstructor(): boolean; + } - export interface WriteStream extends Socket { - columns?: number; - rows?: number; - } - export interface ReadStream extends Socket { - isRaw?: boolean; - setRawMode?(mode: boolean): void; - } + export interface ErrnoException extends Error { + errno?: number; + code?: string; + path?: string; + syscall?: string; + stack?: string; + } - export interface Process extends EventEmitter { - stdout: WriteStream; - stderr: WriteStream; - stdin: ReadStream; - openStdin(): Socket; - argv: string[]; - argv0: string; - execArgv: string[]; - execPath: string; - abort(): void; - chdir(directory: string): void; - cwd(): string; - emitWarning(warning: string | Error, name?: string, ctor?: Function): void; - env: any; - exit(code?: number): void; - exitCode: number; - getgid(): number; - setgid(id: number): void; - setgid(id: string): void; - getuid(): number; - setuid(id: number): void; - setuid(id: string): void; - version: string; - versions: ProcessVersions; - config: { - target_defaults: { - cflags: any[]; - default_configuration: string; - defines: string[]; - include_dirs: string[]; - libraries: string[]; - }; - variables: { - clang: number; - host_arch: string; - node_install_npm: boolean; - node_install_waf: boolean; - node_prefix: string; - node_shared_openssl: boolean; - node_shared_v8: boolean; - node_shared_zlib: boolean; - node_use_dtrace: boolean; - node_use_etw: boolean; - node_use_openssl: boolean; - target_arch: string; - v8_no_strict_aliasing: number; - v8_use_snapshot: boolean; - visibility: string; - }; - }; - kill(pid: number, signal?: string | number): void; - pid: number; - title: string; - arch: string; - platform: Platform; - mainModule?: NodeModule; - memoryUsage(): MemoryUsage; - cpuUsage(previousValue?: CpuUsage): CpuUsage; - nextTick(callback: Function, ...args: any[]): void; - umask(mask?: number): number; - uptime(): number; - hrtime(time?: [number, number]): [number, number]; - domain: Domain; + export class EventEmitter { + addListener(event: string | symbol, listener: (...args: any[]) => void): this; + on(event: string | symbol, listener: (...args: any[]) => void): this; + once(event: string | symbol, listener: (...args: any[]) => void): this; + removeListener(event: string | symbol, listener: (...args: any[]) => void): this; + removeAllListeners(event?: string | symbol): this; + setMaxListeners(n: number): this; + getMaxListeners(): number; + listeners(event: string | symbol): Function[]; + emit(event: string | symbol, ...args: any[]): boolean; + listenerCount(type: string | symbol): number; + // Added in Node 6... + prependListener(event: string | symbol, listener: (...args: any[]) => void): this; + prependOnceListener(event: string | symbol, listener: (...args: any[]) => void): this; + eventNames(): Array; + } - // Worker - send?(message: any, sendHandle?: any): void; - disconnect(): void; - connected: boolean; - } + export interface ReadableStream extends EventEmitter { + readable: boolean; + read(size?: number): string | Buffer; + setEncoding(encoding: string): this; + pause(): this; + resume(): this; + isPaused(): boolean; + pipe(destination: T, options?: { end?: boolean; }): T; + unpipe(destination?: T): this; + unshift(chunk: string): void; + unshift(chunk: Buffer): void; + wrap(oldStream: ReadableStream): this; + } - export interface Global { - Array: typeof Array; - ArrayBuffer: typeof ArrayBuffer; - Boolean: typeof Boolean; - Buffer: typeof Buffer; - DataView: typeof DataView; - Date: typeof Date; - Error: typeof Error; - EvalError: typeof EvalError; - Float32Array: typeof Float32Array; - Float64Array: typeof Float64Array; - Function: typeof Function; - GLOBAL: Global; - Infinity: typeof Infinity; - Int16Array: typeof Int16Array; - Int32Array: typeof Int32Array; - Int8Array: typeof Int8Array; - Intl: typeof Intl; - JSON: typeof JSON; - Map: MapConstructor; - Math: typeof Math; - NaN: typeof NaN; - Number: typeof Number; - Object: typeof Object; - Promise: Function; - RangeError: typeof RangeError; - ReferenceError: typeof ReferenceError; - RegExp: typeof RegExp; - Set: SetConstructor; - String: typeof String; - Symbol: Function; - SyntaxError: typeof SyntaxError; - TypeError: typeof TypeError; - URIError: typeof URIError; - Uint16Array: typeof Uint16Array; - Uint32Array: typeof Uint32Array; - Uint8Array: typeof Uint8Array; - Uint8ClampedArray: Function; - WeakMap: WeakMapConstructor; - WeakSet: WeakSetConstructor; - clearImmediate: (immediateId: any) => void; - clearInterval: (intervalId: NodeJS.Timer) => void; - clearTimeout: (timeoutId: NodeJS.Timer) => void; - console: typeof console; - decodeURI: typeof decodeURI; - decodeURIComponent: typeof decodeURIComponent; - encodeURI: typeof encodeURI; - encodeURIComponent: typeof encodeURIComponent; - escape: (str: string) => string; - eval: typeof eval; - global: Global; - isFinite: typeof isFinite; - isNaN: typeof isNaN; - parseFloat: typeof parseFloat; - parseInt: typeof parseInt; - process: Process; - root: Global; - setImmediate: (callback: (...args: any[]) => void, ...args: any[]) => any; - setInterval: (callback: (...args: any[]) => void, ms: number, ...args: any[]) => NodeJS.Timer; - setTimeout: (callback: (...args: any[]) => void, ms: number, ...args: any[]) => NodeJS.Timer; - undefined: typeof undefined; - unescape: (str: string) => string; - gc: () => void; - v8debug?: any; - } + export interface WritableStream extends EventEmitter { + writable: boolean; + write(buffer: Buffer | string, cb?: Function): boolean; + write(str: string, encoding?: string, cb?: Function): boolean; + end(cb?: Function): void; + end(buffer: Buffer, cb?: Function): void; + end(str: string, cb?: Function): void; + end(str: string, encoding?: string, cb?: Function): void; + } - export interface Timer { - ref(): void; - unref(): void; - } + export interface ReadWriteStream extends ReadableStream, WritableStream { } + + export interface Events extends EventEmitter { } + + export interface Domain extends Events { + run(fn: Function): void; + add(emitter: Events): void; + remove(emitter: Events): void; + bind(cb: (err: Error, data: any) => any): any; + intercept(cb: (data: any) => any): any; + dispose(): void; + + addListener(event: string, listener: (...args: any[]) => void): this; + on(event: string, listener: (...args: any[]) => void): this; + once(event: string, listener: (...args: any[]) => void): this; + removeListener(event: string, listener: (...args: any[]) => void): this; + removeAllListeners(event?: string): this; + } + + export interface MemoryUsage { + rss: number; + heapTotal: number; + heapUsed: number; + external: number; + } + + export interface CpuUsage { + user: number; + system: number; + } + + export interface ProcessVersions { + http_parser: string; + node: string; + v8: string; + ares: string; + uv: string; + zlib: string; + modules: string; + openssl: string; + } + + type Platform = 'aix' + | 'android' + | 'darwin' + | 'freebsd' + | 'linux' + | 'openbsd' + | 'sunos' + | 'win32' + | 'cygwin'; + + type Signals = + "SIGABRT" | "SIGALRM" | "SIGBUS" | "SIGCHLD" | "SIGCONT" | "SIGFPE" | "SIGHUP" | "SIGILL" | "SIGINT" | "SIGIO" | + "SIGIOT" | "SIGKILL" | "SIGPIPE" | "SIGPOLL" | "SIGPROF" | "SIGPWR" | "SIGQUIT" | "SIGSEGV" | "SIGSTKFLT" | + "SIGSTOP" | "SIGSYS" | "SIGTERM" | "SIGTRAP" | "SIGTSTP" | "SIGTTIN" | "SIGTTOU" | "SIGUNUSED" | "SIGURG" | + "SIGUSR1" | "SIGUSR2" | "SIGVTALRM" | "SIGWINCH" | "SIGXCPU" | "SIGXFSZ" | "SIGBREAK" | "SIGLOST" | "SIGINFO"; + + type BeforeExitListener = (code: number) => void; + type DisconnectListener = () => void; + type ExitListener = (code: number) => void; + type RejectionHandledListener = (promise: Promise) => void; + type UncaughtExceptionListener = (error: Error) => void; + type UnhandledRejectionListener = (reason: any, promise: Promise) => void; + type WarningListener = (warning: Error) => void; + type MessageListener = (message: any, sendHandle: any) => void; + type SignalsListener = () => void; + type NewListenerListener = (type: string | symbol, listener: (...args: any[]) => void) => void; + type RemoveListenerListener = (type: string | symbol, listener: (...args: any[]) => void) => void; + + export interface Socket extends ReadWriteStream { + isTTY?: true; + } + + export interface ProcessEnv { + [key: string]: string | undefined; + } + + export interface WriteStream extends Socket { + readonly writableHighWaterMark: number; + columns?: number; + rows?: number; + _write(chunk: any, encoding: string, callback: Function): void; + _destroy(err: Error, callback: Function): void; + _final(callback: Function): void; + setDefaultEncoding(encoding: string): this; + cork(): void; + uncork(): void; + destroy(error?: Error): void; + } + export interface ReadStream extends Socket { + readonly readableHighWaterMark: number; + isRaw?: boolean; + setRawMode?(mode: boolean): void; + _read(size: number): void; + _destroy(err: Error, callback: Function): void; + push(chunk: any, encoding?: string): boolean; + destroy(error?: Error): void; + } + + export interface Process extends EventEmitter { + stdout: WriteStream; + stderr: WriteStream; + stdin: ReadStream; + openStdin(): Socket; + argv: string[]; + argv0: string; + execArgv: string[]; + execPath: string; + abort(): void; + chdir(directory: string): void; + cwd(): string; + debugPort: number; + emitWarning(warning: string | Error, name?: string, ctor?: Function): void; + env: ProcessEnv; + exit(code?: number): never; + exitCode: number; + getgid(): number; + setgid(id: number | string): void; + getuid(): number; + setuid(id: number | string): void; + geteuid(): number; + seteuid(id: number | string): void; + getegid(): number; + setegid(id: number | string): void; + getgroups(): number[]; + setgroups(groups: Array): void; + version: string; + versions: ProcessVersions; + config: { + target_defaults: { + cflags: any[]; + default_configuration: string; + defines: string[]; + include_dirs: string[]; + libraries: string[]; + }; + variables: { + clang: number; + host_arch: string; + node_install_npm: boolean; + node_install_waf: boolean; + node_prefix: string; + node_shared_openssl: boolean; + node_shared_v8: boolean; + node_shared_zlib: boolean; + node_use_dtrace: boolean; + node_use_etw: boolean; + node_use_openssl: boolean; + target_arch: string; + v8_no_strict_aliasing: number; + v8_use_snapshot: boolean; + visibility: string; + }; + }; + kill(pid: number, signal?: string | number): void; + pid: number; + title: string; + arch: string; + platform: Platform; + mainModule?: NodeModule; + memoryUsage(): MemoryUsage; + cpuUsage(previousValue?: CpuUsage): CpuUsage; + nextTick(callback: Function, ...args: any[]): void; + umask(mask?: number): number; + uptime(): number; + hrtime(time?: [number, number]): [number, number]; + domain: Domain; + + // Worker + send?(message: any, sendHandle?: any): void; + disconnect(): void; + connected: boolean; + + /** + * EventEmitter + * 1. beforeExit + * 2. disconnect + * 3. exit + * 4. message + * 5. rejectionHandled + * 6. uncaughtException + * 7. unhandledRejection + * 8. warning + * 9. message + * 10. + * 11. newListener/removeListener inherited from EventEmitter + */ + addListener(event: "beforeExit", listener: BeforeExitListener): this; + addListener(event: "disconnect", listener: DisconnectListener): this; + addListener(event: "exit", listener: ExitListener): this; + addListener(event: "rejectionHandled", listener: RejectionHandledListener): this; + addListener(event: "uncaughtException", listener: UncaughtExceptionListener): this; + addListener(event: "unhandledRejection", listener: UnhandledRejectionListener): this; + addListener(event: "warning", listener: WarningListener): this; + addListener(event: "message", listener: MessageListener): this; + addListener(event: Signals, listener: SignalsListener): this; + addListener(event: "newListener", listener: NewListenerListener): this; + addListener(event: "removeListener", listener: RemoveListenerListener): this; + + emit(event: "beforeExit", code: number): boolean; + emit(event: "disconnect"): boolean; + emit(event: "exit", code: number): boolean; + emit(event: "rejectionHandled", promise: Promise): boolean; + emit(event: "uncaughtException", error: Error): boolean; + emit(event: "unhandledRejection", reason: any, promise: Promise): boolean; + emit(event: "warning", warning: Error): boolean; + emit(event: "message", message: any, sendHandle: any): this; + emit(event: Signals): boolean; + emit(event: "newListener", eventName: string | symbol, listener: (...args: any[]) => void): this; + emit(event: "removeListener", eventName: string, listener: (...args: any[]) => void): this; + + on(event: "beforeExit", listener: BeforeExitListener): this; + on(event: "disconnect", listener: DisconnectListener): this; + on(event: "exit", listener: ExitListener): this; + on(event: "rejectionHandled", listener: RejectionHandledListener): this; + on(event: "uncaughtException", listener: UncaughtExceptionListener): this; + on(event: "unhandledRejection", listener: UnhandledRejectionListener): this; + on(event: "warning", listener: WarningListener): this; + on(event: "message", listener: MessageListener): this; + on(event: Signals, listener: SignalsListener): this; + on(event: "newListener", listener: NewListenerListener): this; + on(event: "removeListener", listener: RemoveListenerListener): this; + + once(event: "beforeExit", listener: BeforeExitListener): this; + once(event: "disconnect", listener: DisconnectListener): this; + once(event: "exit", listener: ExitListener): this; + once(event: "rejectionHandled", listener: RejectionHandledListener): this; + once(event: "uncaughtException", listener: UncaughtExceptionListener): this; + once(event: "unhandledRejection", listener: UnhandledRejectionListener): this; + once(event: "warning", listener: WarningListener): this; + once(event: "message", listener: MessageListener): this; + once(event: Signals, listener: SignalsListener): this; + once(event: "newListener", listener: NewListenerListener): this; + once(event: "removeListener", listener: RemoveListenerListener): this; + + prependListener(event: "beforeExit", listener: BeforeExitListener): this; + prependListener(event: "disconnect", listener: DisconnectListener): this; + prependListener(event: "exit", listener: ExitListener): this; + prependListener(event: "rejectionHandled", listener: RejectionHandledListener): this; + prependListener(event: "uncaughtException", listener: UncaughtExceptionListener): this; + prependListener(event: "unhandledRejection", listener: UnhandledRejectionListener): this; + prependListener(event: "warning", listener: WarningListener): this; + prependListener(event: "message", listener: MessageListener): this; + prependListener(event: Signals, listener: SignalsListener): this; + prependListener(event: "newListener", listener: NewListenerListener): this; + prependListener(event: "removeListener", listener: RemoveListenerListener): this; + + prependOnceListener(event: "beforeExit", listener: BeforeExitListener): this; + prependOnceListener(event: "disconnect", listener: DisconnectListener): this; + prependOnceListener(event: "exit", listener: ExitListener): this; + prependOnceListener(event: "rejectionHandled", listener: RejectionHandledListener): this; + prependOnceListener(event: "uncaughtException", listener: UncaughtExceptionListener): this; + prependOnceListener(event: "unhandledRejection", listener: UnhandledRejectionListener): this; + prependOnceListener(event: "warning", listener: WarningListener): this; + prependOnceListener(event: "message", listener: MessageListener): this; + prependOnceListener(event: Signals, listener: SignalsListener): this; + prependOnceListener(event: "newListener", listener: NewListenerListener): this; + prependOnceListener(event: "removeListener", listener: RemoveListenerListener): this; + + listeners(event: "beforeExit"): BeforeExitListener[]; + listeners(event: "disconnect"): DisconnectListener[]; + listeners(event: "exit"): ExitListener[]; + listeners(event: "rejectionHandled"): RejectionHandledListener[]; + listeners(event: "uncaughtException"): UncaughtExceptionListener[]; + listeners(event: "unhandledRejection"): UnhandledRejectionListener[]; + listeners(event: "warning"): WarningListener[]; + listeners(event: "message"): MessageListener[]; + listeners(event: Signals): SignalsListener[]; + listeners(event: "newListener"): NewListenerListener[]; + listeners(event: "removeListener"): RemoveListenerListener[]; + } + + export interface Global { + Array: typeof Array; + ArrayBuffer: typeof ArrayBuffer; + Boolean: typeof Boolean; + Buffer: typeof Buffer; + DataView: typeof DataView; + Date: typeof Date; + Error: typeof Error; + EvalError: typeof EvalError; + Float32Array: typeof Float32Array; + Float64Array: typeof Float64Array; + Function: typeof Function; + GLOBAL: Global; + Infinity: typeof Infinity; + Int16Array: typeof Int16Array; + Int32Array: typeof Int32Array; + Int8Array: typeof Int8Array; + Intl: typeof Intl; + JSON: typeof JSON; + Map: MapConstructor; + Math: typeof Math; + NaN: typeof NaN; + Number: typeof Number; + Object: typeof Object; + Promise: Function; + RangeError: typeof RangeError; + ReferenceError: typeof ReferenceError; + RegExp: typeof RegExp; + Set: SetConstructor; + String: typeof String; + Symbol: Function; + SyntaxError: typeof SyntaxError; + TypeError: typeof TypeError; + URIError: typeof URIError; + Uint16Array: typeof Uint16Array; + Uint32Array: typeof Uint32Array; + Uint8Array: typeof Uint8Array; + Uint8ClampedArray: Function; + WeakMap: WeakMapConstructor; + WeakSet: WeakSetConstructor; + clearImmediate: (immediateId: any) => void; + clearInterval: (intervalId: NodeJS.Timer) => void; + clearTimeout: (timeoutId: NodeJS.Timer) => void; + console: typeof console; + decodeURI: typeof decodeURI; + decodeURIComponent: typeof decodeURIComponent; + encodeURI: typeof encodeURI; + encodeURIComponent: typeof encodeURIComponent; + escape: (str: string) => string; + eval: typeof eval; + global: Global; + isFinite: typeof isFinite; + isNaN: typeof isNaN; + parseFloat: typeof parseFloat; + parseInt: typeof parseInt; + process: Process; + root: Global; + setImmediate: (callback: (...args: any[]) => void, ...args: any[]) => any; + setInterval: (callback: (...args: any[]) => void, ms: number, ...args: any[]) => NodeJS.Timer; + setTimeout: (callback: (...args: any[]) => void, ms: number, ...args: any[]) => NodeJS.Timer; + undefined: typeof undefined; + unescape: (str: string) => string; + gc: () => void; + v8debug?: any; + } + + export interface Timer { + ref(): void; + unref(): void; + } + + class Module { + static runMain(): void; + static wrap(code: string): string; + static builtinModules: string[]; + + static Module: typeof Module; + + exports: any; + require: NodeRequireFunction; + id: string; + filename: string; + loaded: boolean; + parent: Module | null; + children: Module[]; + paths: string[]; + + constructor(id: string, parent?: Module); + } } interface IterableIterator { } @@ -540,59 +826,59 @@ interface IterableIterator { } * @deprecated */ interface NodeBuffer extends Uint8Array { - write(string: string, offset?: number, length?: number, encoding?: string): number; - toString(encoding?: string, start?: number, end?: number): string; - toJSON(): { type: 'Buffer', data: any[] }; - equals(otherBuffer: Buffer): boolean; - compare(otherBuffer: Buffer, targetStart?: number, targetEnd?: number, sourceStart?: number, sourceEnd?: number): number; - copy(targetBuffer: Buffer, targetStart?: number, sourceStart?: number, sourceEnd?: number): number; - slice(start?: number, end?: number): Buffer; - writeUIntLE(value: number, offset: number, byteLength: number, noAssert?: boolean): number; - writeUIntBE(value: number, offset: number, byteLength: number, noAssert?: boolean): number; - writeIntLE(value: number, offset: number, byteLength: number, noAssert?: boolean): number; - writeIntBE(value: number, offset: number, byteLength: number, noAssert?: boolean): number; - readUIntLE(offset: number, byteLength: number, noAssert?: boolean): number; - readUIntBE(offset: number, byteLength: number, noAssert?: boolean): number; - readIntLE(offset: number, byteLength: number, noAssert?: boolean): number; - readIntBE(offset: number, byteLength: number, noAssert?: boolean): number; - readUInt8(offset: number, noAssert?: boolean): number; - readUInt16LE(offset: number, noAssert?: boolean): number; - readUInt16BE(offset: number, noAssert?: boolean): number; - readUInt32LE(offset: number, noAssert?: boolean): number; - readUInt32BE(offset: number, noAssert?: boolean): number; - readInt8(offset: number, noAssert?: boolean): number; - readInt16LE(offset: number, noAssert?: boolean): number; - readInt16BE(offset: number, noAssert?: boolean): number; - readInt32LE(offset: number, noAssert?: boolean): number; - readInt32BE(offset: number, noAssert?: boolean): number; - readFloatLE(offset: number, noAssert?: boolean): number; - readFloatBE(offset: number, noAssert?: boolean): number; - readDoubleLE(offset: number, noAssert?: boolean): number; - readDoubleBE(offset: number, noAssert?: boolean): number; - swap16(): Buffer; - swap32(): Buffer; - swap64(): Buffer; - writeUInt8(value: number, offset: number, noAssert?: boolean): number; - writeUInt16LE(value: number, offset: number, noAssert?: boolean): number; - writeUInt16BE(value: number, offset: number, noAssert?: boolean): number; - writeUInt32LE(value: number, offset: number, noAssert?: boolean): number; - writeUInt32BE(value: number, offset: number, noAssert?: boolean): number; - writeInt8(value: number, offset: number, noAssert?: boolean): number; - writeInt16LE(value: number, offset: number, noAssert?: boolean): number; - writeInt16BE(value: number, offset: number, noAssert?: boolean): number; - writeInt32LE(value: number, offset: number, noAssert?: boolean): number; - writeInt32BE(value: number, offset: number, noAssert?: boolean): number; - writeFloatLE(value: number, offset: number, noAssert?: boolean): number; - writeFloatBE(value: number, offset: number, noAssert?: boolean): number; - writeDoubleLE(value: number, offset: number, noAssert?: boolean): number; - writeDoubleBE(value: number, offset: number, noAssert?: boolean): number; - fill(value: any, offset?: number, end?: number): this; - indexOf(value: string | number | Buffer, byteOffset?: number, encoding?: string): number; - lastIndexOf(value: string | number | Buffer, byteOffset?: number, encoding?: string): number; - entries(): IterableIterator<[number, number]>; - includes(value: string | number | Buffer, byteOffset?: number, encoding?: string): boolean; - keys(): IterableIterator; - values(): IterableIterator; + write(string: string, offset?: number, length?: number, encoding?: string): number; + toString(encoding?: string, start?: number, end?: number): string; + toJSON(): { type: 'Buffer', data: any[] }; + equals(otherBuffer: Buffer): boolean; + compare(otherBuffer: Buffer, targetStart?: number, targetEnd?: number, sourceStart?: number, sourceEnd?: number): number; + copy(targetBuffer: Buffer, targetStart?: number, sourceStart?: number, sourceEnd?: number): number; + slice(start?: number, end?: number): Buffer; + writeUIntLE(value: number, offset: number, byteLength: number, noAssert?: boolean): number; + writeUIntBE(value: number, offset: number, byteLength: number, noAssert?: boolean): number; + writeIntLE(value: number, offset: number, byteLength: number, noAssert?: boolean): number; + writeIntBE(value: number, offset: number, byteLength: number, noAssert?: boolean): number; + readUIntLE(offset: number, byteLength: number, noAssert?: boolean): number; + readUIntBE(offset: number, byteLength: number, noAssert?: boolean): number; + readIntLE(offset: number, byteLength: number, noAssert?: boolean): number; + readIntBE(offset: number, byteLength: number, noAssert?: boolean): number; + readUInt8(offset: number, noAssert?: boolean): number; + readUInt16LE(offset: number, noAssert?: boolean): number; + readUInt16BE(offset: number, noAssert?: boolean): number; + readUInt32LE(offset: number, noAssert?: boolean): number; + readUInt32BE(offset: number, noAssert?: boolean): number; + readInt8(offset: number, noAssert?: boolean): number; + readInt16LE(offset: number, noAssert?: boolean): number; + readInt16BE(offset: number, noAssert?: boolean): number; + readInt32LE(offset: number, noAssert?: boolean): number; + readInt32BE(offset: number, noAssert?: boolean): number; + readFloatLE(offset: number, noAssert?: boolean): number; + readFloatBE(offset: number, noAssert?: boolean): number; + readDoubleLE(offset: number, noAssert?: boolean): number; + readDoubleBE(offset: number, noAssert?: boolean): number; + swap16(): Buffer; + swap32(): Buffer; + swap64(): Buffer; + writeUInt8(value: number, offset: number, noAssert?: boolean): number; + writeUInt16LE(value: number, offset: number, noAssert?: boolean): number; + writeUInt16BE(value: number, offset: number, noAssert?: boolean): number; + writeUInt32LE(value: number, offset: number, noAssert?: boolean): number; + writeUInt32BE(value: number, offset: number, noAssert?: boolean): number; + writeInt8(value: number, offset: number, noAssert?: boolean): number; + writeInt16LE(value: number, offset: number, noAssert?: boolean): number; + writeInt16BE(value: number, offset: number, noAssert?: boolean): number; + writeInt32LE(value: number, offset: number, noAssert?: boolean): number; + writeInt32BE(value: number, offset: number, noAssert?: boolean): number; + writeFloatLE(value: number, offset: number, noAssert?: boolean): number; + writeFloatBE(value: number, offset: number, noAssert?: boolean): number; + writeDoubleLE(value: number, offset: number, noAssert?: boolean): number; + writeDoubleBE(value: number, offset: number, noAssert?: boolean): number; + fill(value: any, offset?: number, end?: number): this; + indexOf(value: string | number | Buffer, byteOffset?: number, encoding?: string): number; + lastIndexOf(value: string | number | Buffer, byteOffset?: number, encoding?: string): number; + entries(): IterableIterator<[number, number]>; + includes(value: string | number | Buffer, byteOffset?: number, encoding?: string): boolean; + keys(): IterableIterator; + values(): IterableIterator; } /************************************************ @@ -601,205 +887,271 @@ interface NodeBuffer extends Uint8Array { * * ************************************************/ declare module "buffer" { - export var INSPECT_MAX_BYTES: number; - var BuffType: typeof Buffer; - var SlowBuffType: typeof SlowBuffer; - export { BuffType as Buffer, SlowBuffType as SlowBuffer }; + export var INSPECT_MAX_BYTES: number; + var BuffType: typeof Buffer; + var SlowBuffType: typeof SlowBuffer; + export { BuffType as Buffer, SlowBuffType as SlowBuffer }; } declare module "querystring" { - export interface StringifyOptions { - encodeURIComponent?: Function; - } + export interface StringifyOptions { + encodeURIComponent?: Function; + } - export interface ParseOptions { - maxKeys?: number; - decodeURIComponent?: Function; - } + export interface ParseOptions { + maxKeys?: number; + decodeURIComponent?: Function; + } - export function stringify(obj: T, sep?: string, eq?: string, options?: StringifyOptions): string; - export function parse(str: string, sep?: string, eq?: string, options?: ParseOptions): any; - export function parse(str: string, sep?: string, eq?: string, options?: ParseOptions): T; - export function escape(str: string): string; - export function unescape(str: string): string; + interface ParsedUrlQuery { [key: string]: string | string[] | undefined; } + + export function stringify(obj: T, sep?: string, eq?: string, options?: StringifyOptions): string; + export function parse(str: string, sep?: string, eq?: string, options?: ParseOptions): ParsedUrlQuery; + export function parse(str: string, sep?: string, eq?: string, options?: ParseOptions): T; + export function escape(str: string): string; + export function unescape(str: string): string; } declare module "events" { - class internal extends NodeJS.EventEmitter { } + class internal extends NodeJS.EventEmitter { } - namespace internal { - export class EventEmitter extends internal { - static listenerCount(emitter: EventEmitter, event: string | symbol): number; // deprecated - static defaultMaxListeners: number; + namespace internal { + export class EventEmitter extends internal { + static listenerCount(emitter: EventEmitter, event: string | symbol): number; // deprecated + static defaultMaxListeners: number; - addListener(event: string | symbol, listener: Function): this; - on(event: string | symbol, listener: Function): this; - once(event: string | symbol, listener: Function): this; - prependListener(event: string | symbol, listener: Function): this; - prependOnceListener(event: string | symbol, listener: Function): this; - removeListener(event: string | symbol, listener: Function): this; - removeAllListeners(event?: string | symbol): this; - setMaxListeners(n: number): this; - getMaxListeners(): number; - listeners(event: string | symbol): Function[]; - emit(event: string | symbol, ...args: any[]): boolean; - eventNames(): (string | symbol)[]; - listenerCount(type: string | symbol): number; - } - } + addListener(event: string | symbol, listener: (...args: any[]) => void): this; + on(event: string | symbol, listener: (...args: any[]) => void): this; + once(event: string | symbol, listener: (...args: any[]) => void): this; + prependListener(event: string | symbol, listener: (...args: any[]) => void): this; + prependOnceListener(event: string | symbol, listener: (...args: any[]) => void): this; + removeListener(event: string | symbol, listener: (...args: any[]) => void): this; + removeAllListeners(event?: string | symbol): this; + setMaxListeners(n: number): this; + getMaxListeners(): number; + listeners(event: string | symbol): Function[]; + emit(event: string | symbol, ...args: any[]): boolean; + eventNames(): Array; + listenerCount(type: string | symbol): number; + } + } - export = internal; + export = internal; } declare module "http" { - import * as events from "events"; - import * as net from "net"; - import * as stream from "stream"; + import * as events from "events"; + import * as net from "net"; + import * as stream from "stream"; + import { URL } from "url"; - export interface RequestOptions { - protocol?: string; - host?: string; - hostname?: string; - family?: number; - port?: number; - localAddress?: string; - socketPath?: string; - method?: string; - path?: string; - headers?: { [key: string]: any }; - auth?: string; - agent?: Agent | boolean; - timeout?: number; - } + // incoming headers will never contain number + export interface IncomingHttpHeaders { + 'accept'?: string; + 'access-control-allow-origin'?: string; + 'access-control-allow-credentials'?: string; + 'access-control-expose-headers'?: string; + 'access-control-max-age'?: string; + 'access-control-allow-methods'?: string; + 'access-control-allow-headers'?: string; + 'accept-patch'?: string; + 'accept-ranges'?: string; + 'authorization'?: string; + 'age'?: string; + 'allow'?: string; + 'alt-svc'?: string; + 'cache-control'?: string; + 'connection'?: string; + 'content-disposition'?: string; + 'content-encoding'?: string; + 'content-language'?: string; + 'content-length'?: string; + 'content-location'?: string; + 'content-range'?: string; + 'content-type'?: string; + 'date'?: string; + 'expires'?: string; + 'host'?: string; + 'last-modified'?: string; + 'location'?: string; + 'pragma'?: string; + 'proxy-authenticate'?: string; + 'public-key-pins'?: string; + 'retry-after'?: string; + 'set-cookie'?: string[]; + 'strict-transport-security'?: string; + 'trailer'?: string; + 'transfer-encoding'?: string; + 'tk'?: string; + 'upgrade'?: string; + 'vary'?: string; + 'via'?: string; + 'warning'?: string; + 'www-authenticate'?: string; + [header: string]: string | string[] | undefined; + } - export interface Server extends net.Server { - setTimeout(msecs: number, callback: Function): void; - maxHeadersCount: number; - timeout: number; - listening: boolean; - } + // outgoing headers allows numbers (as they are converted internally to strings) + export interface OutgoingHttpHeaders { + [header: string]: number | string | string[] | undefined; + } + + export interface ClientRequestArgs { + protocol?: string; + host?: string; + hostname?: string; + family?: number; + port?: number | string; + defaultPort?: number | string; + localAddress?: string; + socketPath?: string; + method?: string; + path?: string; + headers?: OutgoingHttpHeaders; + auth?: string; + agent?: Agent | boolean; + _defaultAgent?: Agent; + timeout?: number; + // https://github.com/nodejs/node/blob/master/lib/_http_client.js#L278 + createConnection?: (options: ClientRequestArgs, oncreate: (err: Error, socket: net.Socket) => void) => net.Socket; + } + + export class Server extends net.Server { + constructor(requestListener?: (req: IncomingMessage, res: ServerResponse) => void); + + setTimeout(msecs?: number, callback?: () => void): this; + setTimeout(callback: () => void): this; + maxHeadersCount: number; + timeout: number; + keepAliveTimeout: number; + } /** * @deprecated Use IncomingMessage */ - export interface ServerRequest extends IncomingMessage { - connection: net.Socket; - } - export interface ServerResponse extends stream.Writable { - // Extended base methods - write(buffer: Buffer): boolean; - write(buffer: Buffer, cb?: Function): boolean; - write(str: string, cb?: Function): boolean; - write(str: string, encoding?: string, cb?: Function): boolean; - write(str: string, encoding?: string, fd?: string): boolean; + export class ServerRequest extends IncomingMessage { + connection: net.Socket; + } - writeContinue(): void; - writeHead(statusCode: number, reasonPhrase?: string, headers?: any): void; - writeHead(statusCode: number, headers?: any): void; - statusCode: number; - statusMessage: string; - headersSent: boolean; - setHeader(name: string, value: string | string[]): void; - setTimeout(msecs: number, callback: Function): ServerResponse; - sendDate: boolean; - getHeader(name: string): string; - removeHeader(name: string): void; - write(chunk: any, encoding?: string): any; - addTrailers(headers: any): void; - finished: boolean; + // https://github.com/nodejs/node/blob/master/lib/_http_outgoing.js + export class OutgoingMessage extends stream.Writable { + upgrading: boolean; + chunkedEncoding: boolean; + shouldKeepAlive: boolean; + useChunkedEncodingByDefault: boolean; + sendDate: boolean; + finished: boolean; + headersSent: boolean; + connection: net.Socket; - // Extended base methods - end(): void; - end(buffer: Buffer, cb?: Function): void; - end(str: string, cb?: Function): void; - end(str: string, encoding?: string, cb?: Function): void; - end(data?: any, encoding?: string): void; - } - export interface ClientRequest extends stream.Writable { - // Extended base methods - write(buffer: Buffer): boolean; - write(buffer: Buffer, cb?: Function): boolean; - write(str: string, cb?: Function): boolean; - write(str: string, encoding?: string, cb?: Function): boolean; - write(str: string, encoding?: string, fd?: string): boolean; + constructor(); - write(chunk: any, encoding?: string): void; - abort(): void; - setTimeout(timeout: number, callback?: Function): void; - setNoDelay(noDelay?: boolean): void; - setSocketKeepAlive(enable?: boolean, initialDelay?: number): void; + setTimeout(msecs: number, callback?: () => void): this; + destroy(error: Error): void; + setHeader(name: string, value: number | string | string[]): void; + getHeader(name: string): number | string | string[] | undefined; + getHeaders(): OutgoingHttpHeaders; + getHeaderNames(): string[]; + hasHeader(name: string): boolean; + removeHeader(name: string): void; + addTrailers(headers: OutgoingHttpHeaders | Array<[string, string]>): void; + flushHeaders(): void; + } - setHeader(name: string, value: string | string[]): void; - getHeader(name: string): string; - removeHeader(name: string): void; - addTrailers(headers: any): void; + // https://github.com/nodejs/node/blob/master/lib/_http_server.js#L108-L256 + export class ServerResponse extends OutgoingMessage { + statusCode: number; + statusMessage: string; - // Extended base methods - end(): void; - end(buffer: Buffer, cb?: Function): void; - end(str: string, cb?: Function): void; - end(str: string, encoding?: string, cb?: Function): void; - end(data?: any, encoding?: string): void; - } - export interface IncomingMessage extends stream.Readable { - httpVersion: string; - httpVersionMajor: number; - httpVersionMinor: number; - connection: net.Socket; - headers: any; - rawHeaders: string[]; - trailers: any; - rawTrailers: any; - setTimeout(msecs: number, callback: Function): NodeJS.Timer; + constructor(req: IncomingMessage); + + assignSocket(socket: net.Socket): void; + detachSocket(socket: net.Socket): void; + // https://github.com/nodejs/node/blob/master/test/parallel/test-http-write-callbacks.js#L53 + // no args in writeContinue callback + writeContinue(callback?: () => void): void; + writeHead(statusCode: number, reasonPhrase?: string, headers?: OutgoingHttpHeaders): void; + writeHead(statusCode: number, headers?: OutgoingHttpHeaders): void; + } + + // https://github.com/nodejs/node/blob/master/lib/_http_client.js#L77 + export class ClientRequest extends OutgoingMessage { + connection: net.Socket; + socket: net.Socket; + aborted: number; + + constructor(url: string | URL | ClientRequestArgs, cb?: (res: IncomingMessage) => void); + + abort(): void; + onSocket(socket: net.Socket): void; + setTimeout(timeout: number, callback?: () => void): this; + setNoDelay(noDelay?: boolean): void; + setSocketKeepAlive(enable?: boolean, initialDelay?: number): void; + } + + export class IncomingMessage extends stream.Readable { + constructor(socket: net.Socket); + + httpVersion: string; + httpVersionMajor: number; + httpVersionMinor: number; + connection: net.Socket; + headers: IncomingHttpHeaders; + rawHeaders: string[]; + trailers: { [key: string]: string | undefined }; + rawTrailers: string[]; + setTimeout(msecs: number, callback: () => void): this; /** * Only valid for request obtained from http.Server. */ - method?: string; + method?: string; /** * Only valid for request obtained from http.Server. */ - url?: string; + url?: string; /** * Only valid for response obtained from http.ClientRequest. */ - statusCode?: number; + statusCode?: number; /** * Only valid for response obtained from http.ClientRequest. */ - statusMessage?: string; - socket: net.Socket; - destroy(error?: Error): void; - } + statusMessage?: string; + socket: net.Socket; + destroy(error?: Error): void; + } + /** * @deprecated Use IncomingMessage */ - export interface ClientResponse extends IncomingMessage { } + export class ClientResponse extends IncomingMessage { } - export interface AgentOptions { + export interface AgentOptions { /** * Keep sockets around in a pool to be used by other requests in the future. Default = false */ - keepAlive?: boolean; + keepAlive?: boolean; /** * When using HTTP KeepAlive, how often to send TCP KeepAlive packets over sockets being kept alive. Default = 1000. * Only relevant if keepAlive is set to true. */ - keepAliveMsecs?: number; + keepAliveMsecs?: number; /** * Maximum number of sockets to allow per host. Default for Node 0.10 is 5, default for Node 0.12 is Infinity */ - maxSockets?: number; + maxSockets?: number; /** * Maximum number of sockets to leave open in a free state. Only relevant if keepAlive is set to true. Default = 256. */ - maxFreeSockets?: number; - } + maxFreeSockets?: number; + } - export class Agent { - maxSockets: number; - sockets: any; - requests: any; + export class Agent { + maxFreeSockets: number; + maxSockets: number; + sockets: any; + requests: any; - constructor(opts?: AgentOptions); + constructor(opts?: AgentOptions); /** * Destroy any sockets that are currently in use by the agent. @@ -807,62 +1159,61 @@ declare module "http" { * then it is best to explicitly shut down the agent when you know that it will no longer be used. Otherwise, * sockets may hang open for quite a long time before the server terminates them. */ - destroy(): void; - } + destroy(): void; + } - export var METHODS: string[]; + export var METHODS: string[]; - export var STATUS_CODES: { - [errorCode: number]: string; - [errorCode: string]: string; - }; - export function createServer(requestListener?: (request: IncomingMessage, response: ServerResponse) => void): Server; - export function createClient(port?: number, host?: string): any; - export function request(options: RequestOptions, callback?: (res: IncomingMessage) => void): ClientRequest; - export function get(options: any, callback?: (res: IncomingMessage) => void): ClientRequest; - export var globalAgent: Agent; + export var STATUS_CODES: { + [errorCode: number]: string | undefined; + [errorCode: string]: string | undefined; + }; + + export function createServer(requestListener?: (request: IncomingMessage, response: ServerResponse) => void): Server; + export function createClient(port?: number, host?: string): any; + + // although RequestOptions are passed as ClientRequestArgs to ClientRequest directly, + // create interface RequestOptions would make the naming more clear to developers + export interface RequestOptions extends ClientRequestArgs { } + export function request(options: RequestOptions | string | URL, callback?: (res: IncomingMessage) => void): ClientRequest; + export function get(options: RequestOptions | string | URL, callback?: (res: IncomingMessage) => void): ClientRequest; + export var globalAgent: Agent; } declare module "cluster" { - import * as child from "child_process"; - import * as events from "events"; - import * as net from "net"; + import * as child from "child_process"; + import * as events from "events"; + import * as net from "net"; - // interfaces - export interface ClusterSettings { - execArgv?: string[]; // default: process.execArgv - exec?: string; - args?: string[]; - silent?: boolean; - stdio?: any[]; - uid?: number; - gid?: number; - } + // interfaces + export interface ClusterSettings { + execArgv?: string[]; // default: process.execArgv + exec?: string; + args?: string[]; + silent?: boolean; + stdio?: any[]; + uid?: number; + gid?: number; + inspectPort?: number | (() => number); + } - export interface ClusterSetupMasterSettings { - exec?: string; // default: process.argv[1] - args?: string[]; // default: process.argv.slice(2) - silent?: boolean; // default: false - stdio?: any[]; - } + export interface Address { + address: string; + port: number; + addressType: number | "udp4" | "udp6"; // 4, 6, -1, "udp4", "udp6" + } - export interface Address { - address: string; - port: number; - addressType: number | "udp4" | "udp6"; // 4, 6, -1, "udp4", "udp6" - } - - export class Worker extends events.EventEmitter { - id: string; - process: child.ChildProcess; - suicide: boolean; - send(message: any, sendHandle?: any, callback?: (error: Error) => void): boolean; - kill(signal?: string): void; - destroy(signal?: string): void; - disconnect(): void; - isConnected(): boolean; - isDead(): boolean; - exitedAfterDisconnect: boolean; + export class Worker extends events.EventEmitter { + id: number; + process: child.ChildProcess; + suicide: boolean; + send(message: any, sendHandle?: any, callback?: (error: Error) => void): boolean; + kill(signal?: string): void; + destroy(signal?: string): void; + disconnect(): void; + isConnected(): boolean; + isDead(): boolean; + exitedAfterDisconnect: boolean; /** * events.EventEmitter @@ -873,68 +1224,68 @@ declare module "cluster" { * 5. message * 6. online */ - addListener(event: string, listener: Function): this; - addListener(event: "disconnect", listener: () => void): this; - addListener(event: "error", listener: (error: Error) => void): this; - addListener(event: "exit", listener: (code: number, signal: string) => void): this; - addListener(event: "listening", listener: (address: Address) => void): this; - addListener(event: "message", listener: (message: any, handle: net.Socket | net.Server) => void): this; // the handle is a net.Socket or net.Server object, or undefined. - addListener(event: "online", listener: () => void): this; + addListener(event: string, listener: (...args: any[]) => void): this; + addListener(event: "disconnect", listener: () => void): this; + addListener(event: "error", listener: (error: Error) => void): this; + addListener(event: "exit", listener: (code: number, signal: string) => void): this; + addListener(event: "listening", listener: (address: Address) => void): this; + addListener(event: "message", listener: (message: any, handle: net.Socket | net.Server) => void): this; // the handle is a net.Socket or net.Server object, or undefined. + addListener(event: "online", listener: () => void): this; - emit(event: string | symbol, ...args: any[]): boolean; - emit(event: "disconnect", listener: () => void): boolean - emit(event: "error", listener: (error: Error) => void): boolean - emit(event: "exit", listener: (code: number, signal: string) => void): boolean - emit(event: "listening", listener: (address: Address) => void): boolean - emit(event: "message", listener: (message: any, handle: net.Socket | net.Server) => void): boolean - emit(event: "online", listener: () => void): boolean + emit(event: string | symbol, ...args: any[]): boolean; + emit(event: "disconnect"): boolean; + emit(event: "error", error: Error): boolean; + emit(event: "exit", code: number, signal: string): boolean; + emit(event: "listening", address: Address): boolean; + emit(event: "message", message: any, handle: net.Socket | net.Server): boolean; + emit(event: "online"): boolean; - on(event: string, listener: Function): this; - on(event: "disconnect", listener: () => void): this; - on(event: "error", listener: (error: Error) => void): this; - on(event: "exit", listener: (code: number, signal: string) => void): this; - on(event: "listening", listener: (address: Address) => void): this; - on(event: "message", listener: (message: any, handle: net.Socket | net.Server) => void): this; // the handle is a net.Socket or net.Server object, or undefined. - on(event: "online", listener: () => void): this; + on(event: string, listener: (...args: any[]) => void): this; + on(event: "disconnect", listener: () => void): this; + on(event: "error", listener: (error: Error) => void): this; + on(event: "exit", listener: (code: number, signal: string) => void): this; + on(event: "listening", listener: (address: Address) => void): this; + on(event: "message", listener: (message: any, handle: net.Socket | net.Server) => void): this; // the handle is a net.Socket or net.Server object, or undefined. + on(event: "online", listener: () => void): this; - once(event: string, listener: Function): this; - once(event: "disconnect", listener: () => void): this; - once(event: "error", listener: (error: Error) => void): this; - once(event: "exit", listener: (code: number, signal: string) => void): this; - once(event: "listening", listener: (address: Address) => void): this; - once(event: "message", listener: (message: any, handle: net.Socket | net.Server) => void): this; // the handle is a net.Socket or net.Server object, or undefined. - once(event: "online", listener: () => void): this; + once(event: string, listener: (...args: any[]) => void): this; + once(event: "disconnect", listener: () => void): this; + once(event: "error", listener: (error: Error) => void): this; + once(event: "exit", listener: (code: number, signal: string) => void): this; + once(event: "listening", listener: (address: Address) => void): this; + once(event: "message", listener: (message: any, handle: net.Socket | net.Server) => void): this; // the handle is a net.Socket or net.Server object, or undefined. + once(event: "online", listener: () => void): this; - prependListener(event: string, listener: Function): this; - prependListener(event: "disconnect", listener: () => void): this; - prependListener(event: "error", listener: (error: Error) => void): this; - prependListener(event: "exit", listener: (code: number, signal: string) => void): this; - prependListener(event: "listening", listener: (address: Address) => void): this; - prependListener(event: "message", listener: (message: any, handle: net.Socket | net.Server) => void): this; // the handle is a net.Socket or net.Server object, or undefined. - prependListener(event: "online", listener: () => void): this; + prependListener(event: string, listener: (...args: any[]) => void): this; + prependListener(event: "disconnect", listener: () => void): this; + prependListener(event: "error", listener: (error: Error) => void): this; + prependListener(event: "exit", listener: (code: number, signal: string) => void): this; + prependListener(event: "listening", listener: (address: Address) => void): this; + prependListener(event: "message", listener: (message: any, handle: net.Socket | net.Server) => void): this; // the handle is a net.Socket or net.Server object, or undefined. + prependListener(event: "online", listener: () => void): this; - prependOnceListener(event: string, listener: Function): this; - prependOnceListener(event: "disconnect", listener: () => void): this; - prependOnceListener(event: "error", listener: (error: Error) => void): this; - prependOnceListener(event: "exit", listener: (code: number, signal: string) => void): this; - prependOnceListener(event: "listening", listener: (address: Address) => void): this; - prependOnceListener(event: "message", listener: (message: any, handle: net.Socket | net.Server) => void): this; // the handle is a net.Socket or net.Server object, or undefined. - prependOnceListener(event: "online", listener: () => void): this; - } + prependOnceListener(event: string, listener: (...args: any[]) => void): this; + prependOnceListener(event: "disconnect", listener: () => void): this; + prependOnceListener(event: "error", listener: (error: Error) => void): this; + prependOnceListener(event: "exit", listener: (code: number, signal: string) => void): this; + prependOnceListener(event: "listening", listener: (address: Address) => void): this; + prependOnceListener(event: "message", listener: (message: any, handle: net.Socket | net.Server) => void): this; // the handle is a net.Socket or net.Server object, or undefined. + prependOnceListener(event: "online", listener: () => void): this; + } - export interface Cluster extends events.EventEmitter { - Worker: Worker; - disconnect(callback?: Function): void; - fork(env?: any): Worker; - isMaster: boolean; - isWorker: boolean; - // TODO: cluster.schedulingPolicy - settings: ClusterSettings; - setupMaster(settings?: ClusterSetupMasterSettings): void; - worker: Worker; - workers: { - [index: string]: Worker - }; + export interface Cluster extends events.EventEmitter { + Worker: Worker; + disconnect(callback?: Function): void; + fork(env?: any): Worker; + isMaster: boolean; + isWorker: boolean; + // TODO: cluster.schedulingPolicy + settings: ClusterSettings; + setupMaster(settings?: ClusterSettings): void; + worker?: Worker; + workers?: { + [index: string]: Worker | undefined + }; /** * events.EventEmitter @@ -946,73 +1297,72 @@ declare module "cluster" { * 6. online * 7. setup */ - addListener(event: string, listener: Function): this; - addListener(event: "disconnect", listener: (worker: Worker) => void): this; - addListener(event: "exit", listener: (worker: Worker, code: number, signal: string) => void): this; - addListener(event: "fork", listener: (worker: Worker) => void): this; - addListener(event: "listening", listener: (worker: Worker, address: Address) => void): this; - addListener(event: "message", listener: (worker: Worker, message: any, handle: net.Socket | net.Server) => void): this; // the handle is a net.Socket or net.Server object, or undefined. - addListener(event: "online", listener: (worker: Worker) => void): this; - addListener(event: "setup", listener: (settings: any) => void): this; + addListener(event: string, listener: (...args: any[]) => void): this; + addListener(event: "disconnect", listener: (worker: Worker) => void): this; + addListener(event: "exit", listener: (worker: Worker, code: number, signal: string) => void): this; + addListener(event: "fork", listener: (worker: Worker) => void): this; + addListener(event: "listening", listener: (worker: Worker, address: Address) => void): this; + addListener(event: "message", listener: (worker: Worker, message: any, handle: net.Socket | net.Server) => void): this; // the handle is a net.Socket or net.Server object, or undefined. + addListener(event: "online", listener: (worker: Worker) => void): this; + addListener(event: "setup", listener: (settings: any) => void): this; - emit(event: string | symbol, ...args: any[]): boolean; - emit(event: "disconnect", listener: (worker: Worker) => void): boolean; - emit(event: "exit", listener: (worker: Worker, code: number, signal: string) => void): boolean; - emit(event: "fork", listener: (worker: Worker) => void): boolean; - emit(event: "listening", listener: (worker: Worker, address: Address) => void): boolean; - emit(event: "message", listener: (worker: Worker, message: any, handle: net.Socket | net.Server) => void): boolean; - emit(event: "online", listener: (worker: Worker) => void): boolean; - emit(event: "setup", listener: (settings: any) => void): boolean; + emit(event: string | symbol, ...args: any[]): boolean; + emit(event: "disconnect", worker: Worker): boolean; + emit(event: "exit", worker: Worker, code: number, signal: string): boolean; + emit(event: "fork", worker: Worker): boolean; + emit(event: "listening", worker: Worker, address: Address): boolean; + emit(event: "message", worker: Worker, message: any, handle: net.Socket | net.Server): boolean; + emit(event: "online", worker: Worker): boolean; + emit(event: "setup", settings: any): boolean; - on(event: string, listener: Function): this; - on(event: "disconnect", listener: (worker: Worker) => void): this; - on(event: "exit", listener: (worker: Worker, code: number, signal: string) => void): this; - on(event: "fork", listener: (worker: Worker) => void): this; - on(event: "listening", listener: (worker: Worker, address: Address) => void): this; - on(event: "message", listener: (worker: Worker, message: any, handle: net.Socket | net.Server) => void): this; // the handle is a net.Socket or net.Server object, or undefined. - on(event: "online", listener: (worker: Worker) => void): this; - on(event: "setup", listener: (settings: any) => void): this; + on(event: string, listener: (...args: any[]) => void): this; + on(event: "disconnect", listener: (worker: Worker) => void): this; + on(event: "exit", listener: (worker: Worker, code: number, signal: string) => void): this; + on(event: "fork", listener: (worker: Worker) => void): this; + on(event: "listening", listener: (worker: Worker, address: Address) => void): this; + on(event: "message", listener: (worker: Worker, message: any, handle: net.Socket | net.Server) => void): this; // the handle is a net.Socket or net.Server object, or undefined. + on(event: "online", listener: (worker: Worker) => void): this; + on(event: "setup", listener: (settings: any) => void): this; - once(event: string, listener: Function): this; - once(event: "disconnect", listener: (worker: Worker) => void): this; - once(event: "exit", listener: (worker: Worker, code: number, signal: string) => void): this; - once(event: "fork", listener: (worker: Worker) => void): this; - once(event: "listening", listener: (worker: Worker, address: Address) => void): this; - once(event: "message", listener: (worker: Worker, message: any, handle: net.Socket | net.Server) => void): this; // the handle is a net.Socket or net.Server object, or undefined. - once(event: "online", listener: (worker: Worker) => void): this; - once(event: "setup", listener: (settings: any) => void): this; + once(event: string, listener: (...args: any[]) => void): this; + once(event: "disconnect", listener: (worker: Worker) => void): this; + once(event: "exit", listener: (worker: Worker, code: number, signal: string) => void): this; + once(event: "fork", listener: (worker: Worker) => void): this; + once(event: "listening", listener: (worker: Worker, address: Address) => void): this; + once(event: "message", listener: (worker: Worker, message: any, handle: net.Socket | net.Server) => void): this; // the handle is a net.Socket or net.Server object, or undefined. + once(event: "online", listener: (worker: Worker) => void): this; + once(event: "setup", listener: (settings: any) => void): this; - prependListener(event: string, listener: Function): this; - prependListener(event: "disconnect", listener: (worker: Worker) => void): this; - prependListener(event: "exit", listener: (worker: Worker, code: number, signal: string) => void): this; - prependListener(event: "fork", listener: (worker: Worker) => void): this; - prependListener(event: "listening", listener: (worker: Worker, address: Address) => void): this; - prependListener(event: "message", listener: (worker: Worker, message: any, handle: net.Socket | net.Server) => void): this; // the handle is a net.Socket or net.Server object, or undefined. - prependListener(event: "online", listener: (worker: Worker) => void): this; - prependListener(event: "setup", listener: (settings: any) => void): this; + prependListener(event: string, listener: (...args: any[]) => void): this; + prependListener(event: "disconnect", listener: (worker: Worker) => void): this; + prependListener(event: "exit", listener: (worker: Worker, code: number, signal: string) => void): this; + prependListener(event: "fork", listener: (worker: Worker) => void): this; + prependListener(event: "listening", listener: (worker: Worker, address: Address) => void): this; + prependListener(event: "message", listener: (worker: Worker, message: any, handle: net.Socket | net.Server) => void): this; // the handle is a net.Socket or net.Server object, or undefined. + prependListener(event: "online", listener: (worker: Worker) => void): this; + prependListener(event: "setup", listener: (settings: any) => void): this; - prependOnceListener(event: string, listener: Function): this; - prependOnceListener(event: "disconnect", listener: (worker: Worker) => void): this; - prependOnceListener(event: "exit", listener: (worker: Worker, code: number, signal: string) => void): this; - prependOnceListener(event: "fork", listener: (worker: Worker) => void): this; - prependOnceListener(event: "listening", listener: (worker: Worker, address: Address) => void): this; - prependOnceListener(event: "message", listener: (worker: Worker, message: any, handle: net.Socket | net.Server) => void): this; // the handle is a net.Socket or net.Server object, or undefined. - prependOnceListener(event: "online", listener: (worker: Worker) => void): this; - prependOnceListener(event: "setup", listener: (settings: any) => void): this; + prependOnceListener(event: string, listener: (...args: any[]) => void): this; + prependOnceListener(event: "disconnect", listener: (worker: Worker) => void): this; + prependOnceListener(event: "exit", listener: (worker: Worker, code: number, signal: string) => void): this; + prependOnceListener(event: "fork", listener: (worker: Worker) => void): this; + prependOnceListener(event: "listening", listener: (worker: Worker, address: Address) => void): this; + prependOnceListener(event: "message", listener: (worker: Worker, message: any, handle: net.Socket | net.Server) => void): this; // the handle is a net.Socket or net.Server object, or undefined. + prependOnceListener(event: "online", listener: (worker: Worker) => void): this; + prependOnceListener(event: "setup", listener: (settings: any) => void): this; + } - } - - export function disconnect(callback?: Function): void; - export function fork(env?: any): Worker; - export var isMaster: boolean; - export var isWorker: boolean; - // TODO: cluster.schedulingPolicy - export var settings: ClusterSettings; - export function setupMaster(settings?: ClusterSetupMasterSettings): void; - export var worker: Worker; - export var workers: { - [index: string]: Worker - }; + export function disconnect(callback?: Function): void; + export function fork(env?: any): Worker; + export var isMaster: boolean; + export var isWorker: boolean; + // TODO: cluster.schedulingPolicy + export var settings: ClusterSettings; + export function setupMaster(settings?: ClusterSettings): void; + export var worker: Worker; + export var workers: { + [index: string]: Worker | undefined + }; /** * events.EventEmitter @@ -1024,499 +1374,522 @@ declare module "cluster" { * 6. online * 7. setup */ - export function addListener(event: string, listener: Function): Cluster; - export function addListener(event: "disconnect", listener: (worker: Worker) => void): Cluster; - export function addListener(event: "exit", listener: (worker: Worker, code: number, signal: string) => void): Cluster; - export function addListener(event: "fork", listener: (worker: Worker) => void): Cluster; - export function addListener(event: "listening", listener: (worker: Worker, address: Address) => void): Cluster; - export function addListener(event: "message", listener: (worker: Worker, message: any, handle: net.Socket | net.Server) => void): Cluster; // the handle is a net.Socket or net.Server object, or undefined. - export function addListener(event: "online", listener: (worker: Worker) => void): Cluster; - export function addListener(event: "setup", listener: (settings: any) => void): Cluster; + export function addListener(event: string, listener: (...args: any[]) => void): Cluster; + export function addListener(event: "disconnect", listener: (worker: Worker) => void): Cluster; + export function addListener(event: "exit", listener: (worker: Worker, code: number, signal: string) => void): Cluster; + export function addListener(event: "fork", listener: (worker: Worker) => void): Cluster; + export function addListener(event: "listening", listener: (worker: Worker, address: Address) => void): Cluster; + export function addListener(event: "message", listener: (worker: Worker, message: any, handle: net.Socket | net.Server) => void): Cluster; // the handle is a net.Socket or net.Server object, or undefined. + export function addListener(event: "online", listener: (worker: Worker) => void): Cluster; + export function addListener(event: "setup", listener: (settings: any) => void): Cluster; - export function emit(event: string | symbol, ...args: any[]): boolean; - export function emit(event: "disconnect", listener: (worker: Worker) => void): boolean; - export function emit(event: "exit", listener: (worker: Worker, code: number, signal: string) => void): boolean; - export function emit(event: "fork", listener: (worker: Worker) => void): boolean; - export function emit(event: "listening", listener: (worker: Worker, address: Address) => void): boolean; - export function emit(event: "message", listener: (worker: Worker, message: any, handle: net.Socket | net.Server) => void): boolean; - export function emit(event: "online", listener: (worker: Worker) => void): boolean; - export function emit(event: "setup", listener: (settings: any) => void): boolean; + export function emit(event: string | symbol, ...args: any[]): boolean; + export function emit(event: "disconnect", worker: Worker): boolean; + export function emit(event: "exit", worker: Worker, code: number, signal: string): boolean; + export function emit(event: "fork", worker: Worker): boolean; + export function emit(event: "listening", worker: Worker, address: Address): boolean; + export function emit(event: "message", worker: Worker, message: any, handle: net.Socket | net.Server): boolean; + export function emit(event: "online", worker: Worker): boolean; + export function emit(event: "setup", settings: any): boolean; - export function on(event: string, listener: Function): Cluster; - export function on(event: "disconnect", listener: (worker: Worker) => void): Cluster; - export function on(event: "exit", listener: (worker: Worker, code: number, signal: string) => void): Cluster; - export function on(event: "fork", listener: (worker: Worker) => void): Cluster; - export function on(event: "listening", listener: (worker: Worker, address: Address) => void): Cluster; - export function on(event: "message", listener: (worker: Worker, message: any, handle: net.Socket | net.Server) => void): Cluster; // the handle is a net.Socket or net.Server object, or undefined. - export function on(event: "online", listener: (worker: Worker) => void): Cluster; - export function on(event: "setup", listener: (settings: any) => void): Cluster; + export function on(event: string, listener: (...args: any[]) => void): Cluster; + export function on(event: "disconnect", listener: (worker: Worker) => void): Cluster; + export function on(event: "exit", listener: (worker: Worker, code: number, signal: string) => void): Cluster; + export function on(event: "fork", listener: (worker: Worker) => void): Cluster; + export function on(event: "listening", listener: (worker: Worker, address: Address) => void): Cluster; + export function on(event: "message", listener: (worker: Worker, message: any, handle: net.Socket | net.Server) => void): Cluster; // the handle is a net.Socket or net.Server object, or undefined. + export function on(event: "online", listener: (worker: Worker) => void): Cluster; + export function on(event: "setup", listener: (settings: any) => void): Cluster; - export function once(event: string, listener: Function): Cluster; - export function once(event: "disconnect", listener: (worker: Worker) => void): Cluster; - export function once(event: "exit", listener: (worker: Worker, code: number, signal: string) => void): Cluster; - export function once(event: "fork", listener: (worker: Worker) => void): Cluster; - export function once(event: "listening", listener: (worker: Worker, address: Address) => void): Cluster; - export function once(event: "message", listener: (worker: Worker, message: any, handle: net.Socket | net.Server) => void): Cluster; // the handle is a net.Socket or net.Server object, or undefined. - export function once(event: "online", listener: (worker: Worker) => void): Cluster; - export function once(event: "setup", listener: (settings: any) => void): Cluster; + export function once(event: string, listener: (...args: any[]) => void): Cluster; + export function once(event: "disconnect", listener: (worker: Worker) => void): Cluster; + export function once(event: "exit", listener: (worker: Worker, code: number, signal: string) => void): Cluster; + export function once(event: "fork", listener: (worker: Worker) => void): Cluster; + export function once(event: "listening", listener: (worker: Worker, address: Address) => void): Cluster; + export function once(event: "message", listener: (worker: Worker, message: any, handle: net.Socket | net.Server) => void): Cluster; // the handle is a net.Socket or net.Server object, or undefined. + export function once(event: "online", listener: (worker: Worker) => void): Cluster; + export function once(event: "setup", listener: (settings: any) => void): Cluster; - export function removeListener(event: string, listener: Function): Cluster; - export function removeAllListeners(event?: string): Cluster; - export function setMaxListeners(n: number): Cluster; - export function getMaxListeners(): number; - export function listeners(event: string): Function[]; - export function listenerCount(type: string): number; + export function removeListener(event: string, listener: (...args: any[]) => void): Cluster; + export function removeAllListeners(event?: string): Cluster; + export function setMaxListeners(n: number): Cluster; + export function getMaxListeners(): number; + export function listeners(event: string): Function[]; + export function listenerCount(type: string): number; - export function prependListener(event: string, listener: Function): Cluster; - export function prependListener(event: "disconnect", listener: (worker: Worker) => void): Cluster; - export function prependListener(event: "exit", listener: (worker: Worker, code: number, signal: string) => void): Cluster; - export function prependListener(event: "fork", listener: (worker: Worker) => void): Cluster; - export function prependListener(event: "listening", listener: (worker: Worker, address: Address) => void): Cluster; - export function prependListener(event: "message", listener: (worker: Worker, message: any, handle: net.Socket | net.Server) => void): Cluster; // the handle is a net.Socket or net.Server object, or undefined. - export function prependListener(event: "online", listener: (worker: Worker) => void): Cluster; - export function prependListener(event: "setup", listener: (settings: any) => void): Cluster; + export function prependListener(event: string, listener: (...args: any[]) => void): Cluster; + export function prependListener(event: "disconnect", listener: (worker: Worker) => void): Cluster; + export function prependListener(event: "exit", listener: (worker: Worker, code: number, signal: string) => void): Cluster; + export function prependListener(event: "fork", listener: (worker: Worker) => void): Cluster; + export function prependListener(event: "listening", listener: (worker: Worker, address: Address) => void): Cluster; + export function prependListener(event: "message", listener: (worker: Worker, message: any, handle: net.Socket | net.Server) => void): Cluster; // the handle is a net.Socket or net.Server object, or undefined. + export function prependListener(event: "online", listener: (worker: Worker) => void): Cluster; + export function prependListener(event: "setup", listener: (settings: any) => void): Cluster; - export function prependOnceListener(event: string, listener: Function): Cluster; - export function prependOnceListener(event: "disconnect", listener: (worker: Worker) => void): Cluster; - export function prependOnceListener(event: "exit", listener: (worker: Worker, code: number, signal: string) => void): Cluster; - export function prependOnceListener(event: "fork", listener: (worker: Worker) => void): Cluster; - export function prependOnceListener(event: "listening", listener: (worker: Worker, address: Address) => void): Cluster; - export function prependOnceListener(event: "message", listener: (worker: Worker, message: any, handle: net.Socket | net.Server) => void): Cluster; // the handle is a net.Socket or net.Server object, or undefined. - export function prependOnceListener(event: "online", listener: (worker: Worker) => void): Cluster; - export function prependOnceListener(event: "setup", listener: (settings: any) => void): Cluster; + export function prependOnceListener(event: string, listener: (...args: any[]) => void): Cluster; + export function prependOnceListener(event: "disconnect", listener: (worker: Worker) => void): Cluster; + export function prependOnceListener(event: "exit", listener: (worker: Worker, code: number, signal: string) => void): Cluster; + export function prependOnceListener(event: "fork", listener: (worker: Worker) => void): Cluster; + export function prependOnceListener(event: "listening", listener: (worker: Worker, address: Address) => void): Cluster; + export function prependOnceListener(event: "message", listener: (worker: Worker, message: any, handle: net.Socket | net.Server) => void): Cluster; // the handle is a net.Socket or net.Server object, or undefined. + export function prependOnceListener(event: "online", listener: (worker: Worker) => void): Cluster; + export function prependOnceListener(event: "setup", listener: (settings: any) => void): Cluster; - export function eventNames(): string[]; + export function eventNames(): string[]; } declare module "zlib" { - import * as stream from "stream"; + import * as stream from "stream"; - export interface ZlibOptions { - flush?: number; // default: zlib.constants.Z_NO_FLUSH - finishFlush?: number; // default: zlib.constants.Z_FINISH - chunkSize?: number; // default: 16*1024 - windowBits?: number; - level?: number; // compression only - memLevel?: number; // compression only - strategy?: number; // compression only - dictionary?: any; // deflate/inflate only, empty dictionary by default - } + export interface ZlibOptions { + flush?: number; // default: zlib.constants.Z_NO_FLUSH + finishFlush?: number; // default: zlib.constants.Z_FINISH + chunkSize?: number; // default: 16*1024 + windowBits?: number; + level?: number; // compression only + memLevel?: number; // compression only + strategy?: number; // compression only + dictionary?: any; // deflate/inflate only, empty dictionary by default + } - export interface Gzip extends stream.Transform { } - export interface Gunzip extends stream.Transform { } - export interface Deflate extends stream.Transform { } - export interface Inflate extends stream.Transform { } - export interface DeflateRaw extends stream.Transform { } - export interface InflateRaw extends stream.Transform { } - export interface Unzip extends stream.Transform { } + export interface Zlib { + readonly bytesRead: number; + close(callback?: () => void): void; + flush(kind?: number | (() => void), callback?: () => void): void; + } - export function createGzip(options?: ZlibOptions): Gzip; - export function createGunzip(options?: ZlibOptions): Gunzip; - export function createDeflate(options?: ZlibOptions): Deflate; - export function createInflate(options?: ZlibOptions): Inflate; - export function createDeflateRaw(options?: ZlibOptions): DeflateRaw; - export function createInflateRaw(options?: ZlibOptions): InflateRaw; - export function createUnzip(options?: ZlibOptions): Unzip; + export interface ZlibParams { + params(level: number, strategy: number, callback: () => void): void; + } - export function deflate(buf: Buffer | string, callback: (error: Error, result: Buffer) => void): void; - export function deflate(buf: Buffer | string, options: ZlibOptions, callback: (error: Error, result: Buffer) => void): void; - export function deflateSync(buf: Buffer | string, options?: ZlibOptions): Buffer; - export function deflateRaw(buf: Buffer | string, callback: (error: Error, result: Buffer) => void): void; - export function deflateRaw(buf: Buffer | string, options: ZlibOptions, callback: (error: Error, result: Buffer) => void): void; - export function deflateRawSync(buf: Buffer | string, options?: ZlibOptions): Buffer; - export function gzip(buf: Buffer | string, callback: (error: Error, result: Buffer) => void): void; - export function gzip(buf: Buffer | string, options: ZlibOptions, callback: (error: Error, result: Buffer) => void): void; - export function gzipSync(buf: Buffer | string, options?: ZlibOptions): Buffer; - export function gunzip(buf: Buffer | string, callback: (error: Error, result: Buffer) => void): void; - export function gunzip(buf: Buffer | string, options: ZlibOptions, callback: (error: Error, result: Buffer) => void): void; - export function gunzipSync(buf: Buffer | string, options?: ZlibOptions): Buffer; - export function inflate(buf: Buffer | string, callback: (error: Error, result: Buffer) => void): void; - export function inflate(buf: Buffer | string, options: ZlibOptions, callback: (error: Error, result: Buffer) => void): void; - export function inflateSync(buf: Buffer | string, options?: ZlibOptions): Buffer; - export function inflateRaw(buf: Buffer | string, callback: (error: Error, result: Buffer) => void): void; - export function inflateRaw(buf: Buffer | string, options: ZlibOptions, callback: (error: Error, result: Buffer) => void): void; - export function inflateRawSync(buf: Buffer | string, options?: ZlibOptions): Buffer; - export function unzip(buf: Buffer | string, callback: (error: Error, result: Buffer) => void): void; - export function unzip(buf: Buffer | string, options: ZlibOptions, callback: (error: Error, result: Buffer) => void): void; - export function unzipSync(buf: Buffer | string, options?: ZlibOptions): Buffer; + export interface ZlibReset { + reset(): void; + } - export namespace constants { - // Allowed flush values. + export interface Gzip extends stream.Transform, Zlib { } + export interface Gunzip extends stream.Transform, Zlib { } + export interface Deflate extends stream.Transform, Zlib, ZlibReset, ZlibParams { } + export interface Inflate extends stream.Transform, Zlib, ZlibReset { } + export interface DeflateRaw extends stream.Transform, Zlib, ZlibReset, ZlibParams { } + export interface InflateRaw extends stream.Transform, Zlib, ZlibReset { } + export interface Unzip extends stream.Transform, Zlib { } - export const Z_NO_FLUSH: number; - export const Z_PARTIAL_FLUSH: number; - export const Z_SYNC_FLUSH: number; - export const Z_FULL_FLUSH: number; - export const Z_FINISH: number; - export const Z_BLOCK: number; - export const Z_TREES: number; + export function createGzip(options?: ZlibOptions): Gzip; + export function createGunzip(options?: ZlibOptions): Gunzip; + export function createDeflate(options?: ZlibOptions): Deflate; + export function createInflate(options?: ZlibOptions): Inflate; + export function createDeflateRaw(options?: ZlibOptions): DeflateRaw; + export function createInflateRaw(options?: ZlibOptions): InflateRaw; + export function createUnzip(options?: ZlibOptions): Unzip; - // Return codes for the compression/decompression functions. Negative values are errors, positive values are used for special but normal events. + type InputType = string | Buffer | DataView /* | TypedArray */; + export function deflate(buf: InputType, callback: (error: Error | null, result: Buffer) => void): void; + export function deflate(buf: InputType, options: ZlibOptions, callback: (error: Error | null, result: Buffer) => void): void; + export function deflateSync(buf: InputType, options?: ZlibOptions): Buffer; + export function deflateRaw(buf: InputType, callback: (error: Error | null, result: Buffer) => void): void; + export function deflateRaw(buf: InputType, options: ZlibOptions, callback: (error: Error | null, result: Buffer) => void): void; + export function deflateRawSync(buf: InputType, options?: ZlibOptions): Buffer; + export function gzip(buf: InputType, callback: (error: Error | null, result: Buffer) => void): void; + export function gzip(buf: InputType, options: ZlibOptions, callback: (error: Error | null, result: Buffer) => void): void; + export function gzipSync(buf: InputType, options?: ZlibOptions): Buffer; + export function gunzip(buf: InputType, callback: (error: Error | null, result: Buffer) => void): void; + export function gunzip(buf: InputType, options: ZlibOptions, callback: (error: Error | null, result: Buffer) => void): void; + export function gunzipSync(buf: InputType, options?: ZlibOptions): Buffer; + export function inflate(buf: InputType, callback: (error: Error | null, result: Buffer) => void): void; + export function inflate(buf: InputType, options: ZlibOptions, callback: (error: Error | null, result: Buffer) => void): void; + export function inflateSync(buf: InputType, options?: ZlibOptions): Buffer; + export function inflateRaw(buf: InputType, callback: (error: Error | null, result: Buffer) => void): void; + export function inflateRaw(buf: InputType, options: ZlibOptions, callback: (error: Error | null, result: Buffer) => void): void; + export function inflateRawSync(buf: InputType, options?: ZlibOptions): Buffer; + export function unzip(buf: InputType, callback: (error: Error | null, result: Buffer) => void): void; + export function unzip(buf: InputType, options: ZlibOptions, callback: (error: Error | null, result: Buffer) => void): void; + export function unzipSync(buf: InputType, options?: ZlibOptions): Buffer; - export const Z_OK: number; - export const Z_STREAM_END: number; - export const Z_NEED_DICT: number; - export const Z_ERRNO: number; - export const Z_STREAM_ERROR: number; - export const Z_DATA_ERROR: number; - export const Z_MEM_ERROR: number; - export const Z_BUF_ERROR: number; - export const Z_VERSION_ERROR: number; + export namespace constants { + // Allowed flush values. - // Compression levels. + export const Z_NO_FLUSH: number; + export const Z_PARTIAL_FLUSH: number; + export const Z_SYNC_FLUSH: number; + export const Z_FULL_FLUSH: number; + export const Z_FINISH: number; + export const Z_BLOCK: number; + export const Z_TREES: number; - export const Z_NO_COMPRESSION: number; - export const Z_BEST_SPEED: number; - export const Z_BEST_COMPRESSION: number; - export const Z_DEFAULT_COMPRESSION: number; + // Return codes for the compression/decompression functions. Negative values are errors, positive values are used for special but normal events. - // Compression strategy. + export const Z_OK: number; + export const Z_STREAM_END: number; + export const Z_NEED_DICT: number; + export const Z_ERRNO: number; + export const Z_STREAM_ERROR: number; + export const Z_DATA_ERROR: number; + export const Z_MEM_ERROR: number; + export const Z_BUF_ERROR: number; + export const Z_VERSION_ERROR: number; - export const Z_FILTERED: number; - export const Z_HUFFMAN_ONLY: number; - export const Z_RLE: number; - export const Z_FIXED: number; - export const Z_DEFAULT_STRATEGY: number; - } + // Compression levels. - // Constants - export var Z_NO_FLUSH: number; - export var Z_PARTIAL_FLUSH: number; - export var Z_SYNC_FLUSH: number; - export var Z_FULL_FLUSH: number; - export var Z_FINISH: number; - export var Z_BLOCK: number; - export var Z_TREES: number; - export var Z_OK: number; - export var Z_STREAM_END: number; - export var Z_NEED_DICT: number; - export var Z_ERRNO: number; - export var Z_STREAM_ERROR: number; - export var Z_DATA_ERROR: number; - export var Z_MEM_ERROR: number; - export var Z_BUF_ERROR: number; - export var Z_VERSION_ERROR: number; - export var Z_NO_COMPRESSION: number; - export var Z_BEST_SPEED: number; - export var Z_BEST_COMPRESSION: number; - export var Z_DEFAULT_COMPRESSION: number; - export var Z_FILTERED: number; - export var Z_HUFFMAN_ONLY: number; - export var Z_RLE: number; - export var Z_FIXED: number; - export var Z_DEFAULT_STRATEGY: number; - export var Z_BINARY: number; - export var Z_TEXT: number; - export var Z_ASCII: number; - export var Z_UNKNOWN: number; - export var Z_DEFLATED: number; + export const Z_NO_COMPRESSION: number; + export const Z_BEST_SPEED: number; + export const Z_BEST_COMPRESSION: number; + export const Z_DEFAULT_COMPRESSION: number; + + // Compression strategy. + + export const Z_FILTERED: number; + export const Z_HUFFMAN_ONLY: number; + export const Z_RLE: number; + export const Z_FIXED: number; + export const Z_DEFAULT_STRATEGY: number; + } + + // Constants + export var Z_NO_FLUSH: number; + export var Z_PARTIAL_FLUSH: number; + export var Z_SYNC_FLUSH: number; + export var Z_FULL_FLUSH: number; + export var Z_FINISH: number; + export var Z_BLOCK: number; + export var Z_TREES: number; + export var Z_OK: number; + export var Z_STREAM_END: number; + export var Z_NEED_DICT: number; + export var Z_ERRNO: number; + export var Z_STREAM_ERROR: number; + export var Z_DATA_ERROR: number; + export var Z_MEM_ERROR: number; + export var Z_BUF_ERROR: number; + export var Z_VERSION_ERROR: number; + export var Z_NO_COMPRESSION: number; + export var Z_BEST_SPEED: number; + export var Z_BEST_COMPRESSION: number; + export var Z_DEFAULT_COMPRESSION: number; + export var Z_FILTERED: number; + export var Z_HUFFMAN_ONLY: number; + export var Z_RLE: number; + export var Z_FIXED: number; + export var Z_DEFAULT_STRATEGY: number; + export var Z_BINARY: number; + export var Z_TEXT: number; + export var Z_ASCII: number; + export var Z_UNKNOWN: number; + export var Z_DEFLATED: number; } declare module "os" { - export interface CpuInfo { - model: string; - speed: number; - times: { - user: number; - nice: number; - sys: number; - idle: number; - irq: number; - }; - } + export interface CpuInfo { + model: string; + speed: number; + times: { + user: number; + nice: number; + sys: number; + idle: number; + irq: number; + }; + } - export interface NetworkInterfaceInfo { - address: string; - netmask: string; - family: string; - mac: string; - internal: boolean; - } + export interface NetworkInterfaceBase { + address: string; + netmask: string; + mac: string; + internal: boolean; + } - export function hostname(): string; - export function loadavg(): number[]; - export function uptime(): number; - export function freemem(): number; - export function totalmem(): number; - export function cpus(): CpuInfo[]; - export function type(): string; - export function release(): string; - export function networkInterfaces(): { [index: string]: NetworkInterfaceInfo[] }; - export function homedir(): string; - export function userInfo(options?: { encoding: string }): { username: string, uid: number, gid: number, shell: any, homedir: string } - export var constants: { - UV_UDP_REUSEADDR: number, - signals: { - SIGHUP: number; - SIGINT: number; - SIGQUIT: number; - SIGILL: number; - SIGTRAP: number; - SIGABRT: number; - SIGIOT: number; - SIGBUS: number; - SIGFPE: number; - SIGKILL: number; - SIGUSR1: number; - SIGSEGV: number; - SIGUSR2: number; - SIGPIPE: number; - SIGALRM: number; - SIGTERM: number; - SIGCHLD: number; - SIGSTKFLT: number; - SIGCONT: number; - SIGSTOP: number; - SIGTSTP: number; - SIGTTIN: number; - SIGTTOU: number; - SIGURG: number; - SIGXCPU: number; - SIGXFSZ: number; - SIGVTALRM: number; - SIGPROF: number; - SIGWINCH: number; - SIGIO: number; - SIGPOLL: number; - SIGPWR: number; - SIGSYS: number; - SIGUNUSED: number; - }, - errno: { - E2BIG: number; - EACCES: number; - EADDRINUSE: number; - EADDRNOTAVAIL: number; - EAFNOSUPPORT: number; - EAGAIN: number; - EALREADY: number; - EBADF: number; - EBADMSG: number; - EBUSY: number; - ECANCELED: number; - ECHILD: number; - ECONNABORTED: number; - ECONNREFUSED: number; - ECONNRESET: number; - EDEADLK: number; - EDESTADDRREQ: number; - EDOM: number; - EDQUOT: number; - EEXIST: number; - EFAULT: number; - EFBIG: number; - EHOSTUNREACH: number; - EIDRM: number; - EILSEQ: number; - EINPROGRESS: number; - EINTR: number; - EINVAL: number; - EIO: number; - EISCONN: number; - EISDIR: number; - ELOOP: number; - EMFILE: number; - EMLINK: number; - EMSGSIZE: number; - EMULTIHOP: number; - ENAMETOOLONG: number; - ENETDOWN: number; - ENETRESET: number; - ENETUNREACH: number; - ENFILE: number; - ENOBUFS: number; - ENODATA: number; - ENODEV: number; - ENOENT: number; - ENOEXEC: number; - ENOLCK: number; - ENOLINK: number; - ENOMEM: number; - ENOMSG: number; - ENOPROTOOPT: number; - ENOSPC: number; - ENOSR: number; - ENOSTR: number; - ENOSYS: number; - ENOTCONN: number; - ENOTDIR: number; - ENOTEMPTY: number; - ENOTSOCK: number; - ENOTSUP: number; - ENOTTY: number; - ENXIO: number; - EOPNOTSUPP: number; - EOVERFLOW: number; - EPERM: number; - EPIPE: number; - EPROTO: number; - EPROTONOSUPPORT: number; - EPROTOTYPE: number; - ERANGE: number; - EROFS: number; - ESPIPE: number; - ESRCH: number; - ESTALE: number; - ETIME: number; - ETIMEDOUT: number; - ETXTBSY: number; - EWOULDBLOCK: number; - EXDEV: number; - }, - }; - export function arch(): string; - export function platform(): NodeJS.Platform; - export function tmpdir(): string; - export var EOL: string; - export function endianness(): "BE" | "LE"; + export interface NetworkInterfaceInfoIPv4 extends NetworkInterfaceBase { + family: "IPv4"; + } + + export interface NetworkInterfaceInfoIPv6 extends NetworkInterfaceBase { + family: "IPv6"; + scopeid: number; + } + + export type NetworkInterfaceInfo = NetworkInterfaceInfoIPv4 | NetworkInterfaceInfoIPv6; + + export function hostname(): string; + export function loadavg(): number[]; + export function uptime(): number; + export function freemem(): number; + export function totalmem(): number; + export function cpus(): CpuInfo[]; + export function type(): string; + export function release(): string; + export function networkInterfaces(): { [index: string]: NetworkInterfaceInfo[] }; + export function homedir(): string; + export function userInfo(options?: { encoding: string }): { username: string, uid: number, gid: number, shell: any, homedir: string }; + export var constants: { + UV_UDP_REUSEADDR: number, + signals: { + SIGHUP: number; + SIGINT: number; + SIGQUIT: number; + SIGILL: number; + SIGTRAP: number; + SIGABRT: number; + SIGIOT: number; + SIGBUS: number; + SIGFPE: number; + SIGKILL: number; + SIGUSR1: number; + SIGSEGV: number; + SIGUSR2: number; + SIGPIPE: number; + SIGALRM: number; + SIGTERM: number; + SIGCHLD: number; + SIGSTKFLT: number; + SIGCONT: number; + SIGSTOP: number; + SIGTSTP: number; + SIGTTIN: number; + SIGTTOU: number; + SIGURG: number; + SIGXCPU: number; + SIGXFSZ: number; + SIGVTALRM: number; + SIGPROF: number; + SIGWINCH: number; + SIGIO: number; + SIGPOLL: number; + SIGPWR: number; + SIGSYS: number; + SIGUNUSED: number; + }, + errno: { + E2BIG: number; + EACCES: number; + EADDRINUSE: number; + EADDRNOTAVAIL: number; + EAFNOSUPPORT: number; + EAGAIN: number; + EALREADY: number; + EBADF: number; + EBADMSG: number; + EBUSY: number; + ECANCELED: number; + ECHILD: number; + ECONNABORTED: number; + ECONNREFUSED: number; + ECONNRESET: number; + EDEADLK: number; + EDESTADDRREQ: number; + EDOM: number; + EDQUOT: number; + EEXIST: number; + EFAULT: number; + EFBIG: number; + EHOSTUNREACH: number; + EIDRM: number; + EILSEQ: number; + EINPROGRESS: number; + EINTR: number; + EINVAL: number; + EIO: number; + EISCONN: number; + EISDIR: number; + ELOOP: number; + EMFILE: number; + EMLINK: number; + EMSGSIZE: number; + EMULTIHOP: number; + ENAMETOOLONG: number; + ENETDOWN: number; + ENETRESET: number; + ENETUNREACH: number; + ENFILE: number; + ENOBUFS: number; + ENODATA: number; + ENODEV: number; + ENOENT: number; + ENOEXEC: number; + ENOLCK: number; + ENOLINK: number; + ENOMEM: number; + ENOMSG: number; + ENOPROTOOPT: number; + ENOSPC: number; + ENOSR: number; + ENOSTR: number; + ENOSYS: number; + ENOTCONN: number; + ENOTDIR: number; + ENOTEMPTY: number; + ENOTSOCK: number; + ENOTSUP: number; + ENOTTY: number; + ENXIO: number; + EOPNOTSUPP: number; + EOVERFLOW: number; + EPERM: number; + EPIPE: number; + EPROTO: number; + EPROTONOSUPPORT: number; + EPROTOTYPE: number; + ERANGE: number; + EROFS: number; + ESPIPE: number; + ESRCH: number; + ESTALE: number; + ETIME: number; + ETIMEDOUT: number; + ETXTBSY: number; + EWOULDBLOCK: number; + EXDEV: number; + }, + }; + export function arch(): string; + export function platform(): NodeJS.Platform; + export function tmpdir(): string; + export const EOL: string; + export function endianness(): "BE" | "LE"; } declare module "https" { - import * as tls from "tls"; - import * as events from "events"; - import * as http from "http"; + import * as tls from "tls"; + import * as events from "events"; + import * as http from "http"; + import { URL } from "url"; - export interface ServerOptions { - pfx?: any; - key?: any; - passphrase?: string; - cert?: any; - ca?: any; - crl?: any; - ciphers?: string; - honorCipherOrder?: boolean; - requestCert?: boolean; - rejectUnauthorized?: boolean; - NPNProtocols?: any; - SNICallback?: (servername: string, cb: (err: Error, ctx: tls.SecureContext) => any) => any; - } + export type ServerOptions = tls.SecureContextOptions & tls.TlsOptions; - export interface RequestOptions extends http.RequestOptions { - pfx?: any; - key?: any; - passphrase?: string; - cert?: any; - ca?: any; - ciphers?: string; - rejectUnauthorized?: boolean; - secureProtocol?: string; - } + // see https://nodejs.org/docs/latest-v8.x/api/https.html#https_https_request_options_callback + type extendedRequestKeys = "pfx" | + "key" | + "passphrase" | + "cert" | + "ca" | + "ciphers" | + "rejectUnauthorized" | + "secureProtocol" | + "servername"; - export interface Agent extends http.Agent { } + export type RequestOptions = http.RequestOptions & Pick; - export interface AgentOptions extends http.AgentOptions { - pfx?: any; - key?: any; - passphrase?: string; - cert?: any; - ca?: any; - ciphers?: string; - rejectUnauthorized?: boolean; - secureProtocol?: string; - maxCachedSessions?: number; - } + export interface AgentOptions extends http.AgentOptions, tls.ConnectionOptions { + rejectUnauthorized?: boolean; + maxCachedSessions?: number; + } - export var Agent: { - new(options?: AgentOptions): Agent; - }; - export interface Server extends tls.Server { } - export function createServer(options: ServerOptions, requestListener?: Function): Server; - export function request(options: RequestOptions, callback?: (res: http.IncomingMessage) => void): http.ClientRequest; - export function get(options: RequestOptions, callback?: (res: http.IncomingMessage) => void): http.ClientRequest; - export var globalAgent: Agent; + export class Agent extends http.Agent { + constructor(options?: AgentOptions); + options: AgentOptions; + } + + export class Server extends tls.Server { + setTimeout(callback: () => void): this; + setTimeout(msecs?: number, callback?: () => void): this; + timeout: number; + keepAliveTimeout: number; + } + + export function createServer(options: ServerOptions, requestListener?: (req: http.IncomingMessage, res: http.ServerResponse) => void): Server; + export function request(options: RequestOptions | string | URL, callback?: (res: http.IncomingMessage) => void): http.ClientRequest; + export function get(options: RequestOptions | string | URL, callback?: (res: http.IncomingMessage) => void): http.ClientRequest; + export var globalAgent: Agent; } declare module "punycode" { - export function decode(string: string): string; - export function encode(string: string): string; - export function toUnicode(domain: string): string; - export function toASCII(domain: string): string; - export var ucs2: ucs2; - interface ucs2 { - decode(string: string): number[]; - encode(codePoints: number[]): string; - } - export var version: any; + export function decode(string: string): string; + export function encode(string: string): string; + export function toUnicode(domain: string): string; + export function toASCII(domain: string): string; + export var ucs2: ucs2; + interface ucs2 { + decode(string: string): number[]; + encode(codePoints: number[]): string; + } + export var version: any; } declare module "repl" { - import * as stream from "stream"; - import * as readline from "readline"; + import * as stream from "stream"; + import * as readline from "readline"; - export interface ReplOptions { - prompt?: string; - input?: NodeJS.ReadableStream; - output?: NodeJS.WritableStream; - terminal?: boolean; - eval?: Function; - useColors?: boolean; - useGlobal?: boolean; - ignoreUndefined?: boolean; - writer?: Function; - completer?: Function; - replMode?: any; - breakEvalOnSigint?: any; - } + export interface ReplOptions { + prompt?: string; + input?: NodeJS.ReadableStream; + output?: NodeJS.WritableStream; + terminal?: boolean; + eval?: Function; + useColors?: boolean; + useGlobal?: boolean; + ignoreUndefined?: boolean; + writer?: Function; + completer?: Function; + replMode?: any; + breakEvalOnSigint?: any; + } - export interface REPLServer extends readline.ReadLine { - context: any; - defineCommand(keyword: string, cmd: Function | { help: string, action: Function }): void; - displayPrompt(preserveCursor?: boolean): void; + export interface REPLServer extends readline.ReadLine { + context: any; + inputStream: NodeJS.ReadableStream; + outputStream: NodeJS.WritableStream; + + defineCommand(keyword: string, cmd: Function | { help: string, action: Function }): void; + displayPrompt(preserveCursor?: boolean): void; /** * events.EventEmitter * 1. exit * 2. reset - **/ + */ - addListener(event: string, listener: Function): this; - addListener(event: "exit", listener: () => void): this; - addListener(event: "reset", listener: Function): this; + addListener(event: string, listener: (...args: any[]) => void): this; + addListener(event: "exit", listener: () => void): this; + addListener(event: "reset", listener: (...args: any[]) => void): this; - emit(event: string | symbol, ...args: any[]): boolean; - emit(event: "exit"): boolean; - emit(event: "reset", context: any): boolean; + emit(event: string | symbol, ...args: any[]): boolean; + emit(event: "exit"): boolean; + emit(event: "reset", context: any): boolean; - on(event: string, listener: Function): this; - on(event: "exit", listener: () => void): this; - on(event: "reset", listener: Function): this; + on(event: string, listener: (...args: any[]) => void): this; + on(event: "exit", listener: () => void): this; + on(event: "reset", listener: (...args: any[]) => void): this; - once(event: string, listener: Function): this; - once(event: "exit", listener: () => void): this; - once(event: "reset", listener: Function): this; + once(event: string, listener: (...args: any[]) => void): this; + once(event: "exit", listener: () => void): this; + once(event: "reset", listener: (...args: any[]) => void): this; - prependListener(event: string, listener: Function): this; - prependListener(event: "exit", listener: () => void): this; - prependListener(event: "reset", listener: Function): this; + prependListener(event: string, listener: (...args: any[]) => void): this; + prependListener(event: "exit", listener: () => void): this; + prependListener(event: "reset", listener: (...args: any[]) => void): this; - prependOnceListener(event: string, listener: Function): this; - prependOnceListener(event: "exit", listener: () => void): this; - prependOnceListener(event: "reset", listener: Function): this; - } + prependOnceListener(event: string, listener: (...args: any[]) => void): this; + prependOnceListener(event: "exit", listener: () => void): this; + prependOnceListener(event: "reset", listener: (...args: any[]) => void): this; + } - export function start(options?: string | ReplOptions): REPLServer; + export function start(options?: string | ReplOptions): REPLServer; + + export class Recoverable extends SyntaxError { + err: Error; + + constructor(err: Error); + } } declare module "readline" { - import * as events from "events"; - import * as stream from "stream"; + import * as events from "events"; + import * as stream from "stream"; - export interface Key { - sequence?: string; - name?: string; - ctrl?: boolean; - meta?: boolean; - shift?: boolean; - } + export interface Key { + sequence?: string; + name?: string; + ctrl?: boolean; + meta?: boolean; + shift?: boolean; + } - export interface ReadLine extends events.EventEmitter { - setPrompt(prompt: string): void; - prompt(preserveCursor?: boolean): void; - question(query: string, callback: (answer: string) => void): void; - pause(): ReadLine; - resume(): ReadLine; - close(): void; - write(data: string | Buffer, key?: Key): void; + export interface ReadLine extends events.EventEmitter { + setPrompt(prompt: string): void; + prompt(preserveCursor?: boolean): void; + question(query: string, callback: (answer: string) => void): void; + pause(): ReadLine; + resume(): ReadLine; + close(): void; + write(data: string | Buffer, key?: Key): void; /** * events.EventEmitter @@ -1527,138 +1900,141 @@ declare module "readline" { * 5. SIGCONT * 6. SIGINT * 7. SIGTSTP - **/ + */ - addListener(event: string, listener: Function): this; - addListener(event: "close", listener: () => void): this; - addListener(event: "line", listener: (input: any) => void): this; - addListener(event: "pause", listener: () => void): this; - addListener(event: "resume", listener: () => void): this; - addListener(event: "SIGCONT", listener: () => void): this; - addListener(event: "SIGINT", listener: () => void): this; - addListener(event: "SIGTSTP", listener: () => void): this; + addListener(event: string, listener: (...args: any[]) => void): this; + addListener(event: "close", listener: () => void): this; + addListener(event: "line", listener: (input: any) => void): this; + addListener(event: "pause", listener: () => void): this; + addListener(event: "resume", listener: () => void): this; + addListener(event: "SIGCONT", listener: () => void): this; + addListener(event: "SIGINT", listener: () => void): this; + addListener(event: "SIGTSTP", listener: () => void): this; - emit(event: string | symbol, ...args: any[]): boolean; - emit(event: "close"): boolean; - emit(event: "line", input: any): boolean; - emit(event: "pause"): boolean; - emit(event: "resume"): boolean; - emit(event: "SIGCONT"): boolean; - emit(event: "SIGINT"): boolean; - emit(event: "SIGTSTP"): boolean; + emit(event: string | symbol, ...args: any[]): boolean; + emit(event: "close"): boolean; + emit(event: "line", input: any): boolean; + emit(event: "pause"): boolean; + emit(event: "resume"): boolean; + emit(event: "SIGCONT"): boolean; + emit(event: "SIGINT"): boolean; + emit(event: "SIGTSTP"): boolean; - on(event: string, listener: Function): this; - on(event: "close", listener: () => void): this; - on(event: "line", listener: (input: any) => void): this; - on(event: "pause", listener: () => void): this; - on(event: "resume", listener: () => void): this; - on(event: "SIGCONT", listener: () => void): this; - on(event: "SIGINT", listener: () => void): this; - on(event: "SIGTSTP", listener: () => void): this; + on(event: string, listener: (...args: any[]) => void): this; + on(event: "close", listener: () => void): this; + on(event: "line", listener: (input: any) => void): this; + on(event: "pause", listener: () => void): this; + on(event: "resume", listener: () => void): this; + on(event: "SIGCONT", listener: () => void): this; + on(event: "SIGINT", listener: () => void): this; + on(event: "SIGTSTP", listener: () => void): this; - once(event: string, listener: Function): this; - once(event: "close", listener: () => void): this; - once(event: "line", listener: (input: any) => void): this; - once(event: "pause", listener: () => void): this; - once(event: "resume", listener: () => void): this; - once(event: "SIGCONT", listener: () => void): this; - once(event: "SIGINT", listener: () => void): this; - once(event: "SIGTSTP", listener: () => void): this; + once(event: string, listener: (...args: any[]) => void): this; + once(event: "close", listener: () => void): this; + once(event: "line", listener: (input: any) => void): this; + once(event: "pause", listener: () => void): this; + once(event: "resume", listener: () => void): this; + once(event: "SIGCONT", listener: () => void): this; + once(event: "SIGINT", listener: () => void): this; + once(event: "SIGTSTP", listener: () => void): this; - prependListener(event: string, listener: Function): this; - prependListener(event: "close", listener: () => void): this; - prependListener(event: "line", listener: (input: any) => void): this; - prependListener(event: "pause", listener: () => void): this; - prependListener(event: "resume", listener: () => void): this; - prependListener(event: "SIGCONT", listener: () => void): this; - prependListener(event: "SIGINT", listener: () => void): this; - prependListener(event: "SIGTSTP", listener: () => void): this; + prependListener(event: string, listener: (...args: any[]) => void): this; + prependListener(event: "close", listener: () => void): this; + prependListener(event: "line", listener: (input: any) => void): this; + prependListener(event: "pause", listener: () => void): this; + prependListener(event: "resume", listener: () => void): this; + prependListener(event: "SIGCONT", listener: () => void): this; + prependListener(event: "SIGINT", listener: () => void): this; + prependListener(event: "SIGTSTP", listener: () => void): this; - prependOnceListener(event: string, listener: Function): this; - prependOnceListener(event: "close", listener: () => void): this; - prependOnceListener(event: "line", listener: (input: any) => void): this; - prependOnceListener(event: "pause", listener: () => void): this; - prependOnceListener(event: "resume", listener: () => void): this; - prependOnceListener(event: "SIGCONT", listener: () => void): this; - prependOnceListener(event: "SIGINT", listener: () => void): this; - prependOnceListener(event: "SIGTSTP", listener: () => void): this; - } + prependOnceListener(event: string, listener: (...args: any[]) => void): this; + prependOnceListener(event: "close", listener: () => void): this; + prependOnceListener(event: "line", listener: (input: any) => void): this; + prependOnceListener(event: "pause", listener: () => void): this; + prependOnceListener(event: "resume", listener: () => void): this; + prependOnceListener(event: "SIGCONT", listener: () => void): this; + prependOnceListener(event: "SIGINT", listener: () => void): this; + prependOnceListener(event: "SIGTSTP", listener: () => void): this; + } - type Completer = (line: string) => CompleterResult; - type AsyncCompleter = (line: string, callback: (err: any, result: CompleterResult) => void) => any; + type Completer = (line: string) => CompleterResult; + type AsyncCompleter = (line: string, callback: (err: any, result: CompleterResult) => void) => any; - export type CompleterResult = [string[], string]; + export type CompleterResult = [string[], string]; - export interface ReadLineOptions { - input: NodeJS.ReadableStream; - output?: NodeJS.WritableStream; - completer?: Completer | AsyncCompleter; - terminal?: boolean; - historySize?: number; - prompt?: string; - crlfDelay?: number; - removeHistoryDuplicates?: boolean; - } + export interface ReadLineOptions { + input: NodeJS.ReadableStream; + output?: NodeJS.WritableStream; + completer?: Completer | AsyncCompleter; + terminal?: boolean; + historySize?: number; + prompt?: string; + crlfDelay?: number; + removeHistoryDuplicates?: boolean; + } - export function createInterface(input: NodeJS.ReadableStream, output?: NodeJS.WritableStream, completer?: Completer | AsyncCompleter, terminal?: boolean): ReadLine; - export function createInterface(options: ReadLineOptions): ReadLine; + export function createInterface(input: NodeJS.ReadableStream, output?: NodeJS.WritableStream, completer?: Completer | AsyncCompleter, terminal?: boolean): ReadLine; + export function createInterface(options: ReadLineOptions): ReadLine; - export function cursorTo(stream: NodeJS.WritableStream, x: number, y: number): void; - export function moveCursor(stream: NodeJS.WritableStream, dx: number | string, dy: number | string): void; - export function clearLine(stream: NodeJS.WritableStream, dir: number): void; - export function clearScreenDown(stream: NodeJS.WritableStream): void; + export function cursorTo(stream: NodeJS.WritableStream, x: number, y?: number): void; + export function emitKeypressEvents(stream: NodeJS.ReadableStream, interface?: ReadLine): void; + export function moveCursor(stream: NodeJS.WritableStream, dx: number | string, dy: number | string): void; + export function clearLine(stream: NodeJS.WritableStream, dir: number): void; + export function clearScreenDown(stream: NodeJS.WritableStream): void; } declare module "vm" { - export interface Context { } - export interface ScriptOptions { - filename?: string; - lineOffset?: number; - columnOffset?: number; - displayErrors?: boolean; - timeout?: number; - cachedData?: Buffer; - produceCachedData?: boolean; - } - export interface RunningScriptOptions { - filename?: string; - lineOffset?: number; - columnOffset?: number; - displayErrors?: boolean; - timeout?: number; - } - export class Script { - constructor(code: string, options?: ScriptOptions); - runInContext(contextifiedSandbox: Context, options?: RunningScriptOptions): any; - runInNewContext(sandbox?: Context, options?: RunningScriptOptions): any; - runInThisContext(options?: RunningScriptOptions): any; - } - export function createContext(sandbox?: Context): Context; - export function isContext(sandbox: Context): boolean; - export function runInContext(code: string, contextifiedSandbox: Context, options?: RunningScriptOptions): any; - export function runInDebugContext(code: string): any; - export function runInNewContext(code: string, sandbox?: Context, options?: RunningScriptOptions): any; - export function runInThisContext(code: string, options?: RunningScriptOptions): any; + export interface Context { } + export interface ScriptOptions { + filename?: string; + lineOffset?: number; + columnOffset?: number; + displayErrors?: boolean; + timeout?: number; + cachedData?: Buffer; + produceCachedData?: boolean; + } + export interface RunningScriptOptions { + filename?: string; + lineOffset?: number; + columnOffset?: number; + displayErrors?: boolean; + timeout?: number; + } + export class Script { + constructor(code: string, options?: ScriptOptions); + runInContext(contextifiedSandbox: Context, options?: RunningScriptOptions): any; + runInNewContext(sandbox?: Context, options?: RunningScriptOptions): any; + runInThisContext(options?: RunningScriptOptions): any; + } + export function createContext(sandbox?: Context): Context; + export function isContext(sandbox: Context): boolean; + export function runInContext(code: string, contextifiedSandbox: Context, options?: RunningScriptOptions | string): any; + export function runInDebugContext(code: string): any; + export function runInNewContext(code: string, sandbox?: Context, options?: RunningScriptOptions | string): any; + export function runInThisContext(code: string, options?: RunningScriptOptions | string): any; } declare module "child_process" { - import * as events from "events"; - import * as stream from "stream"; - import * as net from "net"; + import * as events from "events"; + import * as stream from "stream"; + import * as net from "net"; - export interface ChildProcess extends events.EventEmitter { - stdin: stream.Writable; - stdout: stream.Readable; - stderr: stream.Readable; - stdio: [stream.Writable, stream.Readable, stream.Readable]; - killed: boolean; - pid: number; - kill(signal?: string): void; - send(message: any, sendHandle?: any): boolean; - connected: boolean; - disconnect(): void; - unref(): void; - ref(): void; + export interface ChildProcess extends events.EventEmitter { + stdin: stream.Writable; + stdout: stream.Readable; + stderr: stream.Readable; + stdio: [stream.Writable, stream.Readable, stream.Readable]; + killed: boolean; + pid: number; + kill(signal?: string): void; + send(message: any, callback?: (error: Error) => void): boolean; + send(message: any, sendHandle?: net.Socket | net.Server, callback?: (error: Error) => void): boolean; + send(message: any, sendHandle?: net.Socket | net.Server, options?: MessageOptions, callback?: (error: Error) => void): boolean; + connected: boolean; + disconnect(): void; + unref(): void; + ref(): void; /** * events.EventEmitter @@ -1667,464 +2043,625 @@ declare module "child_process" { * 3. error * 4. exit * 5. message - **/ + */ - addListener(event: string, listener: Function): this; - addListener(event: "close", listener: (code: number, signal: string) => void): this; - addListener(event: "disconnect", listener: () => void): this; - addListener(event: "error", listener: (err: Error) => void): this; - addListener(event: "exit", listener: (code: number, signal: string) => void): this; - addListener(event: "message", listener: (message: any, sendHandle: net.Socket | net.Server) => void): this; + addListener(event: string, listener: (...args: any[]) => void): this; + addListener(event: "close", listener: (code: number, signal: string) => void): this; + addListener(event: "disconnect", listener: () => void): this; + addListener(event: "error", listener: (err: Error) => void): this; + addListener(event: "exit", listener: (code: number, signal: string) => void): this; + addListener(event: "message", listener: (message: any, sendHandle: net.Socket | net.Server) => void): this; - emit(event: string | symbol, ...args: any[]): boolean; - emit(event: "close", code: number, signal: string): boolean; - emit(event: "disconnect"): boolean; - emit(event: "error", err: Error): boolean; - emit(event: "exit", code: number, signal: string): boolean; - emit(event: "message", message: any, sendHandle: net.Socket | net.Server): boolean; + emit(event: string | symbol, ...args: any[]): boolean; + emit(event: "close", code: number, signal: string): boolean; + emit(event: "disconnect"): boolean; + emit(event: "error", err: Error): boolean; + emit(event: "exit", code: number, signal: string): boolean; + emit(event: "message", message: any, sendHandle: net.Socket | net.Server): boolean; - on(event: string, listener: Function): this; - on(event: "close", listener: (code: number, signal: string) => void): this; - on(event: "disconnect", listener: () => void): this; - on(event: "error", listener: (err: Error) => void): this; - on(event: "exit", listener: (code: number, signal: string) => void): this; - on(event: "message", listener: (message: any, sendHandle: net.Socket | net.Server) => void): this; + on(event: string, listener: (...args: any[]) => void): this; + on(event: "close", listener: (code: number, signal: string) => void): this; + on(event: "disconnect", listener: () => void): this; + on(event: "error", listener: (err: Error) => void): this; + on(event: "exit", listener: (code: number, signal: string) => void): this; + on(event: "message", listener: (message: any, sendHandle: net.Socket | net.Server) => void): this; - once(event: string, listener: Function): this; - once(event: "close", listener: (code: number, signal: string) => void): this; - once(event: "disconnect", listener: () => void): this; - once(event: "error", listener: (err: Error) => void): this; - once(event: "exit", listener: (code: number, signal: string) => void): this; - once(event: "message", listener: (message: any, sendHandle: net.Socket | net.Server) => void): this; + once(event: string, listener: (...args: any[]) => void): this; + once(event: "close", listener: (code: number, signal: string) => void): this; + once(event: "disconnect", listener: () => void): this; + once(event: "error", listener: (err: Error) => void): this; + once(event: "exit", listener: (code: number, signal: string) => void): this; + once(event: "message", listener: (message: any, sendHandle: net.Socket | net.Server) => void): this; - prependListener(event: string, listener: Function): this; - prependListener(event: "close", listener: (code: number, signal: string) => void): this; - prependListener(event: "disconnect", listener: () => void): this; - prependListener(event: "error", listener: (err: Error) => void): this; - prependListener(event: "exit", listener: (code: number, signal: string) => void): this; - prependListener(event: "message", listener: (message: any, sendHandle: net.Socket | net.Server) => void): this; + prependListener(event: string, listener: (...args: any[]) => void): this; + prependListener(event: "close", listener: (code: number, signal: string) => void): this; + prependListener(event: "disconnect", listener: () => void): this; + prependListener(event: "error", listener: (err: Error) => void): this; + prependListener(event: "exit", listener: (code: number, signal: string) => void): this; + prependListener(event: "message", listener: (message: any, sendHandle: net.Socket | net.Server) => void): this; - prependOnceListener(event: string, listener: Function): this; - prependOnceListener(event: "close", listener: (code: number, signal: string) => void): this; - prependOnceListener(event: "disconnect", listener: () => void): this; - prependOnceListener(event: "error", listener: (err: Error) => void): this; - prependOnceListener(event: "exit", listener: (code: number, signal: string) => void): this; - prependOnceListener(event: "message", listener: (message: any, sendHandle: net.Socket | net.Server) => void): this; - } + prependOnceListener(event: string, listener: (...args: any[]) => void): this; + prependOnceListener(event: "close", listener: (code: number, signal: string) => void): this; + prependOnceListener(event: "disconnect", listener: () => void): this; + prependOnceListener(event: "error", listener: (err: Error) => void): this; + prependOnceListener(event: "exit", listener: (code: number, signal: string) => void): this; + prependOnceListener(event: "message", listener: (message: any, sendHandle: net.Socket | net.Server) => void): this; + } - export interface SpawnOptions { - cwd?: string; - env?: any; - stdio?: any; - detached?: boolean; - uid?: number; - gid?: number; - shell?: boolean | string; - windowsVerbatimArguments?: boolean; - } - export function spawn(command: string, args?: string[], options?: SpawnOptions): ChildProcess; + export interface MessageOptions { + keepOpen?: boolean; + } - export interface ExecOptions { - cwd?: string; - env?: any; - shell?: string; - timeout?: number; - maxBuffer?: number; - killSignal?: string; - uid?: number; - gid?: number; - } - export interface ExecOptionsWithStringEncoding extends ExecOptions { - encoding: BufferEncoding; - } - export interface ExecOptionsWithBufferEncoding extends ExecOptions { - encoding: string; // specify `null`. - } - export function exec(command: string, callback?: (error: Error, stdout: string, stderr: string) => void): ChildProcess; - export function exec(command: string, options: ExecOptionsWithStringEncoding, callback?: (error: Error, stdout: string, stderr: string) => void): ChildProcess; - // usage. child_process.exec("tsc", {encoding: null as string}, (err, stdout, stderr) => {}); - export function exec(command: string, options: ExecOptionsWithBufferEncoding, callback?: (error: Error, stdout: Buffer, stderr: Buffer) => void): ChildProcess; - export function exec(command: string, options: ExecOptions, callback?: (error: Error, stdout: string, stderr: string) => void): ChildProcess; + export interface SpawnOptions { + cwd?: string; + env?: any; + stdio?: any; + detached?: boolean; + uid?: number; + gid?: number; + shell?: boolean | string; + windowsVerbatimArguments?: boolean; + windowsHide?: boolean; + } - export interface ExecFileOptions { - cwd?: string; - env?: any; - timeout?: number; - maxBuffer?: number; - killSignal?: string; - uid?: number; - gid?: number; - } - export interface ExecFileOptionsWithStringEncoding extends ExecFileOptions { - encoding: BufferEncoding; - } - export interface ExecFileOptionsWithBufferEncoding extends ExecFileOptions { - encoding: string; // specify `null`. - } - export function execFile(file: string, callback?: (error: Error, stdout: string, stderr: string) => void): ChildProcess; - export function execFile(file: string, options?: ExecFileOptionsWithStringEncoding, callback?: (error: Error, stdout: string, stderr: string) => void): ChildProcess; - // usage. child_process.execFile("file.sh", {encoding: null as string}, (err, stdout, stderr) => {}); - export function execFile(file: string, options?: ExecFileOptionsWithBufferEncoding, callback?: (error: Error, stdout: Buffer, stderr: Buffer) => void): ChildProcess; - export function execFile(file: string, options?: ExecFileOptions, callback?: (error: Error, stdout: string, stderr: string) => void): ChildProcess; - export function execFile(file: string, args?: string[], callback?: (error: Error, stdout: string, stderr: string) => void): ChildProcess; - export function execFile(file: string, args?: string[], options?: ExecFileOptionsWithStringEncoding, callback?: (error: Error, stdout: string, stderr: string) => void): ChildProcess; - // usage. child_process.execFile("file.sh", ["foo"], {encoding: null as string}, (err, stdout, stderr) => {}); - export function execFile(file: string, args?: string[], options?: ExecFileOptionsWithBufferEncoding, callback?: (error: Error, stdout: Buffer, stderr: Buffer) => void): ChildProcess; - export function execFile(file: string, args?: string[], options?: ExecFileOptions, callback?: (error: Error, stdout: string, stderr: string) => void): ChildProcess; + export function spawn(command: string, args?: ReadonlyArray, options?: SpawnOptions): ChildProcess; - export interface ForkOptions { - cwd?: string; - env?: any; - execPath?: string; - execArgv?: string[]; - silent?: boolean; - stdio?: any[]; - uid?: number; - gid?: number; - } - export function fork(modulePath: string, args?: string[], options?: ForkOptions): ChildProcess; + export interface ExecOptions { + cwd?: string; + env?: any; + shell?: string; + timeout?: number; + maxBuffer?: number; + killSignal?: string; + uid?: number; + gid?: number; + windowsHide?: boolean; + } - export interface SpawnSyncOptions { - cwd?: string; - input?: string | Buffer; - stdio?: any; - env?: any; - uid?: number; - gid?: number; - timeout?: number; - killSignal?: string; - maxBuffer?: number; - encoding?: string; - shell?: boolean | string; - } - export interface SpawnSyncOptionsWithStringEncoding extends SpawnSyncOptions { - encoding: BufferEncoding; - } - export interface SpawnSyncOptionsWithBufferEncoding extends SpawnSyncOptions { - encoding: string; // specify `null`. - } - export interface SpawnSyncReturns { - pid: number; - output: string[]; - stdout: T; - stderr: T; - status: number; - signal: string; - error: Error; - } - export function spawnSync(command: string): SpawnSyncReturns; - export function spawnSync(command: string, options?: SpawnSyncOptionsWithStringEncoding): SpawnSyncReturns; - export function spawnSync(command: string, options?: SpawnSyncOptionsWithBufferEncoding): SpawnSyncReturns; - export function spawnSync(command: string, options?: SpawnSyncOptions): SpawnSyncReturns; - export function spawnSync(command: string, args?: string[], options?: SpawnSyncOptionsWithStringEncoding): SpawnSyncReturns; - export function spawnSync(command: string, args?: string[], options?: SpawnSyncOptionsWithBufferEncoding): SpawnSyncReturns; - export function spawnSync(command: string, args?: string[], options?: SpawnSyncOptions): SpawnSyncReturns; + export interface ExecOptionsWithStringEncoding extends ExecOptions { + encoding: BufferEncoding; + } - export interface ExecSyncOptions { - cwd?: string; - input?: string | Buffer; - stdio?: any; - env?: any; - shell?: string; - uid?: number; - gid?: number; - timeout?: number; - killSignal?: string; - maxBuffer?: number; - encoding?: string; - } - export interface ExecSyncOptionsWithStringEncoding extends ExecSyncOptions { - encoding: BufferEncoding; - } - export interface ExecSyncOptionsWithBufferEncoding extends ExecSyncOptions { - encoding: string; // specify `null`. - } - export function execSync(command: string): Buffer; - export function execSync(command: string, options?: ExecSyncOptionsWithStringEncoding): string; - export function execSync(command: string, options?: ExecSyncOptionsWithBufferEncoding): Buffer; - export function execSync(command: string, options?: ExecSyncOptions): Buffer; + export interface ExecOptionsWithBufferEncoding extends ExecOptions { + encoding: string | null; // specify `null`. + } - export interface ExecFileSyncOptions { - cwd?: string; - input?: string | Buffer; - stdio?: any; - env?: any; - uid?: number; - gid?: number; - timeout?: number; - killSignal?: string; - maxBuffer?: number; - encoding?: string; - } - export interface ExecFileSyncOptionsWithStringEncoding extends ExecFileSyncOptions { - encoding: BufferEncoding; - } - export interface ExecFileSyncOptionsWithBufferEncoding extends ExecFileSyncOptions { - encoding: string; // specify `null`. - } - export function execFileSync(command: string): Buffer; - export function execFileSync(command: string, options?: ExecFileSyncOptionsWithStringEncoding): string; - export function execFileSync(command: string, options?: ExecFileSyncOptionsWithBufferEncoding): Buffer; - export function execFileSync(command: string, options?: ExecFileSyncOptions): Buffer; - export function execFileSync(command: string, args?: string[], options?: ExecFileSyncOptionsWithStringEncoding): string; - export function execFileSync(command: string, args?: string[], options?: ExecFileSyncOptionsWithBufferEncoding): Buffer; - export function execFileSync(command: string, args?: string[], options?: ExecFileSyncOptions): Buffer; + // no `options` definitely means stdout/stderr are `string`. + export function exec(command: string, callback?: (error: Error | null, stdout: string, stderr: string) => void): ChildProcess; + + // `options` with `"buffer"` or `null` for `encoding` means stdout/stderr are definitely `Buffer`. + export function exec(command: string, options: { encoding: "buffer" | null } & ExecOptions, callback?: (error: Error | null, stdout: Buffer, stderr: Buffer) => void): ChildProcess; + + // `options` with well known `encoding` means stdout/stderr are definitely `string`. + export function exec(command: string, options: { encoding: BufferEncoding } & ExecOptions, callback?: (error: Error | null, stdout: string, stderr: string) => void): ChildProcess; + + // `options` with an `encoding` whose type is `string` means stdout/stderr could either be `Buffer` or `string`. + // There is no guarantee the `encoding` is unknown as `string` is a superset of `BufferEncoding`. + export function exec(command: string, options: { encoding: string } & ExecOptions, callback?: (error: Error | null, stdout: string | Buffer, stderr: string | Buffer) => void): ChildProcess; + + // `options` without an `encoding` means stdout/stderr are definitely `string`. + export function exec(command: string, options: ExecOptions, callback?: (error: Error | null, stdout: string, stderr: string) => void): ChildProcess; + + // fallback if nothing else matches. Worst case is always `string | Buffer`. + export function exec(command: string, options: ({ encoding?: string | null } & ExecOptions) | undefined | null, callback?: (error: Error | null, stdout: string | Buffer, stderr: string | Buffer) => void): ChildProcess; + + // NOTE: This namespace provides design-time support for util.promisify. Exported members do not exist at runtime. + export namespace exec { + export function __promisify__(command: string): Promise<{ stdout: string, stderr: string }>; + export function __promisify__(command: string, options: { encoding: "buffer" | null } & ExecOptions): Promise<{ stdout: Buffer, stderr: Buffer }>; + export function __promisify__(command: string, options: { encoding: BufferEncoding } & ExecOptions): Promise<{ stdout: string, stderr: string }>; + export function __promisify__(command: string, options: ExecOptions): Promise<{ stdout: string, stderr: string }>; + export function __promisify__(command: string, options?: ({ encoding?: string | null } & ExecOptions) | null): Promise<{ stdout: string | Buffer, stderr: string | Buffer }>; + } + + export interface ExecFileOptions { + cwd?: string; + env?: any; + timeout?: number; + maxBuffer?: number; + killSignal?: string; + uid?: number; + gid?: number; + windowsHide?: boolean; + windowsVerbatimArguments?: boolean; + } + export interface ExecFileOptionsWithStringEncoding extends ExecFileOptions { + encoding: BufferEncoding; + } + export interface ExecFileOptionsWithBufferEncoding extends ExecFileOptions { + encoding: 'buffer' | null; + } + export interface ExecFileOptionsWithOtherEncoding extends ExecFileOptions { + encoding: string; + } + + export function execFile(file: string): ChildProcess; + export function execFile(file: string, options: ({ encoding?: string | null } & ExecFileOptions) | undefined | null): ChildProcess; + export function execFile(file: string, args: string[] | undefined | null): ChildProcess; + export function execFile(file: string, args: string[] | undefined | null, options: ({ encoding?: string | null } & ExecFileOptions) | undefined | null): ChildProcess; + + // no `options` definitely means stdout/stderr are `string`. + export function execFile(file: string, callback: (error: Error | null, stdout: string, stderr: string) => void): ChildProcess; + export function execFile(file: string, args: string[] | undefined | null, callback: (error: Error | null, stdout: string, stderr: string) => void): ChildProcess; + + // `options` with `"buffer"` or `null` for `encoding` means stdout/stderr are definitely `Buffer`. + export function execFile(file: string, options: ExecFileOptionsWithBufferEncoding, callback: (error: Error | null, stdout: Buffer, stderr: Buffer) => void): ChildProcess; + export function execFile(file: string, args: string[] | undefined | null, options: ExecFileOptionsWithBufferEncoding, callback: (error: Error | null, stdout: Buffer, stderr: Buffer) => void): ChildProcess; + + // `options` with well known `encoding` means stdout/stderr are definitely `string`. + export function execFile(file: string, options: ExecFileOptionsWithStringEncoding, callback: (error: Error | null, stdout: string, stderr: string) => void): ChildProcess; + export function execFile(file: string, args: string[] | undefined | null, options: ExecFileOptionsWithStringEncoding, callback: (error: Error | null, stdout: string, stderr: string) => void): ChildProcess; + + // `options` with an `encoding` whose type is `string` means stdout/stderr could either be `Buffer` or `string`. + // There is no guarantee the `encoding` is unknown as `string` is a superset of `BufferEncoding`. + export function execFile(file: string, options: ExecFileOptionsWithOtherEncoding, callback: (error: Error | null, stdout: string | Buffer, stderr: string | Buffer) => void): ChildProcess; + export function execFile(file: string, args: string[] | undefined | null, options: ExecFileOptionsWithOtherEncoding, callback: (error: Error | null, stdout: string | Buffer, stderr: string | Buffer) => void): ChildProcess; + + // `options` without an `encoding` means stdout/stderr are definitely `string`. + export function execFile(file: string, options: ExecFileOptions, callback: (error: Error | null, stdout: string, stderr: string) => void): ChildProcess; + export function execFile(file: string, args: string[] | undefined | null, options: ExecFileOptions, callback: (error: Error | null, stdout: string, stderr: string) => void): ChildProcess; + + // fallback if nothing else matches. Worst case is always `string | Buffer`. + export function execFile(file: string, options: ({ encoding?: string | null } & ExecFileOptions) | undefined | null, callback: ((error: Error | null, stdout: string | Buffer, stderr: string | Buffer) => void) | undefined | null): ChildProcess; + export function execFile(file: string, args: string[] | undefined | null, options: ({ encoding?: string | null } & ExecFileOptions) | undefined | null, callback: ((error: Error | null, stdout: string | Buffer, stderr: string | Buffer) => void) | undefined | null): ChildProcess; + + // NOTE: This namespace provides design-time support for util.promisify. Exported members do not exist at runtime. + export namespace execFile { + export function __promisify__(file: string): Promise<{ stdout: string, stderr: string }>; + export function __promisify__(file: string, args: string[] | undefined | null): Promise<{ stdout: string, stderr: string }>; + export function __promisify__(file: string, options: ExecFileOptionsWithBufferEncoding): Promise<{ stdout: Buffer, stderr: Buffer }>; + export function __promisify__(file: string, args: string[] | undefined | null, options: ExecFileOptionsWithBufferEncoding): Promise<{ stdout: Buffer, stderr: Buffer }>; + export function __promisify__(file: string, options: ExecFileOptionsWithStringEncoding): Promise<{ stdout: string, stderr: string }>; + export function __promisify__(file: string, args: string[] | undefined | null, options: ExecFileOptionsWithStringEncoding): Promise<{ stdout: string, stderr: string }>; + export function __promisify__(file: string, options: ExecFileOptionsWithOtherEncoding): Promise<{ stdout: string | Buffer, stderr: string | Buffer }>; + export function __promisify__(file: string, args: string[] | undefined | null, options: ExecFileOptionsWithOtherEncoding): Promise<{ stdout: string | Buffer, stderr: string | Buffer }>; + export function __promisify__(file: string, options: ExecFileOptions): Promise<{ stdout: string, stderr: string }>; + export function __promisify__(file: string, args: string[] | undefined | null, options: ExecFileOptions): Promise<{ stdout: string, stderr: string }>; + export function __promisify__(file: string, options: ({ encoding?: string | null } & ExecFileOptions) | undefined | null): Promise<{ stdout: string | Buffer, stderr: string | Buffer }>; + export function __promisify__(file: string, args: string[] | undefined | null, options: ({ encoding?: string | null } & ExecFileOptions) | undefined | null): Promise<{ stdout: string | Buffer, stderr: string | Buffer }>; + } + + export interface ForkOptions { + cwd?: string; + env?: any; + execPath?: string; + execArgv?: string[]; + silent?: boolean; + stdio?: any[]; + uid?: number; + gid?: number; + windowsVerbatimArguments?: boolean; + } + export function fork(modulePath: string, args?: string[], options?: ForkOptions): ChildProcess; + + export interface SpawnSyncOptions { + cwd?: string; + input?: string | Buffer; + stdio?: any; + env?: any; + uid?: number; + gid?: number; + timeout?: number; + killSignal?: string; + maxBuffer?: number; + encoding?: string; + shell?: boolean | string; + windowsHide?: boolean; + windowsVerbatimArguments?: boolean; + } + export interface SpawnSyncOptionsWithStringEncoding extends SpawnSyncOptions { + encoding: BufferEncoding; + } + export interface SpawnSyncOptionsWithBufferEncoding extends SpawnSyncOptions { + encoding: string; // specify `null`. + } + export interface SpawnSyncReturns { + pid: number; + output: string[]; + stdout: T; + stderr: T; + status: number; + signal: string; + error: Error; + } + export function spawnSync(command: string): SpawnSyncReturns; + export function spawnSync(command: string, options?: SpawnSyncOptionsWithStringEncoding): SpawnSyncReturns; + export function spawnSync(command: string, options?: SpawnSyncOptionsWithBufferEncoding): SpawnSyncReturns; + export function spawnSync(command: string, options?: SpawnSyncOptions): SpawnSyncReturns; + export function spawnSync(command: string, args?: string[], options?: SpawnSyncOptionsWithStringEncoding): SpawnSyncReturns; + export function spawnSync(command: string, args?: string[], options?: SpawnSyncOptionsWithBufferEncoding): SpawnSyncReturns; + export function spawnSync(command: string, args?: string[], options?: SpawnSyncOptions): SpawnSyncReturns; + + export interface ExecSyncOptions { + cwd?: string; + input?: string | Buffer; + stdio?: any; + env?: any; + shell?: string; + uid?: number; + gid?: number; + timeout?: number; + killSignal?: string; + maxBuffer?: number; + encoding?: string; + windowsHide?: boolean; + } + export interface ExecSyncOptionsWithStringEncoding extends ExecSyncOptions { + encoding: BufferEncoding; + } + export interface ExecSyncOptionsWithBufferEncoding extends ExecSyncOptions { + encoding: string; // specify `null`. + } + export function execSync(command: string): Buffer; + export function execSync(command: string, options?: ExecSyncOptionsWithStringEncoding): string; + export function execSync(command: string, options?: ExecSyncOptionsWithBufferEncoding): Buffer; + export function execSync(command: string, options?: ExecSyncOptions): Buffer; + + export interface ExecFileSyncOptions { + cwd?: string; + input?: string | Buffer; + stdio?: any; + env?: any; + uid?: number; + gid?: number; + timeout?: number; + killSignal?: string; + maxBuffer?: number; + encoding?: string; + windowsHide?: boolean; + } + export interface ExecFileSyncOptionsWithStringEncoding extends ExecFileSyncOptions { + encoding: BufferEncoding; + } + export interface ExecFileSyncOptionsWithBufferEncoding extends ExecFileSyncOptions { + encoding: string; // specify `null`. + } + export function execFileSync(command: string): Buffer; + export function execFileSync(command: string, options?: ExecFileSyncOptionsWithStringEncoding): string; + export function execFileSync(command: string, options?: ExecFileSyncOptionsWithBufferEncoding): Buffer; + export function execFileSync(command: string, options?: ExecFileSyncOptions): Buffer; + export function execFileSync(command: string, args?: string[], options?: ExecFileSyncOptionsWithStringEncoding): string; + export function execFileSync(command: string, args?: string[], options?: ExecFileSyncOptionsWithBufferEncoding): Buffer; + export function execFileSync(command: string, args?: string[], options?: ExecFileSyncOptions): Buffer; } declare module "url" { - export interface Url { - href?: string; - protocol?: string; - auth?: string; - hostname?: string; - port?: string; - host?: string; - pathname?: string; - search?: string; - query?: string | any; - slashes?: boolean; - hash?: string; - path?: string; - } + import { ParsedUrlQuery } from 'querystring'; - export interface UrlObject { - protocol?: string; - slashes?: boolean; - auth?: string; - host?: string; - hostname?: string; - port?: string | number; - pathname?: string; - search?: string; - query?: { [key: string]: any; }; - hash?: string; - } + export interface UrlObjectCommon { + auth?: string; + hash?: string; + host?: string; + hostname?: string; + href?: string; + path?: string; + pathname?: string; + protocol?: string; + search?: string; + slashes?: boolean; + } - export function parse(urlStr: string, parseQueryString?: boolean, slashesDenoteHost?: boolean): Url; - export function format(URL: URL, options?: URLFormatOptions): string; - export function format(urlObject: UrlObject): string; - export function resolve(from: string, to: string): string; + // Input to `url.format` + export interface UrlObject extends UrlObjectCommon { + port?: string | number; + query?: string | null | { [key: string]: any }; + } - export interface URLFormatOptions { - auth?: boolean; - fragment?: boolean; - search?: boolean; - unicode?: boolean; - } + // Output of `url.parse` + export interface Url extends UrlObjectCommon { + port?: string; + query?: string | null | ParsedUrlQuery; + } - export class URLSearchParams implements Iterable { - constructor(init?: URLSearchParams | string | { [key: string]: string | string[] } | Iterable); - append(name: string, value: string): void; - delete(name: string): void; - entries(): Iterator; - forEach(callback: (value: string, name: string) => void): void; - get(name: string): string | null; - getAll(name: string): string[]; - has(name: string): boolean; - keys(): Iterator; - set(name: string, value: string): void; - sort(): void; - toString(): string; - values(): Iterator; - [Symbol.iterator](): Iterator; - } + export interface UrlWithParsedQuery extends Url { + query: ParsedUrlQuery; + } - export class URL { - constructor(input: string, base?: string | URL); - hash: string; - host: string; - hostname: string; - href: string; - readonly origin: string; - password: string; - pathname: string; - port: string; - protocol: string; - search: string; - readonly searchParams: URLSearchParams; - username: string; - toString(): string; - toJSON(): string; - } + export interface UrlWithStringQuery extends Url { + query: string | null; + } + + export function parse(urlStr: string): UrlWithStringQuery; + export function parse(urlStr: string, parseQueryString: false | undefined, slashesDenoteHost?: boolean): UrlWithStringQuery; + export function parse(urlStr: string, parseQueryString: true, slashesDenoteHost?: boolean): UrlWithParsedQuery; + export function parse(urlStr: string, parseQueryString: boolean, slashesDenoteHost?: boolean): Url; + + export function format(URL: URL, options?: URLFormatOptions): string; + export function format(urlObject: UrlObject | string): string; + export function resolve(from: string, to: string): string; + + export function domainToASCII(domain: string): string; + export function domainToUnicode(domain: string): string; + + export interface URLFormatOptions { + auth?: boolean; + fragment?: boolean; + search?: boolean; + unicode?: boolean; + } + + export class URLSearchParams implements Iterable<[string, string]> { + constructor(init?: URLSearchParams | string | { [key: string]: string | string[] | undefined } | Iterable<[string, string]> | Array<[string, string]>); + append(name: string, value: string): void; + delete(name: string): void; + entries(): IterableIterator<[string, string]>; + forEach(callback: (value: string, name: string) => void): void; + get(name: string): string | null; + getAll(name: string): string[]; + has(name: string): boolean; + keys(): IterableIterator; + set(name: string, value: string): void; + sort(): void; + toString(): string; + values(): IterableIterator; + [Symbol.iterator](): IterableIterator<[string, string]>; + } + + export class URL { + constructor(input: string, base?: string | URL); + hash: string; + host: string; + hostname: string; + href: string; + readonly origin: string; + password: string; + pathname: string; + port: string; + protocol: string; + search: string; + readonly searchParams: URLSearchParams; + username: string; + toString(): string; + toJSON(): string; + } } declare module "dns" { - // Supported getaddrinfo flags. - export const ADDRCONFIG: number; - export const V4MAPPED: number; + // Supported getaddrinfo flags. + export const ADDRCONFIG: number; + export const V4MAPPED: number; - export interface LookupOptions { - family?: number; - hints?: number; - all?: boolean; - } + export interface LookupOptions { + family?: number; + hints?: number; + all?: boolean; + } - export interface LookupOneOptions extends LookupOptions { - all?: false; - } + export interface LookupOneOptions extends LookupOptions { + all?: false; + } - export interface LookupAllOptions extends LookupOptions { - all: true; - } + export interface LookupAllOptions extends LookupOptions { + all: true; + } - export interface LookupAddress { - address: string; - family: number; - } + export interface LookupAddress { + address: string; + family: number; + } - export function lookup(hostname: string, family: number, callback: (err: NodeJS.ErrnoException, address: string, family: number) => void): void; - export function lookup(hostname: string, options: LookupOneOptions, callback: (err: NodeJS.ErrnoException, address: string, family: number) => void): void; - export function lookup(hostname: string, options: LookupAllOptions, callback: (err: NodeJS.ErrnoException, addresses: LookupAddress[]) => void): void; - export function lookup(hostname: string, options: LookupOptions, callback: (err: NodeJS.ErrnoException, address: string | LookupAddress[], family: number) => void): void; - export function lookup(hostname: string, callback: (err: NodeJS.ErrnoException, address: string, family: number) => void): void; + export function lookup(hostname: string, family: number, callback: (err: NodeJS.ErrnoException, address: string, family: number) => void): void; + export function lookup(hostname: string, options: LookupOneOptions, callback: (err: NodeJS.ErrnoException, address: string, family: number) => void): void; + export function lookup(hostname: string, options: LookupAllOptions, callback: (err: NodeJS.ErrnoException, addresses: LookupAddress[]) => void): void; + export function lookup(hostname: string, options: LookupOptions, callback: (err: NodeJS.ErrnoException, address: string | LookupAddress[], family: number) => void): void; + export function lookup(hostname: string, callback: (err: NodeJS.ErrnoException, address: string, family: number) => void): void; - export interface ResolveOptions { - ttl: boolean; - } + // NOTE: This namespace provides design-time support for util.promisify. Exported members do not exist at runtime. + export namespace lookup { + export function __promisify__(hostname: string, options: LookupAllOptions): Promise<{ address: LookupAddress[] }>; + export function __promisify__(hostname: string, options?: LookupOneOptions | number): Promise<{ address: string, family: number }>; + export function __promisify__(hostname: string, options?: LookupOptions | number): Promise<{ address: string | LookupAddress[], family?: number }>; + } - export interface ResolveWithTtlOptions extends ResolveOptions { - ttl: true; - } + export function lookupService(address: string, port: number, callback: (err: NodeJS.ErrnoException, hostname: string, service: string) => void): void; - export interface RecordWithTtl { - address: string; - ttl: number; - } + export namespace lookupService { + export function __promisify__(address: string, port: number): Promise<{ hostname: string, service: string }>; + } - export interface MxRecord { - priority: number; - exchange: string; - } + export interface ResolveOptions { + ttl: boolean; + } - export interface NaptrRecord { - flags: string; - service: string; - regexp: string; - replacement: string; - order: number; - preference: number; - } + export interface ResolveWithTtlOptions extends ResolveOptions { + ttl: true; + } - export interface SoaRecord { - nsname: string; - hostmaster: string; - serial: number; - refresh: number; - retry: number; - expire: number; - minttl: number; - } + export interface RecordWithTtl { + address: string; + ttl: number; + } - export interface SrvRecord { - priority: number; - weight: number; - port: number; - name: string; - } + export interface MxRecord { + priority: number; + exchange: string; + } - export function resolve(hostname: string, callback: (err: NodeJS.ErrnoException, addresses: string[]) => void): void; - export function resolve(hostname: string, rrtype: "A", callback: (err: NodeJS.ErrnoException, addresses: string[]) => void): void; - export function resolve(hostname: string, rrtype: "AAAA", callback: (err: NodeJS.ErrnoException, addresses: string[]) => void): void; - export function resolve(hostname: string, rrtype: "CNAME", callback: (err: NodeJS.ErrnoException, addresses: string[]) => void): void; - export function resolve(hostname: string, rrtype: "MX", callback: (err: NodeJS.ErrnoException, addresses: MxRecord[]) => void): void; - export function resolve(hostname: string, rrtype: "NAPTR", callback: (err: NodeJS.ErrnoException, addresses: NaptrRecord[]) => void): void; - export function resolve(hostname: string, rrtype: "NS", callback: (err: NodeJS.ErrnoException, addresses: string[]) => void): void; - export function resolve(hostname: string, rrtype: "PTR", callback: (err: NodeJS.ErrnoException, addresses: string[]) => void): void; - export function resolve(hostname: string, rrtype: "SOA", callback: (err: NodeJS.ErrnoException, addresses: SoaRecord) => void): void; - export function resolve(hostname: string, rrtype: "SRV", callback: (err: NodeJS.ErrnoException, addresses: SrvRecord[]) => void): void; - export function resolve(hostname: string, rrtype: "TXT", callback: (err: NodeJS.ErrnoException, addresses: string[][]) => void): void; - export function resolve(hostname: string, rrtype: string, callback: (err: NodeJS.ErrnoException, addresses: string[] | MxRecord[] | NaptrRecord[] | SoaRecord | SrvRecord[] | string[][]) => void): void; + export interface NaptrRecord { + flags: string; + service: string; + regexp: string; + replacement: string; + order: number; + preference: number; + } - export function resolve4(hostname: string, callback: (err: NodeJS.ErrnoException, addresses: string[]) => void): void; - export function resolve4(hostname: string, options: ResolveWithTtlOptions, callback: (err: NodeJS.ErrnoException, addresses: RecordWithTtl[]) => void): void; - export function resolve4(hostname: string, options: ResolveOptions, callback: (err: NodeJS.ErrnoException, addresses: string[] | RecordWithTtl[]) => void): void; + export interface SoaRecord { + nsname: string; + hostmaster: string; + serial: number; + refresh: number; + retry: number; + expire: number; + minttl: number; + } - export function resolve6(hostname: string, callback: (err: NodeJS.ErrnoException, addresses: string[]) => void): void; - export function resolve6(hostname: string, options: ResolveWithTtlOptions, callback: (err: NodeJS.ErrnoException, addresses: RecordWithTtl[]) => void): void; - export function resolve6(hostname: string, options: ResolveOptions, callback: (err: NodeJS.ErrnoException, addresses: string[] | RecordWithTtl[]) => void): void; + export interface SrvRecord { + priority: number; + weight: number; + port: number; + name: string; + } - export function resolveCname(hostname: string, callback: (err: NodeJS.ErrnoException, addresses: string[]) => void): void; - export function resolveMx(hostname: string, callback: (err: NodeJS.ErrnoException, addresses: MxRecord[]) => void): void; - export function resolveNaptr(hostname: string, callback: (err: NodeJS.ErrnoException, addresses: NaptrRecord[]) => void): void; - export function resolveNs(hostname: string, callback: (err: NodeJS.ErrnoException, addresses: string[]) => void): void; - export function resolvePtr(hostname: string, callback: (err: NodeJS.ErrnoException, addresses: string[]) => void): void; - export function resolveSoa(hostname: string, callback: (err: NodeJS.ErrnoException, address: SoaRecord) => void): void; - export function resolveSrv(hostname: string, callback: (err: NodeJS.ErrnoException, addresses: SrvRecord[]) => void): void; - export function resolveTxt(hostname: string, callback: (err: NodeJS.ErrnoException, addresses: string[][]) => void): void; + export function resolve(hostname: string, callback: (err: NodeJS.ErrnoException, addresses: string[]) => void): void; + export function resolve(hostname: string, rrtype: "A", callback: (err: NodeJS.ErrnoException, addresses: string[]) => void): void; + export function resolve(hostname: string, rrtype: "AAAA", callback: (err: NodeJS.ErrnoException, addresses: string[]) => void): void; + export function resolve(hostname: string, rrtype: "CNAME", callback: (err: NodeJS.ErrnoException, addresses: string[]) => void): void; + export function resolve(hostname: string, rrtype: "MX", callback: (err: NodeJS.ErrnoException, addresses: MxRecord[]) => void): void; + export function resolve(hostname: string, rrtype: "NAPTR", callback: (err: NodeJS.ErrnoException, addresses: NaptrRecord[]) => void): void; + export function resolve(hostname: string, rrtype: "NS", callback: (err: NodeJS.ErrnoException, addresses: string[]) => void): void; + export function resolve(hostname: string, rrtype: "PTR", callback: (err: NodeJS.ErrnoException, addresses: string[]) => void): void; + export function resolve(hostname: string, rrtype: "SOA", callback: (err: NodeJS.ErrnoException, addresses: SoaRecord) => void): void; + export function resolve(hostname: string, rrtype: "SRV", callback: (err: NodeJS.ErrnoException, addresses: SrvRecord[]) => void): void; + export function resolve(hostname: string, rrtype: "TXT", callback: (err: NodeJS.ErrnoException, addresses: string[][]) => void): void; + export function resolve(hostname: string, rrtype: string, callback: (err: NodeJS.ErrnoException, addresses: string[] | MxRecord[] | NaptrRecord[] | SoaRecord | SrvRecord[] | string[][]) => void): void; - export function reverse(ip: string, callback: (err: NodeJS.ErrnoException, hostnames: string[]) => void): void; - export function setServers(servers: string[]): void; + // NOTE: This namespace provides design-time support for util.promisify. Exported members do not exist at runtime. + export namespace resolve { + export function __promisify__(hostname: string, rrtype?: "A" | "AAAA" | "CNAME" | "NS" | "PTR"): Promise; + export function __promisify__(hostname: string, rrtype: "MX"): Promise; + export function __promisify__(hostname: string, rrtype: "NAPTR"): Promise; + export function __promisify__(hostname: string, rrtype: "SOA"): Promise; + export function __promisify__(hostname: string, rrtype: "SRV"): Promise; + export function __promisify__(hostname: string, rrtype: "TXT"): Promise; + export function __promisify__(hostname: string, rrtype?: string): Promise; + } - //Error codes - export var NODATA: string; - export var FORMERR: string; - export var SERVFAIL: string; - export var NOTFOUND: string; - export var NOTIMP: string; - export var REFUSED: string; - export var BADQUERY: string; - export var BADNAME: string; - export var BADFAMILY: string; - export var BADRESP: string; - export var CONNREFUSED: string; - export var TIMEOUT: string; - export var EOF: string; - export var FILE: string; - export var NOMEM: string; - export var DESTRUCTION: string; - export var BADSTR: string; - export var BADFLAGS: string; - export var NONAME: string; - export var BADHINTS: string; - export var NOTINITIALIZED: string; - export var LOADIPHLPAPI: string; - export var ADDRGETNETWORKPARAMS: string; - export var CANCELLED: string; + export function resolve4(hostname: string, callback: (err: NodeJS.ErrnoException, addresses: string[]) => void): void; + export function resolve4(hostname: string, options: ResolveWithTtlOptions, callback: (err: NodeJS.ErrnoException, addresses: RecordWithTtl[]) => void): void; + export function resolve4(hostname: string, options: ResolveOptions, callback: (err: NodeJS.ErrnoException, addresses: string[] | RecordWithTtl[]) => void): void; + + // NOTE: This namespace provides design-time support for util.promisify. Exported members do not exist at runtime. + export namespace resolve4 { + export function __promisify__(hostname: string): Promise; + export function __promisify__(hostname: string, options: ResolveWithTtlOptions): Promise; + export function __promisify__(hostname: string, options?: ResolveOptions): Promise; + } + + export function resolve6(hostname: string, callback: (err: NodeJS.ErrnoException, addresses: string[]) => void): void; + export function resolve6(hostname: string, options: ResolveWithTtlOptions, callback: (err: NodeJS.ErrnoException, addresses: RecordWithTtl[]) => void): void; + export function resolve6(hostname: string, options: ResolveOptions, callback: (err: NodeJS.ErrnoException, addresses: string[] | RecordWithTtl[]) => void): void; + + // NOTE: This namespace provides design-time support for util.promisify. Exported members do not exist at runtime. + export namespace resolve6 { + export function __promisify__(hostname: string): Promise; + export function __promisify__(hostname: string, options: ResolveWithTtlOptions): Promise; + export function __promisify__(hostname: string, options?: ResolveOptions): Promise; + } + + export function resolveCname(hostname: string, callback: (err: NodeJS.ErrnoException, addresses: string[]) => void): void; + export function resolveMx(hostname: string, callback: (err: NodeJS.ErrnoException, addresses: MxRecord[]) => void): void; + export function resolveNaptr(hostname: string, callback: (err: NodeJS.ErrnoException, addresses: NaptrRecord[]) => void): void; + export function resolveNs(hostname: string, callback: (err: NodeJS.ErrnoException, addresses: string[]) => void): void; + export function resolvePtr(hostname: string, callback: (err: NodeJS.ErrnoException, addresses: string[]) => void): void; + export function resolveSoa(hostname: string, callback: (err: NodeJS.ErrnoException, address: SoaRecord) => void): void; + export function resolveSrv(hostname: string, callback: (err: NodeJS.ErrnoException, addresses: SrvRecord[]) => void): void; + export function resolveTxt(hostname: string, callback: (err: NodeJS.ErrnoException, addresses: string[][]) => void): void; + + export function reverse(ip: string, callback: (err: NodeJS.ErrnoException, hostnames: string[]) => void): void; + export function setServers(servers: string[]): void; + + // Error codes + export var NODATA: string; + export var FORMERR: string; + export var SERVFAIL: string; + export var NOTFOUND: string; + export var NOTIMP: string; + export var REFUSED: string; + export var BADQUERY: string; + export var BADNAME: string; + export var BADFAMILY: string; + export var BADRESP: string; + export var CONNREFUSED: string; + export var TIMEOUT: string; + export var EOF: string; + export var FILE: string; + export var NOMEM: string; + export var DESTRUCTION: string; + export var BADSTR: string; + export var BADFLAGS: string; + export var NONAME: string; + export var BADHINTS: string; + export var NOTINITIALIZED: string; + export var LOADIPHLPAPI: string; + export var ADDRGETNETWORKPARAMS: string; + export var CANCELLED: string; } declare module "net" { - import * as stream from "stream"; - import * as events from "events"; + import * as stream from "stream"; + import * as events from "events"; + import * as dns from "dns"; - export interface Socket extends stream.Duplex { - // Extended base methods - write(buffer: Buffer): boolean; - write(buffer: Buffer, cb?: Function): boolean; - write(str: string, cb?: Function): boolean; - write(str: string, encoding?: string, cb?: Function): boolean; - write(str: string, encoding?: string, fd?: string): boolean; + type LookupFunction = (hostname: string, options: dns.LookupOneOptions, callback: (err: NodeJS.ErrnoException | null, address: string, family: number) => void) => void; - connect(port: number, host?: string, connectionListener?: Function): void; - connect(path: string, connectionListener?: Function): void; - bufferSize: number; - setEncoding(encoding?: string): this; - write(data: any, encoding?: string, callback?: Function): void; - destroy(err?: any): void; - pause(): this; - resume(): this; - setTimeout(timeout: number, callback?: Function): void; - setNoDelay(noDelay?: boolean): void; - setKeepAlive(enable?: boolean, initialDelay?: number): void; - address(): { port: number; family: string; address: string; }; - unref(): void; - ref(): void; + export interface SocketConstructorOpts { + fd?: number; + allowHalfOpen?: boolean; + readable?: boolean; + writable?: boolean; + } - remoteAddress: string; - remoteFamily: string; - remotePort: number; - localAddress: string; - localPort: number; - bytesRead: number; - bytesWritten: number; - connecting: boolean; - destroyed: boolean; + export interface TcpSocketConnectOpts { + port: number; + host?: string; + localAddress?: string; + localPort?: number; + hints?: number; + family?: number; + lookup?: LookupFunction; + } - // Extended base methods - end(): void; - end(buffer: Buffer, cb?: Function): void; - end(str: string, cb?: Function): void; - end(str: string, encoding?: string, cb?: Function): void; - end(data?: any, encoding?: string): void; + export interface IpcSocketConnectOpts { + path: string; + } + + export type SocketConnectOpts = TcpSocketConnectOpts | IpcSocketConnectOpts; + + export class Socket extends stream.Duplex { + constructor(options?: SocketConstructorOpts); + + // Extended base methods + write(buffer: Buffer): boolean; + write(buffer: Buffer, cb?: Function): boolean; + write(str: string, cb?: Function): boolean; + write(str: string, encoding?: string, cb?: Function): boolean; + write(str: string, encoding?: string, fd?: string): boolean; + write(data: any, encoding?: string, callback?: Function): void; + + connect(options: SocketConnectOpts, connectionListener?: Function): this; + connect(port: number, host: string, connectionListener?: Function): this; + connect(port: number, connectionListener?: Function): this; + connect(path: string, connectionListener?: Function): this; + + bufferSize: number; + setEncoding(encoding?: string): this; + destroy(err?: any): void; + pause(): this; + resume(): this; + setTimeout(timeout: number, callback?: Function): this; + setNoDelay(noDelay?: boolean): this; + setKeepAlive(enable?: boolean, initialDelay?: number): this; + address(): { port: number; family: string; address: string; }; + unref(): void; + ref(): void; + + remoteAddress?: string; + remoteFamily?: string; + remotePort?: number; + localAddress: string; + localPort: number; + bytesRead: number; + bytesWritten: number; + connecting: boolean; + destroyed: boolean; + + // Extended base methods + end(): void; + end(buffer: Buffer, cb?: Function): void; + end(str: string, cb?: Function): void; + end(str: string, encoding?: string, cb?: Function): void; + end(data?: any, encoding?: string): void; /** * events.EventEmitter @@ -2137,97 +2674,97 @@ declare module "net" { * 7. lookup * 8. timeout */ - addListener(event: string, listener: Function): this; - addListener(event: "close", listener: (had_error: boolean) => void): this; - addListener(event: "connect", listener: () => void): this; - addListener(event: "data", listener: (data: Buffer) => void): this; - addListener(event: "drain", listener: () => void): this; - addListener(event: "end", listener: () => void): this; - addListener(event: "error", listener: (err: Error) => void): this; - addListener(event: "lookup", listener: (err: Error, address: string, family: string | number, host: string) => void): this; - addListener(event: "timeout", listener: () => void): this; + addListener(event: string, listener: (...args: any[]) => void): this; + addListener(event: "close", listener: (had_error: boolean) => void): this; + addListener(event: "connect", listener: () => void): this; + addListener(event: "data", listener: (data: Buffer) => void): this; + addListener(event: "drain", listener: () => void): this; + addListener(event: "end", listener: () => void): this; + addListener(event: "error", listener: (err: Error) => void): this; + addListener(event: "lookup", listener: (err: Error, address: string, family: string | number, host: string) => void): this; + addListener(event: "timeout", listener: () => void): this; - emit(event: string | symbol, ...args: any[]): boolean; - emit(event: "close", had_error: boolean): boolean; - emit(event: "connect"): boolean; - emit(event: "data", data: Buffer): boolean; - emit(event: "drain"): boolean; - emit(event: "end"): boolean; - emit(event: "error", err: Error): boolean; - emit(event: "lookup", err: Error, address: string, family: string | number, host: string): boolean; - emit(event: "timeout"): boolean; + emit(event: string | symbol, ...args: any[]): boolean; + emit(event: "close", had_error: boolean): boolean; + emit(event: "connect"): boolean; + emit(event: "data", data: Buffer): boolean; + emit(event: "drain"): boolean; + emit(event: "end"): boolean; + emit(event: "error", err: Error): boolean; + emit(event: "lookup", err: Error, address: string, family: string | number, host: string): boolean; + emit(event: "timeout"): boolean; - on(event: string, listener: Function): this; - on(event: "close", listener: (had_error: boolean) => void): this; - on(event: "connect", listener: () => void): this; - on(event: "data", listener: (data: Buffer) => void): this; - on(event: "drain", listener: () => void): this; - on(event: "end", listener: () => void): this; - on(event: "error", listener: (err: Error) => void): this; - on(event: "lookup", listener: (err: Error, address: string, family: string | number, host: string) => void): this; - on(event: "timeout", listener: () => void): this; + on(event: string, listener: (...args: any[]) => void): this; + on(event: "close", listener: (had_error: boolean) => void): this; + on(event: "connect", listener: () => void): this; + on(event: "data", listener: (data: Buffer) => void): this; + on(event: "drain", listener: () => void): this; + on(event: "end", listener: () => void): this; + on(event: "error", listener: (err: Error) => void): this; + on(event: "lookup", listener: (err: Error, address: string, family: string | number, host: string) => void): this; + on(event: "timeout", listener: () => void): this; - once(event: string, listener: Function): this; - once(event: "close", listener: (had_error: boolean) => void): this; - once(event: "connect", listener: () => void): this; - once(event: "data", listener: (data: Buffer) => void): this; - once(event: "drain", listener: () => void): this; - once(event: "end", listener: () => void): this; - once(event: "error", listener: (err: Error) => void): this; - once(event: "lookup", listener: (err: Error, address: string, family: string | number, host: string) => void): this; - once(event: "timeout", listener: () => void): this; + once(event: string, listener: (...args: any[]) => void): this; + once(event: "close", listener: (had_error: boolean) => void): this; + once(event: "connect", listener: () => void): this; + once(event: "data", listener: (data: Buffer) => void): this; + once(event: "drain", listener: () => void): this; + once(event: "end", listener: () => void): this; + once(event: "error", listener: (err: Error) => void): this; + once(event: "lookup", listener: (err: Error, address: string, family: string | number, host: string) => void): this; + once(event: "timeout", listener: () => void): this; - prependListener(event: string, listener: Function): this; - prependListener(event: "close", listener: (had_error: boolean) => void): this; - prependListener(event: "connect", listener: () => void): this; - prependListener(event: "data", listener: (data: Buffer) => void): this; - prependListener(event: "drain", listener: () => void): this; - prependListener(event: "end", listener: () => void): this; - prependListener(event: "error", listener: (err: Error) => void): this; - prependListener(event: "lookup", listener: (err: Error, address: string, family: string | number, host: string) => void): this; - prependListener(event: "timeout", listener: () => void): this; + prependListener(event: string, listener: (...args: any[]) => void): this; + prependListener(event: "close", listener: (had_error: boolean) => void): this; + prependListener(event: "connect", listener: () => void): this; + prependListener(event: "data", listener: (data: Buffer) => void): this; + prependListener(event: "drain", listener: () => void): this; + prependListener(event: "end", listener: () => void): this; + prependListener(event: "error", listener: (err: Error) => void): this; + prependListener(event: "lookup", listener: (err: Error, address: string, family: string | number, host: string) => void): this; + prependListener(event: "timeout", listener: () => void): this; - prependOnceListener(event: string, listener: Function): this; - prependOnceListener(event: "close", listener: (had_error: boolean) => void): this; - prependOnceListener(event: "connect", listener: () => void): this; - prependOnceListener(event: "data", listener: (data: Buffer) => void): this; - prependOnceListener(event: "drain", listener: () => void): this; - prependOnceListener(event: "end", listener: () => void): this; - prependOnceListener(event: "error", listener: (err: Error) => void): this; - prependOnceListener(event: "lookup", listener: (err: Error, address: string, family: string | number, host: string) => void): this; - prependOnceListener(event: "timeout", listener: () => void): this; - } + prependOnceListener(event: string, listener: (...args: any[]) => void): this; + prependOnceListener(event: "close", listener: (had_error: boolean) => void): this; + prependOnceListener(event: "connect", listener: () => void): this; + prependOnceListener(event: "data", listener: (data: Buffer) => void): this; + prependOnceListener(event: "drain", listener: () => void): this; + prependOnceListener(event: "end", listener: () => void): this; + prependOnceListener(event: "error", listener: (err: Error) => void): this; + prependOnceListener(event: "lookup", listener: (err: Error, address: string, family: string | number, host: string) => void): this; + prependOnceListener(event: "timeout", listener: () => void): this; + } - export var Socket: { - new(options?: { fd?: number; allowHalfOpen?: boolean; readable?: boolean; writable?: boolean; }): Socket; - }; + export interface ListenOptions { + port?: number; + host?: string; + backlog?: number; + path?: string; + exclusive?: boolean; + } - export interface ListenOptions { - port?: number; - host?: string; - backlog?: number; - path?: string; - exclusive?: boolean; - } + // https://github.com/nodejs/node/blob/master/lib/net.js + export class Server extends events.EventEmitter { + constructor(connectionListener?: (socket: Socket) => void); + constructor(options?: { allowHalfOpen?: boolean, pauseOnConnect?: boolean }, connectionListener?: (socket: Socket) => void); - export interface Server extends events.EventEmitter { - listen(port: number, hostname?: string, backlog?: number, listeningListener?: Function): Server; - listen(port: number, hostname?: string, listeningListener?: Function): Server; - listen(port: number, backlog?: number, listeningListener?: Function): Server; - listen(port: number, listeningListener?: Function): Server; - listen(path: string, backlog?: number, listeningListener?: Function): Server; - listen(path: string, listeningListener?: Function): Server; - listen(options: ListenOptions, listeningListener?: Function): Server; - listen(handle: any, backlog?: number, listeningListener?: Function): Server; - listen(handle: any, listeningListener?: Function): Server; - close(callback?: Function): Server; - address(): { port: number; family: string; address: string; }; - getConnections(cb: (error: Error, count: number) => void): void; - ref(): Server; - unref(): Server; - maxConnections: number; - connections: number; - listening: boolean; + listen(port?: number, hostname?: string, backlog?: number, listeningListener?: Function): this; + listen(port?: number, hostname?: string, listeningListener?: Function): this; + listen(port?: number, backlog?: number, listeningListener?: Function): this; + listen(port?: number, listeningListener?: Function): this; + listen(path: string, backlog?: number, listeningListener?: Function): this; + listen(path: string, listeningListener?: Function): this; + listen(options: ListenOptions, listeningListener?: Function): this; + listen(handle: any, backlog?: number, listeningListener?: Function): this; + listen(handle: any, listeningListener?: Function): this; + close(callback?: Function): this; + address(): { port: number; family: string; address: string; }; + getConnections(cb: (error: Error | null, count: number) => void): void; + ref(): this; + unref(): this; + maxConnections: number; + connections: number; + listening: boolean; /** * events.EventEmitter @@ -2236,101 +2773,123 @@ declare module "net" { * 3. error * 4. listening */ - addListener(event: string, listener: Function): this; - addListener(event: "close", listener: () => void): this; - addListener(event: "connection", listener: (socket: Socket) => void): this; - addListener(event: "error", listener: (err: Error) => void): this; - addListener(event: "listening", listener: () => void): this; + addListener(event: string, listener: (...args: any[]) => void): this; + addListener(event: "close", listener: () => void): this; + addListener(event: "connection", listener: (socket: Socket) => void): this; + addListener(event: "error", listener: (err: Error) => void): this; + addListener(event: "listening", listener: () => void): this; - emit(event: string | symbol, ...args: any[]): boolean; - emit(event: "close"): boolean; - emit(event: "connection", socket: Socket): boolean; - emit(event: "error", err: Error): boolean; - emit(event: "listening"): boolean; + emit(event: string | symbol, ...args: any[]): boolean; + emit(event: "close"): boolean; + emit(event: "connection", socket: Socket): boolean; + emit(event: "error", err: Error): boolean; + emit(event: "listening"): boolean; - on(event: string, listener: Function): this; - on(event: "close", listener: () => void): this; - on(event: "connection", listener: (socket: Socket) => void): this; - on(event: "error", listener: (err: Error) => void): this; - on(event: "listening", listener: () => void): this; + on(event: string, listener: (...args: any[]) => void): this; + on(event: "close", listener: () => void): this; + on(event: "connection", listener: (socket: Socket) => void): this; + on(event: "error", listener: (err: Error) => void): this; + on(event: "listening", listener: () => void): this; - once(event: string, listener: Function): this; - once(event: "close", listener: () => void): this; - once(event: "connection", listener: (socket: Socket) => void): this; - once(event: "error", listener: (err: Error) => void): this; - once(event: "listening", listener: () => void): this; + once(event: string, listener: (...args: any[]) => void): this; + once(event: "close", listener: () => void): this; + once(event: "connection", listener: (socket: Socket) => void): this; + once(event: "error", listener: (err: Error) => void): this; + once(event: "listening", listener: () => void): this; - prependListener(event: string, listener: Function): this; - prependListener(event: "close", listener: () => void): this; - prependListener(event: "connection", listener: (socket: Socket) => void): this; - prependListener(event: "error", listener: (err: Error) => void): this; - prependListener(event: "listening", listener: () => void): this; + prependListener(event: string, listener: (...args: any[]) => void): this; + prependListener(event: "close", listener: () => void): this; + prependListener(event: "connection", listener: (socket: Socket) => void): this; + prependListener(event: "error", listener: (err: Error) => void): this; + prependListener(event: "listening", listener: () => void): this; - prependOnceListener(event: string, listener: Function): this; - prependOnceListener(event: "close", listener: () => void): this; - prependOnceListener(event: "connection", listener: (socket: Socket) => void): this; - prependOnceListener(event: "error", listener: (err: Error) => void): this; - prependOnceListener(event: "listening", listener: () => void): this; - } - export function createServer(connectionListener?: (socket: Socket) => void): Server; - export function createServer(options?: { allowHalfOpen?: boolean, pauseOnConnect?: boolean }, connectionListener?: (socket: Socket) => void): Server; - export function connect(options: { port: number, host?: string, localAddress?: string, localPort?: string, family?: number, allowHalfOpen?: boolean; }, connectionListener?: Function): Socket; - export function connect(port: number, host?: string, connectionListener?: Function): Socket; - export function connect(path: string, connectionListener?: Function): Socket; - export function createConnection(options: { port: number, host?: string, localAddress?: string, localPort?: string, family?: number, allowHalfOpen?: boolean; }, connectionListener?: Function): Socket; - export function createConnection(port: number, host?: string, connectionListener?: Function): Socket; - export function createConnection(path: string, connectionListener?: Function): Socket; - export function isIP(input: string): number; - export function isIPv4(input: string): boolean; - export function isIPv6(input: string): boolean; + prependOnceListener(event: string, listener: (...args: any[]) => void): this; + prependOnceListener(event: "close", listener: () => void): this; + prependOnceListener(event: "connection", listener: (socket: Socket) => void): this; + prependOnceListener(event: "error", listener: (err: Error) => void): this; + prependOnceListener(event: "listening", listener: () => void): this; + } + + export interface TcpNetConnectOpts extends TcpSocketConnectOpts, SocketConstructorOpts { + timeout?: number; + } + + export interface IpcNetConnectOpts extends IpcSocketConnectOpts, SocketConstructorOpts { + timeout?: number; + } + + export type NetConnectOpts = TcpNetConnectOpts | IpcNetConnectOpts; + + export function createServer(connectionListener?: (socket: Socket) => void): Server; + export function createServer(options?: { allowHalfOpen?: boolean, pauseOnConnect?: boolean }, connectionListener?: (socket: Socket) => void): Server; + export function connect(options: NetConnectOpts, connectionListener?: Function): Socket; + export function connect(port: number, host?: string, connectionListener?: Function): Socket; + export function connect(path: string, connectionListener?: Function): Socket; + export function createConnection(options: NetConnectOpts, connectionListener?: Function): Socket; + export function createConnection(port: number, host?: string, connectionListener?: Function): Socket; + export function createConnection(path: string, connectionListener?: Function): Socket; + export function isIP(input: string): number; + export function isIPv4(input: string): boolean; + export function isIPv6(input: string): boolean; } declare module "dgram" { - import * as events from "events"; + import * as events from "events"; + import * as dns from "dns"; - interface RemoteInfo { - address: string; - family: string; - port: number; - } + interface RemoteInfo { + address: string; + family: string; + port: number; + } - interface AddressInfo { - address: string; - family: string; - port: number; - } + interface AddressInfo { + address: string; + family: string; + port: number; + } - interface BindOptions { - port: number; - address?: string; - exclusive?: boolean; - } + interface BindOptions { + port: number; + address?: string; + exclusive?: boolean; + } - type SocketType = "udp4" | "udp6"; + type SocketType = "udp4" | "udp6"; - interface SocketOptions { - type: SocketType; - reuseAddr?: boolean; - } + interface SocketOptions { + type: SocketType; + reuseAddr?: boolean; + recvBufferSize?: number; + sendBufferSize?: number; + lookup?: (hostname: string, options: dns.LookupOneOptions, callback: (err: NodeJS.ErrnoException, address: string, family: number) => void) => void; + } - export function createSocket(type: SocketType, callback?: (msg: Buffer, rinfo: RemoteInfo) => void): Socket; - export function createSocket(options: SocketOptions, callback?: (msg: Buffer, rinfo: RemoteInfo) => void): Socket; + export function createSocket(type: SocketType, callback?: (msg: Buffer, rinfo: RemoteInfo) => void): Socket; + export function createSocket(options: SocketOptions, callback?: (msg: Buffer, rinfo: RemoteInfo) => void): Socket; - export interface Socket extends events.EventEmitter { - send(msg: Buffer | String | any[], port: number, address: string, callback?: (error: Error, bytes: number) => void): void; - send(msg: Buffer | String | any[], offset: number, length: number, port: number, address: string, callback?: (error: Error, bytes: number) => void): void; - bind(port?: number, address?: string, callback?: () => void): void; - bind(options: BindOptions, callback?: Function): void; - close(callback?: () => void): void; - address(): AddressInfo; - setBroadcast(flag: boolean): void; - setTTL(ttl: number): void; - setMulticastTTL(ttl: number): void; - setMulticastLoopback(flag: boolean): void; - addMembership(multicastAddress: string, multicastInterface?: string): void; - dropMembership(multicastAddress: string, multicastInterface?: string): void; - ref(): this; - unref(): this; + export class Socket extends events.EventEmitter { + send(msg: Buffer | string | Uint8Array | any[], port: number, address?: string, callback?: (error: Error | null, bytes: number) => void): void; + send(msg: Buffer | string | Uint8Array, offset: number, length: number, port: number, address?: string, callback?: (error: Error | null, bytes: number) => void): void; + bind(port?: number, address?: string, callback?: () => void): void; + bind(port?: number, callback?: () => void): void; + bind(callback?: () => void): void; + bind(options: BindOptions, callback?: Function): void; + close(callback?: () => void): void; + address(): AddressInfo; + setBroadcast(flag: boolean): void; + setTTL(ttl: number): void; + setMulticastTTL(ttl: number): void; + setMulticastInterface(multicastInterface: string): void; + setMulticastLoopback(flag: boolean): void; + addMembership(multicastAddress: string, multicastInterface?: string): void; + dropMembership(multicastAddress: string, multicastInterface?: string): void; + ref(): this; + unref(): this; + setRecvBufferSize(size: number): void; + setSendBufferSize(size: number): void; + getRecvBufferSize(): number; + getSendBufferSize(): number; /** * events.EventEmitter @@ -2338,586 +2897,1738 @@ declare module "dgram" { * 2. error * 3. listening * 4. message - **/ - addListener(event: string, listener: Function): this; - addListener(event: "close", listener: () => void): this; - addListener(event: "error", listener: (err: Error) => void): this; - addListener(event: "listening", listener: () => void): this; - addListener(event: "message", listener: (msg: Buffer, rinfo: AddressInfo) => void): this; + */ + addListener(event: string, listener: (...args: any[]) => void): this; + addListener(event: "close", listener: () => void): this; + addListener(event: "error", listener: (err: Error) => void): this; + addListener(event: "listening", listener: () => void): this; + addListener(event: "message", listener: (msg: Buffer, rinfo: AddressInfo) => void): this; - emit(event: string | symbol, ...args: any[]): boolean; - emit(event: "close"): boolean; - emit(event: "error", err: Error): boolean; - emit(event: "listening"): boolean; - emit(event: "message", msg: Buffer, rinfo: AddressInfo): boolean; + emit(event: string | symbol, ...args: any[]): boolean; + emit(event: "close"): boolean; + emit(event: "error", err: Error): boolean; + emit(event: "listening"): boolean; + emit(event: "message", msg: Buffer, rinfo: AddressInfo): boolean; - on(event: string, listener: Function): this; - on(event: "close", listener: () => void): this; - on(event: "error", listener: (err: Error) => void): this; - on(event: "listening", listener: () => void): this; - on(event: "message", listener: (msg: Buffer, rinfo: AddressInfo) => void): this; + on(event: string, listener: (...args: any[]) => void): this; + on(event: "close", listener: () => void): this; + on(event: "error", listener: (err: Error) => void): this; + on(event: "listening", listener: () => void): this; + on(event: "message", listener: (msg: Buffer, rinfo: AddressInfo) => void): this; - once(event: string, listener: Function): this; - once(event: "close", listener: () => void): this; - once(event: "error", listener: (err: Error) => void): this; - once(event: "listening", listener: () => void): this; - once(event: "message", listener: (msg: Buffer, rinfo: AddressInfo) => void): this; + once(event: string, listener: (...args: any[]) => void): this; + once(event: "close", listener: () => void): this; + once(event: "error", listener: (err: Error) => void): this; + once(event: "listening", listener: () => void): this; + once(event: "message", listener: (msg: Buffer, rinfo: AddressInfo) => void): this; - prependListener(event: string, listener: Function): this; - prependListener(event: "close", listener: () => void): this; - prependListener(event: "error", listener: (err: Error) => void): this; - prependListener(event: "listening", listener: () => void): this; - prependListener(event: "message", listener: (msg: Buffer, rinfo: AddressInfo) => void): this; + prependListener(event: string, listener: (...args: any[]) => void): this; + prependListener(event: "close", listener: () => void): this; + prependListener(event: "error", listener: (err: Error) => void): this; + prependListener(event: "listening", listener: () => void): this; + prependListener(event: "message", listener: (msg: Buffer, rinfo: AddressInfo) => void): this; - prependOnceListener(event: string, listener: Function): this; - prependOnceListener(event: "close", listener: () => void): this; - prependOnceListener(event: "error", listener: (err: Error) => void): this; - prependOnceListener(event: "listening", listener: () => void): this; - prependOnceListener(event: "message", listener: (msg: Buffer, rinfo: AddressInfo) => void): this; - } + prependOnceListener(event: string, listener: (...args: any[]) => void): this; + prependOnceListener(event: "close", listener: () => void): this; + prependOnceListener(event: "error", listener: (err: Error) => void): this; + prependOnceListener(event: "listening", listener: () => void): this; + prependOnceListener(event: "message", listener: (msg: Buffer, rinfo: AddressInfo) => void): this; + } } declare module "fs" { - import * as stream from "stream"; - import * as events from "events"; + import * as stream from "stream"; + import * as events from "events"; + import { URL } from "url"; - interface Stats { - isFile(): boolean; - isDirectory(): boolean; - isBlockDevice(): boolean; - isCharacterDevice(): boolean; - isSymbolicLink(): boolean; - isFIFO(): boolean; - isSocket(): boolean; - dev: number; - ino: number; - mode: number; - nlink: number; - uid: number; - gid: number; - rdev: number; - size: number; - blksize: number; - blocks: number; - atime: Date; - mtime: Date; - ctime: Date; - birthtime: Date; - } + /** + * Valid types for path values in "fs". + */ + export type PathLike = string | Buffer | URL; - interface FSWatcher extends events.EventEmitter { - close(): void; + export class Stats { + isFile(): boolean; + isDirectory(): boolean; + isBlockDevice(): boolean; + isCharacterDevice(): boolean; + isSymbolicLink(): boolean; + isFIFO(): boolean; + isSocket(): boolean; + dev: number; + ino: number; + mode: number; + nlink: number; + uid: number; + gid: number; + rdev: number; + size: number; + blksize: number; + blocks: number; + atimeMs: number; + mtimeMs: number; + ctimeMs: number; + birthtimeMs: number; + atime: Date; + mtime: Date; + ctime: Date; + birthtime: Date; + } + + export interface FSWatcher extends events.EventEmitter { + close(): void; /** * events.EventEmitter * 1. change * 2. error */ - addListener(event: string, listener: Function): this; - addListener(event: "change", listener: (eventType: string, filename: string | Buffer) => void): this; - addListener(event: "error", listener: (error: Error) => void): this; + addListener(event: string, listener: (...args: any[]) => void): this; + addListener(event: "change", listener: (eventType: string, filename: string | Buffer) => void): this; + addListener(event: "error", listener: (error: Error) => void): this; - on(event: string, listener: Function): this; - on(event: "change", listener: (eventType: string, filename: string | Buffer) => void): this; - on(event: "error", listener: (error: Error) => void): this; + on(event: string, listener: (...args: any[]) => void): this; + on(event: "change", listener: (eventType: string, filename: string | Buffer) => void): this; + on(event: "error", listener: (error: Error) => void): this; - once(event: string, listener: Function): this; - once(event: "change", listener: (eventType: string, filename: string | Buffer) => void): this; - once(event: "error", listener: (error: Error) => void): this; + once(event: string, listener: (...args: any[]) => void): this; + once(event: "change", listener: (eventType: string, filename: string | Buffer) => void): this; + once(event: "error", listener: (error: Error) => void): this; - prependListener(event: string, listener: Function): this; - prependListener(event: "change", listener: (eventType: string, filename: string | Buffer) => void): this; - prependListener(event: "error", listener: (error: Error) => void): this; + prependListener(event: string, listener: (...args: any[]) => void): this; + prependListener(event: "change", listener: (eventType: string, filename: string | Buffer) => void): this; + prependListener(event: "error", listener: (error: Error) => void): this; - prependOnceListener(event: string, listener: Function): this; - prependOnceListener(event: "change", listener: (eventType: string, filename: string | Buffer) => void): this; - prependOnceListener(event: "error", listener: (error: Error) => void): this; - } + prependOnceListener(event: string, listener: (...args: any[]) => void): this; + prependOnceListener(event: "change", listener: (eventType: string, filename: string | Buffer) => void): this; + prependOnceListener(event: "error", listener: (error: Error) => void): this; + } - export interface ReadStream extends stream.Readable { - close(): void; - destroy(): void; - bytesRead: number; - path: string | Buffer; + export class ReadStream extends stream.Readable { + close(): void; + destroy(): void; + bytesRead: number; + path: string | Buffer; /** * events.EventEmitter * 1. open * 2. close */ - addListener(event: string, listener: Function): this; - addListener(event: "open", listener: (fd: number) => void): this; - addListener(event: "close", listener: () => void): this; + addListener(event: string, listener: (...args: any[]) => void): this; + addListener(event: "open", listener: (fd: number) => void): this; + addListener(event: "close", listener: () => void): this; - on(event: string, listener: Function): this; - on(event: "open", listener: (fd: number) => void): this; - on(event: "close", listener: () => void): this; + on(event: string, listener: (...args: any[]) => void): this; + on(event: "open", listener: (fd: number) => void): this; + on(event: "close", listener: () => void): this; - once(event: string, listener: Function): this; - once(event: "open", listener: (fd: number) => void): this; - once(event: "close", listener: () => void): this; + once(event: string, listener: (...args: any[]) => void): this; + once(event: "open", listener: (fd: number) => void): this; + once(event: "close", listener: () => void): this; - prependListener(event: string, listener: Function): this; - prependListener(event: "open", listener: (fd: number) => void): this; - prependListener(event: "close", listener: () => void): this; + prependListener(event: string, listener: (...args: any[]) => void): this; + prependListener(event: "open", listener: (fd: number) => void): this; + prependListener(event: "close", listener: () => void): this; - prependOnceListener(event: string, listener: Function): this; - prependOnceListener(event: "open", listener: (fd: number) => void): this; - prependOnceListener(event: "close", listener: () => void): this; - } + prependOnceListener(event: string, listener: (...args: any[]) => void): this; + prependOnceListener(event: "open", listener: (fd: number) => void): this; + prependOnceListener(event: "close", listener: () => void): this; + } - export interface WriteStream extends stream.Writable { - close(): void; - bytesWritten: number; - path: string | Buffer; + export class WriteStream extends stream.Writable { + close(): void; + bytesWritten: number; + path: string | Buffer; /** * events.EventEmitter * 1. open * 2. close */ - addListener(event: string, listener: Function): this; - addListener(event: "open", listener: (fd: number) => void): this; - addListener(event: "close", listener: () => void): this; + addListener(event: string, listener: (...args: any[]) => void): this; + addListener(event: "open", listener: (fd: number) => void): this; + addListener(event: "close", listener: () => void): this; - on(event: string, listener: Function): this; - on(event: "open", listener: (fd: number) => void): this; - on(event: "close", listener: () => void): this; + on(event: string, listener: (...args: any[]) => void): this; + on(event: "open", listener: (fd: number) => void): this; + on(event: "close", listener: () => void): this; - once(event: string, listener: Function): this; - once(event: "open", listener: (fd: number) => void): this; - once(event: "close", listener: () => void): this; + once(event: string, listener: (...args: any[]) => void): this; + once(event: "open", listener: (fd: number) => void): this; + once(event: "close", listener: () => void): this; - prependListener(event: string, listener: Function): this; - prependListener(event: "open", listener: (fd: number) => void): this; - prependListener(event: "close", listener: () => void): this; + prependListener(event: string, listener: (...args: any[]) => void): this; + prependListener(event: "open", listener: (fd: number) => void): this; + prependListener(event: "close", listener: () => void): this; - prependOnceListener(event: string, listener: Function): this; - prependOnceListener(event: "open", listener: (fd: number) => void): this; - prependOnceListener(event: "close", listener: () => void): this; - } + prependOnceListener(event: string, listener: (...args: any[]) => void): this; + prependOnceListener(event: "open", listener: (fd: number) => void): this; + prependOnceListener(event: "close", listener: () => void): this; + } /** - * Asynchronous rename. - * @param oldPath - * @param newPath - * @param callback No arguments other than a possible exception are given to the completion callback. + * Asynchronous rename(2) - Change the name or location of a file or directory. + * @param oldPath A path to a file. If a URL is provided, it must use the `file:` protocol. + * URL support is _experimental_. + * @param newPath A path to a file. If a URL is provided, it must use the `file:` protocol. + * URL support is _experimental_. */ - export function rename(oldPath: string, newPath: string, callback?: (err?: NodeJS.ErrnoException) => void): void; + export function rename(oldPath: PathLike, newPath: PathLike, callback: (err: NodeJS.ErrnoException) => void): void; + + // NOTE: This namespace provides design-time support for util.promisify. Exported members do not exist at runtime. + export namespace rename { + /** + * Asynchronous rename(2) - Change the name or location of a file or directory. + * @param oldPath A path to a file. If a URL is provided, it must use the `file:` protocol. + * URL support is _experimental_. + * @param newPath A path to a file. If a URL is provided, it must use the `file:` protocol. + * URL support is _experimental_. + */ + export function __promisify__(oldPath: PathLike, newPath: PathLike): Promise; + } + /** - * Synchronous rename - * @param oldPath - * @param newPath + * Synchronous rename(2) - Change the name or location of a file or directory. + * @param oldPath A path to a file. If a URL is provided, it must use the `file:` protocol. + * URL support is _experimental_. + * @param newPath A path to a file. If a URL is provided, it must use the `file:` protocol. + * URL support is _experimental_. */ - export function renameSync(oldPath: string, newPath: string): void; - export function truncate(path: string | Buffer, callback?: (err?: NodeJS.ErrnoException) => void): void; - export function truncate(path: string | Buffer, len: number, callback?: (err?: NodeJS.ErrnoException) => void): void; - export function truncateSync(path: string | Buffer, len?: number): void; - export function ftruncate(fd: number, callback?: (err?: NodeJS.ErrnoException) => void): void; - export function ftruncate(fd: number, len: number, callback?: (err?: NodeJS.ErrnoException) => void): void; - export function ftruncateSync(fd: number, len?: number): void; - export function chown(path: string | Buffer, uid: number, gid: number, callback?: (err?: NodeJS.ErrnoException) => void): void; - export function chownSync(path: string | Buffer, uid: number, gid: number): void; - export function fchown(fd: number, uid: number, gid: number, callback?: (err?: NodeJS.ErrnoException) => void): void; - export function fchownSync(fd: number, uid: number, gid: number): void; - export function lchown(path: string | Buffer, uid: number, gid: number, callback?: (err?: NodeJS.ErrnoException) => void): void; - export function lchownSync(path: string | Buffer, uid: number, gid: number): void; - export function chmod(path: string | Buffer, mode: number, callback?: (err?: NodeJS.ErrnoException) => void): void; - export function chmod(path: string | Buffer, mode: string, callback?: (err?: NodeJS.ErrnoException) => void): void; - export function chmodSync(path: string | Buffer, mode: number): void; - export function chmodSync(path: string | Buffer, mode: string): void; - export function fchmod(fd: number, mode: number, callback?: (err?: NodeJS.ErrnoException) => void): void; - export function fchmod(fd: number, mode: string, callback?: (err?: NodeJS.ErrnoException) => void): void; - export function fchmodSync(fd: number, mode: number): void; - export function fchmodSync(fd: number, mode: string): void; - export function lchmod(path: string | Buffer, mode: number, callback?: (err?: NodeJS.ErrnoException) => void): void; - export function lchmod(path: string | Buffer, mode: string, callback?: (err?: NodeJS.ErrnoException) => void): void; - export function lchmodSync(path: string | Buffer, mode: number): void; - export function lchmodSync(path: string | Buffer, mode: string): void; - export function stat(path: string | Buffer, callback?: (err: NodeJS.ErrnoException, stats: Stats) => any): void; - export function lstat(path: string | Buffer, callback?: (err: NodeJS.ErrnoException, stats: Stats) => any): void; - export function fstat(fd: number, callback?: (err: NodeJS.ErrnoException, stats: Stats) => any): void; - export function statSync(path: string | Buffer): Stats; - export function lstatSync(path: string | Buffer): Stats; - export function fstatSync(fd: number): Stats; - export function link(srcpath: string | Buffer, dstpath: string | Buffer, callback?: (err?: NodeJS.ErrnoException) => void): void; - export function linkSync(srcpath: string | Buffer, dstpath: string | Buffer): void; - export function symlink(srcpath: string | Buffer, dstpath: string | Buffer, type?: string, callback?: (err?: NodeJS.ErrnoException) => void): void; - export function symlinkSync(srcpath: string | Buffer, dstpath: string | Buffer, type?: string): void; - export function readlink(path: string | Buffer, callback?: (err: NodeJS.ErrnoException, linkString: string) => any): void; - export function readlinkSync(path: string | Buffer): string; - export function realpath(path: string | Buffer, callback?: (err: NodeJS.ErrnoException, resolvedPath: string) => any): void; - export function realpath(path: string | Buffer, cache: { [path: string]: string }, callback: (err: NodeJS.ErrnoException, resolvedPath: string) => any): void; - export function realpathSync(path: string | Buffer, cache?: { [path: string]: string }): string; + export function renameSync(oldPath: PathLike, newPath: PathLike): void; + /** - * Asynchronous unlink - deletes the file specified in {path} - * - * @param path - * @param callback No arguments other than a possible exception are given to the completion callback. + * Asynchronous truncate(2) - Truncate a file to a specified length. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param len If not specified, defaults to `0`. */ - export function unlink(path: string | Buffer, callback?: (err?: NodeJS.ErrnoException) => void): void; + export function truncate(path: PathLike, len: number | undefined | null, callback: (err: NodeJS.ErrnoException) => void): void; + /** - * Synchronous unlink - deletes the file specified in {path} - * - * @param path + * Asynchronous truncate(2) - Truncate a file to a specified length. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * URL support is _experimental_. */ - export function unlinkSync(path: string | Buffer): void; + export function truncate(path: PathLike, callback: (err: NodeJS.ErrnoException) => void): void; + + // NOTE: This namespace provides design-time support for util.promisify. Exported members do not exist at runtime. + export namespace truncate { + /** + * Asynchronous truncate(2) - Truncate a file to a specified length. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param len If not specified, defaults to `0`. + */ + export function __promisify__(path: PathLike, len?: number | null): Promise; + } + /** - * Asynchronous rmdir - removes the directory specified in {path} - * - * @param path - * @param callback No arguments other than a possible exception are given to the completion callback. + * Synchronous truncate(2) - Truncate a file to a specified length. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param len If not specified, defaults to `0`. */ - export function rmdir(path: string | Buffer, callback?: (err?: NodeJS.ErrnoException) => void): void; + export function truncateSync(path: PathLike, len?: number | null): void; + /** - * Synchronous rmdir - removes the directory specified in {path} - * - * @param path + * Asynchronous ftruncate(2) - Truncate a file to a specified length. + * @param fd A file descriptor. + * @param len If not specified, defaults to `0`. */ - export function rmdirSync(path: string | Buffer): void; + export function ftruncate(fd: number, len: number | undefined | null, callback: (err: NodeJS.ErrnoException) => void): void; + /** - * Asynchronous mkdir - creates the directory specified in {path}. Parameter {mode} defaults to 0777. - * - * @param path - * @param callback No arguments other than a possible exception are given to the completion callback. + * Asynchronous ftruncate(2) - Truncate a file to a specified length. + * @param fd A file descriptor. */ - export function mkdir(path: string | Buffer, callback?: (err?: NodeJS.ErrnoException) => void): void; + export function ftruncate(fd: number, callback: (err: NodeJS.ErrnoException) => void): void; + + // NOTE: This namespace provides design-time support for util.promisify. Exported members do not exist at runtime. + export namespace ftruncate { + /** + * Asynchronous ftruncate(2) - Truncate a file to a specified length. + * @param fd A file descriptor. + * @param len If not specified, defaults to `0`. + */ + export function __promisify__(fd: number, len?: number | null): Promise; + } + /** - * Asynchronous mkdir - creates the directory specified in {path}. Parameter {mode} defaults to 0777. - * - * @param path - * @param mode - * @param callback No arguments other than a possible exception are given to the completion callback. + * Synchronous ftruncate(2) - Truncate a file to a specified length. + * @param fd A file descriptor. + * @param len If not specified, defaults to `0`. */ - export function mkdir(path: string | Buffer, mode: number, callback?: (err?: NodeJS.ErrnoException) => void): void; + export function ftruncateSync(fd: number, len?: number | null): void; + /** - * Asynchronous mkdir - creates the directory specified in {path}. Parameter {mode} defaults to 0777. - * - * @param path - * @param mode - * @param callback No arguments other than a possible exception are given to the completion callback. + * Asynchronous chown(2) - Change ownership of a file. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. */ - export function mkdir(path: string | Buffer, mode: string, callback?: (err?: NodeJS.ErrnoException) => void): void; + export function chown(path: PathLike, uid: number, gid: number, callback: (err: NodeJS.ErrnoException) => void): void; + + // NOTE: This namespace provides design-time support for util.promisify. Exported members do not exist at runtime. + export namespace chown { + /** + * Asynchronous chown(2) - Change ownership of a file. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + */ + export function __promisify__(path: PathLike, uid: number, gid: number): Promise; + } + /** - * Synchronous mkdir - creates the directory specified in {path}. Parameter {mode} defaults to 0777. - * - * @param path - * @param mode - * @param callback No arguments other than a possible exception are given to the completion callback. + * Synchronous chown(2) - Change ownership of a file. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. */ - export function mkdirSync(path: string | Buffer, mode?: number): void; + export function chownSync(path: PathLike, uid: number, gid: number): void; + /** - * Synchronous mkdir - creates the directory specified in {path}. Parameter {mode} defaults to 0777. - * - * @param path - * @param mode - * @param callback No arguments other than a possible exception are given to the completion callback. + * Asynchronous fchown(2) - Change ownership of a file. + * @param fd A file descriptor. */ - export function mkdirSync(path: string | Buffer, mode?: string): void; + export function fchown(fd: number, uid: number, gid: number, callback: (err: NodeJS.ErrnoException) => void): void; + + // NOTE: This namespace provides design-time support for util.promisify. Exported members do not exist at runtime. + export namespace fchown { + /** + * Asynchronous fchown(2) - Change ownership of a file. + * @param fd A file descriptor. + */ + export function __promisify__(fd: number, uid: number, gid: number): Promise; + } + /** - * Asynchronous mkdtemp - Creates a unique temporary directory. Generates six random characters to be appended behind a required prefix to create a unique temporary directory. - * - * @param prefix - * @param callback The created folder path is passed as a string to the callback's second parameter. + * Synchronous fchown(2) - Change ownership of a file. + * @param fd A file descriptor. */ - export function mkdtemp(prefix: string, callback?: (err: NodeJS.ErrnoException, folder: string) => void): void; + export function fchownSync(fd: number, uid: number, gid: number): void; + /** - * Synchronous mkdtemp - Creates a unique temporary directory. Generates six random characters to be appended behind a required prefix to create a unique temporary directory. - * - * @param prefix - * @returns Returns the created folder path. + * Asynchronous lchown(2) - Change ownership of a file. Does not dereference symbolic links. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. */ - export function mkdtempSync(prefix: string): string; - export function readdir(path: string | Buffer, callback: (err: NodeJS.ErrnoException, files: string[]) => void): void; - export function readdir(path: string | Buffer, options: string | {}, callback: (err: NodeJS.ErrnoException, files: string[]) => void): void; - export function readdirSync(path: string | Buffer, options?: string | {}): string[]; - export function close(fd: number, callback?: (err?: NodeJS.ErrnoException) => void): void; - export function closeSync(fd: number): void; - export function open(path: string | Buffer, flags: string | number, callback: (err: NodeJS.ErrnoException, fd: number) => void): void; - export function open(path: string | Buffer, flags: string | number, mode: number, callback: (err: NodeJS.ErrnoException, fd: number) => void): void; - export function openSync(path: string | Buffer, flags: string | number, mode?: number): number; - export function utimes(path: string | Buffer, atime: number, mtime: number, callback?: (err?: NodeJS.ErrnoException) => void): void; - export function utimes(path: string | Buffer, atime: Date, mtime: Date, callback?: (err?: NodeJS.ErrnoException) => void): void; - export function utimesSync(path: string | Buffer, atime: number, mtime: number): void; - export function utimesSync(path: string | Buffer, atime: Date, mtime: Date): void; - export function futimes(fd: number, atime: number, mtime: number, callback?: (err?: NodeJS.ErrnoException) => void): void; - export function futimes(fd: number, atime: Date, mtime: Date, callback?: (err?: NodeJS.ErrnoException) => void): void; - export function futimesSync(fd: number, atime: number, mtime: number): void; - export function futimesSync(fd: number, atime: Date, mtime: Date): void; - export function fsync(fd: number, callback?: (err?: NodeJS.ErrnoException) => void): void; - export function fsyncSync(fd: number): void; - export function write(fd: number, buffer: Buffer, offset: number, length: number, position: number | null, callback?: (err: NodeJS.ErrnoException, written: number, buffer: Buffer) => void): void; - export function write(fd: number, buffer: Buffer, offset: number, length: number, callback?: (err: NodeJS.ErrnoException, written: number, buffer: Buffer) => void): void; - export function write(fd: number, data: any, callback?: (err: NodeJS.ErrnoException, written: number, str: string) => void): void; - export function write(fd: number, data: any, offset: number, callback?: (err: NodeJS.ErrnoException, written: number, str: string) => void): void; - export function write(fd: number, data: any, offset: number, encoding: string, callback?: (err: NodeJS.ErrnoException, written: number, str: string) => void): void; - export function writeSync(fd: number, buffer: Buffer, offset: number, length: number, position?: number | null): number; - export function writeSync(fd: number, data: any, position?: number | null, enconding?: string): number; - export function read(fd: number, buffer: Buffer, offset: number, length: number, position: number | null, callback?: (err: NodeJS.ErrnoException, bytesRead: number, buffer: Buffer) => void): void; - export function readSync(fd: number, buffer: Buffer, offset: number, length: number, position: number | null): number; + export function lchown(path: PathLike, uid: number, gid: number, callback: (err: NodeJS.ErrnoException) => void): void; + + // NOTE: This namespace provides design-time support for util.promisify. Exported members do not exist at runtime. + export namespace lchown { + /** + * Asynchronous lchown(2) - Change ownership of a file. Does not dereference symbolic links. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + */ + export function __promisify__(path: PathLike, uid: number, gid: number): Promise; + } + /** - * Asynchronous readFile - Asynchronously reads the entire contents of a file. - * - * @param fileName - * @param encoding - * @param callback - The callback is passed two arguments (err, data), where data is the contents of the file. + * Synchronous lchown(2) - Change ownership of a file. Does not dereference symbolic links. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. */ - export function readFile(filename: string, encoding: null, callback: (err: NodeJS.ErrnoException, data: Buffer) => void): void; - export function readFile(filename: string, encoding: string, callback: (err: NodeJS.ErrnoException, data: string) => void): void; - export function readFile(filename: string, encoding: string | null, callback: (err: NodeJS.ErrnoException, data: string | Buffer) => void): void; + export function lchownSync(path: PathLike, uid: number, gid: number): void; + /** - * Asynchronous readFile - Asynchronously reads the entire contents of a file. - * - * @param fileName - * @param options An object with optional {encoding} and {flag} properties. If {encoding} is specified, readFile returns a string; otherwise it returns a Buffer. - * @param callback - The callback is passed two arguments (err, data), where data is the contents of the file. + * Asynchronous chmod(2) - Change permissions of a file. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param mode A file mode. If a string is passed, it is parsed as an octal integer. */ - export function readFile(filename: string, options: { encoding: null; flag?: string; }, callback: (err: NodeJS.ErrnoException, data: Buffer) => void): void; - export function readFile(filename: string, options: { encoding: string; flag?: string; }, callback: (err: NodeJS.ErrnoException, data: string) => void): void; - export function readFile(filename: string, options: { encoding: string | null; flag?: string; }, callback: (err: NodeJS.ErrnoException, data: string | Buffer) => void): void; + export function chmod(path: PathLike, mode: string | number, callback: (err: NodeJS.ErrnoException) => void): void; + + // NOTE: This namespace provides design-time support for util.promisify. Exported members do not exist at runtime. + export namespace chmod { + /** + * Asynchronous chmod(2) - Change permissions of a file. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param mode A file mode. If a string is passed, it is parsed as an octal integer. + */ + export function __promisify__(path: PathLike, mode: string | number): Promise; + } + /** - * Asynchronous readFile - Asynchronously reads the entire contents of a file. - * - * @param fileName - * @param options An object with optional {encoding} and {flag} properties. If {encoding} is specified, readFile returns a string; otherwise it returns a Buffer. - * @param callback - The callback is passed two arguments (err, data), where data is the contents of the file. + * Synchronous chmod(2) - Change permissions of a file. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param mode A file mode. If a string is passed, it is parsed as an octal integer. */ - export function readFile(filename: string, options: { flag?: string; }, callback: (err: NodeJS.ErrnoException, data: Buffer) => void): void; + export function chmodSync(path: PathLike, mode: string | number): void; + /** - * Asynchronous readFile - Asynchronously reads the entire contents of a file. - * - * @param fileName - * @param callback - The callback is passed two arguments (err, data), where data is the contents of the file. + * Asynchronous fchmod(2) - Change permissions of a file. + * @param fd A file descriptor. + * @param mode A file mode. If a string is passed, it is parsed as an octal integer. */ - export function readFile(filename: string, callback: (err: NodeJS.ErrnoException, data: Buffer) => void): void; + export function fchmod(fd: number, mode: string | number, callback: (err: NodeJS.ErrnoException) => void): void; + + // NOTE: This namespace provides design-time support for util.promisify. Exported members do not exist at runtime. + export namespace fchmod { + /** + * Asynchronous fchmod(2) - Change permissions of a file. + * @param fd A file descriptor. + * @param mode A file mode. If a string is passed, it is parsed as an octal integer. + */ + export function __promisify__(fd: number, mode: string | number): Promise; + } + /** - * Synchronous readFile - Synchronously reads the entire contents of a file. - * - * @param fileName - * @param encoding + * Synchronous fchmod(2) - Change permissions of a file. + * @param fd A file descriptor. + * @param mode A file mode. If a string is passed, it is parsed as an octal integer. */ - export function readFileSync(filename: string, encoding: null): Buffer; - export function readFileSync(filename: string, encoding: string): string; - export function readFileSync(filename: string, encoding: string | null): string | Buffer; + export function fchmodSync(fd: number, mode: string | number): void; + /** - * Synchronous readFile - Synchronously reads the entire contents of a file. - * - * @param fileName - * @param options An object with optional {encoding} and {flag} properties. If {encoding} is specified, readFileSync returns a string; otherwise it returns a Buffer. + * Asynchronous lchmod(2) - Change permissions of a file. Does not dereference symbolic links. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param mode A file mode. If a string is passed, it is parsed as an octal integer. */ - export function readFileSync(filename: string, options: { encoding: null; flag?: string; }): Buffer; - export function readFileSync(filename: string, options: { encoding: string; flag?: string; }): string; - export function readFileSync(filename: string, options: { encoding: string | null; flag?: string; }): string | Buffer; + export function lchmod(path: PathLike, mode: string | number, callback: (err: NodeJS.ErrnoException) => void): void; + + // NOTE: This namespace provides design-time support for util.promisify. Exported members do not exist at runtime. + export namespace lchmod { + /** + * Asynchronous lchmod(2) - Change permissions of a file. Does not dereference symbolic links. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param mode A file mode. If a string is passed, it is parsed as an octal integer. + */ + export function __promisify__(path: PathLike, mode: string | number): Promise; + } + /** - * Synchronous readFile - Synchronously reads the entire contents of a file. - * - * @param fileName - * @param options An object with optional {encoding} and {flag} properties. If {encoding} is specified, readFileSync returns a string; otherwise it returns a Buffer. + * Synchronous lchmod(2) - Change permissions of a file. Does not dereference symbolic links. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param mode A file mode. If a string is passed, it is parsed as an octal integer. */ - export function readFileSync(filename: string, options?: { flag?: string; }): Buffer; - export function writeFile(filename: string | number, data: any, callback?: (err: NodeJS.ErrnoException) => void): void; - export function writeFile(filename: string | number, data: any, encoding: string, callback: (err: NodeJS.ErrnoException) => void): void; - export function writeFile(filename: string | number, data: any, options: { encoding?: string; mode?: number; flag?: string; }, callback?: (err: NodeJS.ErrnoException) => void): void; - export function writeFile(filename: string | number, data: any, options: { encoding?: string; mode?: string; flag?: string; }, callback?: (err: NodeJS.ErrnoException) => void): void; - export function writeFileSync(filename: string | number, data: any, encoding: string): void; - export function writeFileSync(filename: string | number, data: any, options?: { encoding?: string; mode?: number; flag?: string; }): void; - export function writeFileSync(filename: string | number, data: any, options?: { encoding?: string; mode?: string; flag?: string; }): void; - export function appendFile(filename: string, data: any, encoding: string, callback: (err: NodeJS.ErrnoException) => void): void; - export function appendFile(filename: string, data: any, options: { encoding?: string; mode?: number; flag?: string; }, callback?: (err: NodeJS.ErrnoException) => void): void; - export function appendFile(filename: string, data: any, options: { encoding?: string; mode?: string; flag?: string; }, callback?: (err: NodeJS.ErrnoException) => void): void; - export function appendFile(filename: string, data: any, callback?: (err: NodeJS.ErrnoException) => void): void; - export function appendFileSync(filename: string, data: any, encoding: string): void; - export function appendFileSync(filename: string, data: any, options?: { encoding?: string; mode?: number; flag?: string; }): void; - export function appendFileSync(filename: string, data: any, options?: { encoding?: string; mode?: string; flag?: string; }): void; - export function watchFile(filename: string, listener: (curr: Stats, prev: Stats) => void): void; - export function watchFile(filename: string, options: { persistent?: boolean; interval?: number; }, listener: (curr: Stats, prev: Stats) => void): void; - export function unwatchFile(filename: string, listener?: (curr: Stats, prev: Stats) => void): void; - export function watch(filename: string, listener?: (event: string, filename: string) => any): FSWatcher; - export function watch(filename: string, encoding: string, listener?: (event: string, filename: string | Buffer) => any): FSWatcher; - export function watch(filename: string, options: { persistent?: boolean; recursive?: boolean; encoding?: string }, listener?: (event: string, filename: string | Buffer) => any): FSWatcher; - export function exists(path: string | Buffer, callback?: (exists: boolean) => void): void; - export function existsSync(path: string | Buffer): boolean; + export function lchmodSync(path: PathLike, mode: string | number): void; - export namespace constants { - // File Access Constants + /** + * Asynchronous stat(2) - Get file status. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + */ + export function stat(path: PathLike, callback: (err: NodeJS.ErrnoException, stats: Stats) => void): void; - /** Constant for fs.access(). File is visible to the calling process. */ - export const F_OK: number; + // NOTE: This namespace provides design-time support for util.promisify. Exported members do not exist at runtime. + export namespace stat { + /** + * Asynchronous stat(2) - Get file status. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + */ + export function __promisify__(path: PathLike): Promise; + } - /** Constant for fs.access(). File can be read by the calling process. */ - export const R_OK: number; + /** + * Synchronous stat(2) - Get file status. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + */ + export function statSync(path: PathLike): Stats; - /** Constant for fs.access(). File can be written by the calling process. */ - export const W_OK: number; + /** + * Asynchronous fstat(2) - Get file status. + * @param fd A file descriptor. + */ + export function fstat(fd: number, callback: (err: NodeJS.ErrnoException, stats: Stats) => void): void; - /** Constant for fs.access(). File can be executed by the calling process. */ - export const X_OK: number; + // NOTE: This namespace provides design-time support for util.promisify. Exported members do not exist at runtime. + export namespace fstat { + /** + * Asynchronous fstat(2) - Get file status. + * @param fd A file descriptor. + */ + export function __promisify__(fd: number): Promise; + } - // File Open Constants + /** + * Synchronous fstat(2) - Get file status. + * @param fd A file descriptor. + */ + export function fstatSync(fd: number): Stats; - /** Constant for fs.open(). Flag indicating to open a file for read-only access. */ - export const O_RDONLY: number; + /** + * Asynchronous lstat(2) - Get file status. Does not dereference symbolic links. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + */ + export function lstat(path: PathLike, callback: (err: NodeJS.ErrnoException, stats: Stats) => void): void; - /** Constant for fs.open(). Flag indicating to open a file for write-only access. */ - export const O_WRONLY: number; + // NOTE: This namespace provides design-time support for util.promisify. Exported members do not exist at runtime. + export namespace lstat { + /** + * Asynchronous lstat(2) - Get file status. Does not dereference symbolic links. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + */ + export function __promisify__(path: PathLike): Promise; + } - /** Constant for fs.open(). Flag indicating to open a file for read-write access. */ - export const O_RDWR: number; + /** + * Synchronous lstat(2) - Get file status. Does not dereference symbolic links. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + */ + export function lstatSync(path: PathLike): Stats; - /** Constant for fs.open(). Flag indicating to create the file if it does not already exist. */ - export const O_CREAT: number; + /** + * Asynchronous link(2) - Create a new link (also known as a hard link) to an existing file. + * @param existingPath A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param newPath A path to a file. If a URL is provided, it must use the `file:` protocol. + */ + export function link(existingPath: PathLike, newPath: PathLike, callback: (err: NodeJS.ErrnoException) => void): void; - /** Constant for fs.open(). Flag indicating that opening a file should fail if the O_CREAT flag is set and the file already exists. */ - export const O_EXCL: number; + // NOTE: This namespace provides design-time support for util.promisify. Exported members do not exist at runtime. + export namespace link { + /** + * Asynchronous link(2) - Create a new link (also known as a hard link) to an existing file. + * @param existingPath A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param newPath A path to a file. If a URL is provided, it must use the `file:` protocol. + */ + export function link(existingPath: PathLike, newPath: PathLike): Promise; + } - /** Constant for fs.open(). Flag indicating that if path identifies a terminal device, opening the path shall not cause that terminal to become the controlling terminal for the process (if the process does not already have one). */ - export const O_NOCTTY: number; + /** + * Synchronous link(2) - Create a new link (also known as a hard link) to an existing file. + * @param existingPath A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param newPath A path to a file. If a URL is provided, it must use the `file:` protocol. + */ + export function linkSync(existingPath: PathLike, newPath: PathLike): void; - /** Constant for fs.open(). Flag indicating that if the file exists and is a regular file, and the file is opened successfully for write access, its length shall be truncated to zero. */ - export const O_TRUNC: number; + /** + * Asynchronous symlink(2) - Create a new symbolic link to an existing file. + * @param target A path to an existing file. If a URL is provided, it must use the `file:` protocol. + * @param path A path to the new symlink. If a URL is provided, it must use the `file:` protocol. + * @param type May be set to `'dir'`, `'file'`, or `'junction'` (default is `'file'`) and is only available on Windows (ignored on other platforms). + * When using `'junction'`, the `target` argument will automatically be normalized to an absolute path. + */ + export function symlink(target: PathLike, path: PathLike, type: symlink.Type | undefined | null, callback: (err: NodeJS.ErrnoException) => void): void; - /** Constant for fs.open(). Flag indicating that data will be appended to the end of the file. */ - export const O_APPEND: number; + /** + * Asynchronous symlink(2) - Create a new symbolic link to an existing file. + * @param target A path to an existing file. If a URL is provided, it must use the `file:` protocol. + * @param path A path to the new symlink. If a URL is provided, it must use the `file:` protocol. + */ + export function symlink(target: PathLike, path: PathLike, callback: (err: NodeJS.ErrnoException) => void): void; - /** Constant for fs.open(). Flag indicating that the open should fail if the path is not a directory. */ - export const O_DIRECTORY: number; + // NOTE: This namespace provides design-time support for util.promisify. Exported members do not exist at runtime. + export namespace symlink { + /** + * Asynchronous symlink(2) - Create a new symbolic link to an existing file. + * @param target A path to an existing file. If a URL is provided, it must use the `file:` protocol. + * @param path A path to the new symlink. If a URL is provided, it must use the `file:` protocol. + * @param type May be set to `'dir'`, `'file'`, or `'junction'` (default is `'file'`) and is only available on Windows (ignored on other platforms). + * When using `'junction'`, the `target` argument will automatically be normalized to an absolute path. + */ + export function __promisify__(target: PathLike, path: PathLike, type?: string | null): Promise; - /** Constant for fs.open(). Flag indicating reading accesses to the file system will no longer result in an update to the atime information associated with the file. This flag is available on Linux operating systems only. */ - export const O_NOATIME: number; + export type Type = "dir" | "file" | "junction"; + } - /** Constant for fs.open(). Flag indicating that the open should fail if the path is a symbolic link. */ - export const O_NOFOLLOW: number; + /** + * Synchronous symlink(2) - Create a new symbolic link to an existing file. + * @param target A path to an existing file. If a URL is provided, it must use the `file:` protocol. + * @param path A path to the new symlink. If a URL is provided, it must use the `file:` protocol. + * @param type May be set to `'dir'`, `'file'`, or `'junction'` (default is `'file'`) and is only available on Windows (ignored on other platforms). + * When using `'junction'`, the `target` argument will automatically be normalized to an absolute path. + */ + export function symlinkSync(target: PathLike, path: PathLike, type?: symlink.Type | null): void; - /** Constant for fs.open(). Flag indicating that the file is opened for synchronous I/O. */ - export const O_SYNC: number; + /** + * Asynchronous readlink(2) - read value of a symbolic link. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. + */ + export function readlink(path: PathLike, options: { encoding?: BufferEncoding | null } | BufferEncoding | undefined | null, callback: (err: NodeJS.ErrnoException, linkString: string) => void): void; - /** Constant for fs.open(). Flag indicating to open the symbolic link itself rather than the resource it is pointing to. */ - export const O_SYMLINK: number; + /** + * Asynchronous readlink(2) - read value of a symbolic link. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. + */ + export function readlink(path: PathLike, options: { encoding: "buffer" } | "buffer", callback: (err: NodeJS.ErrnoException, linkString: Buffer) => void): void; - /** Constant for fs.open(). When set, an attempt will be made to minimize caching effects of file I/O. */ - export const O_DIRECT: number; + /** + * Asynchronous readlink(2) - read value of a symbolic link. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. + */ + export function readlink(path: PathLike, options: { encoding?: string | null } | string | undefined | null, callback: (err: NodeJS.ErrnoException, linkString: string | Buffer) => void): void; - /** Constant for fs.open(). Flag indicating to open the file in nonblocking mode when possible. */ - export const O_NONBLOCK: number; + /** + * Asynchronous readlink(2) - read value of a symbolic link. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + */ + export function readlink(path: PathLike, callback: (err: NodeJS.ErrnoException, linkString: string) => void): void; - // File Type Constants + // NOTE: This namespace provides design-time support for util.promisify. Exported members do not exist at runtime. + export namespace readlink { + /** + * Asynchronous readlink(2) - read value of a symbolic link. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. + */ + export function __promisify__(path: PathLike, options?: { encoding?: BufferEncoding | null } | BufferEncoding | null): Promise; - /** Constant for fs.Stats mode property for determining a file's type. Bit mask used to extract the file type code. */ - export const S_IFMT: number; + /** + * Asynchronous readlink(2) - read value of a symbolic link. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. + */ + export function __promisify__(path: PathLike, options: { encoding: "buffer" } | "buffer"): Promise; - /** Constant for fs.Stats mode property for determining a file's type. File type constant for a regular file. */ - export const S_IFREG: number; + /** + * Asynchronous readlink(2) - read value of a symbolic link. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. + */ + export function __promisify__(path: PathLike, options?: { encoding?: string | null } | string | null): Promise; + } - /** Constant for fs.Stats mode property for determining a file's type. File type constant for a directory. */ - export const S_IFDIR: number; + /** + * Synchronous readlink(2) - read value of a symbolic link. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. + */ + export function readlinkSync(path: PathLike, options?: { encoding?: BufferEncoding | null } | BufferEncoding | null): string; - /** Constant for fs.Stats mode property for determining a file's type. File type constant for a character-oriented device file. */ - export const S_IFCHR: number; + /** + * Synchronous readlink(2) - read value of a symbolic link. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. + */ + export function readlinkSync(path: PathLike, options: { encoding: "buffer" } | "buffer"): Buffer; - /** Constant for fs.Stats mode property for determining a file's type. File type constant for a block-oriented device file. */ - export const S_IFBLK: number; + /** + * Synchronous readlink(2) - read value of a symbolic link. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. + */ + export function readlinkSync(path: PathLike, options?: { encoding?: string | null } | string | null): string | Buffer; - /** Constant for fs.Stats mode property for determining a file's type. File type constant for a FIFO/pipe. */ - export const S_IFIFO: number; + /** + * Asynchronous realpath(3) - return the canonicalized absolute pathname. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. + */ + export function realpath(path: PathLike, options: { encoding?: BufferEncoding | null } | BufferEncoding | undefined | null, callback: (err: NodeJS.ErrnoException, resolvedPath: string) => void): void; - /** Constant for fs.Stats mode property for determining a file's type. File type constant for a symbolic link. */ - export const S_IFLNK: number; + /** + * Asynchronous realpath(3) - return the canonicalized absolute pathname. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. + */ + export function realpath(path: PathLike, options: { encoding: "buffer" } | "buffer", callback: (err: NodeJS.ErrnoException, resolvedPath: Buffer) => void): void; - /** Constant for fs.Stats mode property for determining a file's type. File type constant for a socket. */ - export const S_IFSOCK: number; + /** + * Asynchronous realpath(3) - return the canonicalized absolute pathname. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. + */ + export function realpath(path: PathLike, options: { encoding?: string | null } | string | undefined | null, callback: (err: NodeJS.ErrnoException, resolvedPath: string | Buffer) => void): void; - // File Mode Constants + /** + * Asynchronous realpath(3) - return the canonicalized absolute pathname. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + */ + export function realpath(path: PathLike, callback: (err: NodeJS.ErrnoException, resolvedPath: string) => void): void; - /** Constant for fs.Stats mode property for determining access permissions for a file. File mode indicating readable, writable and executable by owner. */ - export const S_IRWXU: number; + // NOTE: This namespace provides design-time support for util.promisify. Exported members do not exist at runtime. + export namespace realpath { + /** + * Asynchronous realpath(3) - return the canonicalized absolute pathname. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. + */ + export function __promisify__(path: PathLike, options?: { encoding?: BufferEncoding | null } | BufferEncoding | null): Promise; - /** Constant for fs.Stats mode property for determining access permissions for a file. File mode indicating readable by owner. */ - export const S_IRUSR: number; + /** + * Asynchronous realpath(3) - return the canonicalized absolute pathname. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. + */ + export function __promisify__(path: PathLike, options: { encoding: "buffer" } | "buffer"): Promise; - /** Constant for fs.Stats mode property for determining access permissions for a file. File mode indicating writable by owner. */ - export const S_IWUSR: number; + /** + * Asynchronous realpath(3) - return the canonicalized absolute pathname. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. + */ + export function __promisify__(path: PathLike, options?: { encoding?: string | null } | string | null): Promise; + } - /** Constant for fs.Stats mode property for determining access permissions for a file. File mode indicating executable by owner. */ - export const S_IXUSR: number; + /** + * Synchronous realpath(3) - return the canonicalized absolute pathname. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. + */ + export function realpathSync(path: PathLike, options?: { encoding?: BufferEncoding | null } | BufferEncoding | null): string; - /** Constant for fs.Stats mode property for determining access permissions for a file. File mode indicating readable, writable and executable by group. */ - export const S_IRWXG: number; + /** + * Synchronous realpath(3) - return the canonicalized absolute pathname. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. + */ + export function realpathSync(path: PathLike, options: { encoding: "buffer" } | "buffer"): Buffer; - /** Constant for fs.Stats mode property for determining access permissions for a file. File mode indicating readable by group. */ - export const S_IRGRP: number; + /** + * Synchronous realpath(3) - return the canonicalized absolute pathname. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. + */ + export function realpathSync(path: PathLike, options?: { encoding?: string | null } | string | null): string | Buffer; - /** Constant for fs.Stats mode property for determining access permissions for a file. File mode indicating writable by group. */ - export const S_IWGRP: number; + /** + * Asynchronous unlink(2) - delete a name and possibly the file it refers to. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + */ + export function unlink(path: PathLike, callback: (err: NodeJS.ErrnoException) => void): void; - /** Constant for fs.Stats mode property for determining access permissions for a file. File mode indicating executable by group. */ - export const S_IXGRP: number; + // NOTE: This namespace provides design-time support for util.promisify. Exported members do not exist at runtime. + export namespace unlink { + /** + * Asynchronous unlink(2) - delete a name and possibly the file it refers to. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + */ + export function __promisify__(path: PathLike): Promise; + } - /** Constant for fs.Stats mode property for determining access permissions for a file. File mode indicating readable, writable and executable by others. */ - export const S_IRWXO: number; + /** + * Synchronous unlink(2) - delete a name and possibly the file it refers to. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + */ + export function unlinkSync(path: PathLike): void; - /** Constant for fs.Stats mode property for determining access permissions for a file. File mode indicating readable by others. */ - export const S_IROTH: number; + /** + * Asynchronous rmdir(2) - delete a directory. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + */ + export function rmdir(path: PathLike, callback: (err: NodeJS.ErrnoException) => void): void; - /** Constant for fs.Stats mode property for determining access permissions for a file. File mode indicating writable by others. */ - export const S_IWOTH: number; + // NOTE: This namespace provides design-time support for util.promisify. Exported members do not exist at runtime. + export namespace rmdir { + /** + * Asynchronous rmdir(2) - delete a directory. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + */ + export function __promisify__(path: PathLike): Promise; + } - /** Constant for fs.Stats mode property for determining access permissions for a file. File mode indicating executable by others. */ - export const S_IXOTH: number; - } + /** + * Synchronous rmdir(2) - delete a directory. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + */ + export function rmdirSync(path: PathLike): void; - /** Tests a user's permissions for the file specified by path. */ - export function access(path: string | Buffer, callback: (err: NodeJS.ErrnoException) => void): void; - export function access(path: string | Buffer, mode: number, callback: (err: NodeJS.ErrnoException) => void): void; - /** Synchronous version of fs.access. This throws if any accessibility checks fail, and does nothing otherwise. */ - export function accessSync(path: string | Buffer, mode?: number): void; - export function createReadStream(path: string | Buffer, options?: { - flags?: string; - encoding?: string; - fd?: number; - mode?: number; - autoClose?: boolean; - start?: number; - end?: number; - }): ReadStream; - export function createWriteStream(path: string | Buffer, options?: { - flags?: string; - encoding?: string; - fd?: number; - mode?: number; - autoClose?: boolean; - start?: number; - }): WriteStream; - export function fdatasync(fd: number, callback: Function): void; - export function fdatasyncSync(fd: number): void; + /** + * Asynchronous mkdir(2) - create a directory. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param mode A file mode. If a string is passed, it is parsed as an octal integer. If not specified, defaults to `0o777`. + */ + export function mkdir(path: PathLike, mode: number | string | undefined | null, callback: (err: NodeJS.ErrnoException) => void): void; + + /** + * Asynchronous mkdir(2) - create a directory with a mode of `0o777`. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + */ + export function mkdir(path: PathLike, callback: (err: NodeJS.ErrnoException) => void): void; + + // NOTE: This namespace provides design-time support for util.promisify. Exported members do not exist at runtime. + export namespace mkdir { + /** + * Asynchronous mkdir(2) - create a directory. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param mode A file mode. If a string is passed, it is parsed as an octal integer. If not specified, defaults to `0o777`. + */ + export function __promisify__(path: PathLike, mode?: number | string | null): Promise; + } + + /** + * Synchronous mkdir(2) - create a directory. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param mode A file mode. If a string is passed, it is parsed as an octal integer. If not specified, defaults to `0o777`. + */ + export function mkdirSync(path: PathLike, mode?: number | string | null): void; + + /** + * Asynchronously creates a unique temporary directory. + * Generates six random characters to be appended behind a required prefix to create a unique temporary directory. + * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. + */ + export function mkdtemp(prefix: string, options: { encoding?: BufferEncoding | null } | BufferEncoding | undefined | null, callback: (err: NodeJS.ErrnoException, folder: string) => void): void; + + /** + * Asynchronously creates a unique temporary directory. + * Generates six random characters to be appended behind a required prefix to create a unique temporary directory. + * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. + */ + export function mkdtemp(prefix: string, options: "buffer" | { encoding: "buffer" }, callback: (err: NodeJS.ErrnoException, folder: Buffer) => void): void; + + /** + * Asynchronously creates a unique temporary directory. + * Generates six random characters to be appended behind a required prefix to create a unique temporary directory. + * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. + */ + export function mkdtemp(prefix: string, options: { encoding?: string | null } | string | undefined | null, callback: (err: NodeJS.ErrnoException, folder: string | Buffer) => void): void; + + /** + * Asynchronously creates a unique temporary directory. + * Generates six random characters to be appended behind a required prefix to create a unique temporary directory. + */ + export function mkdtemp(prefix: string, callback: (err: NodeJS.ErrnoException, folder: string) => void): void; + + // NOTE: This namespace provides design-time support for util.promisify. Exported members do not exist at runtime. + export namespace mkdtemp { + /** + * Asynchronously creates a unique temporary directory. + * Generates six random characters to be appended behind a required prefix to create a unique temporary directory. + * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. + */ + export function __promisify__(prefix: string, options?: { encoding?: BufferEncoding | null } | BufferEncoding | null): Promise; + + /** + * Asynchronously creates a unique temporary directory. + * Generates six random characters to be appended behind a required prefix to create a unique temporary directory. + * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. + */ + export function __promisify__(prefix: string, options: { encoding: "buffer" } | "buffer"): Promise; + + /** + * Asynchronously creates a unique temporary directory. + * Generates six random characters to be appended behind a required prefix to create a unique temporary directory. + * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. + */ + export function __promisify__(prefix: string, options?: { encoding?: string | null } | string | null): Promise; + } + + /** + * Synchronously creates a unique temporary directory. + * Generates six random characters to be appended behind a required prefix to create a unique temporary directory. + * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. + */ + export function mkdtempSync(prefix: string, options?: { encoding?: BufferEncoding | null } | BufferEncoding | null): string; + + /** + * Synchronously creates a unique temporary directory. + * Generates six random characters to be appended behind a required prefix to create a unique temporary directory. + * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. + */ + export function mkdtempSync(prefix: string, options: { encoding: "buffer" } | "buffer"): Buffer; + + /** + * Synchronously creates a unique temporary directory. + * Generates six random characters to be appended behind a required prefix to create a unique temporary directory. + * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. + */ + export function mkdtempSync(prefix: string, options?: { encoding?: string | null } | string | null): string | Buffer; + + /** + * Asynchronous readdir(3) - read a directory. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. + */ + export function readdir(path: PathLike, options: { encoding: BufferEncoding | null } | BufferEncoding | undefined | null, callback: (err: NodeJS.ErrnoException, files: string[]) => void): void; + + /** + * Asynchronous readdir(3) - read a directory. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. + */ + export function readdir(path: PathLike, options: { encoding: "buffer" } | "buffer", callback: (err: NodeJS.ErrnoException, files: Buffer[]) => void): void; + + /** + * Asynchronous readdir(3) - read a directory. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. + */ + export function readdir(path: PathLike, options: { encoding?: string | null } | string | undefined | null, callback: (err: NodeJS.ErrnoException, files: string[] | Buffer[]) => void): void; + + /** + * Asynchronous readdir(3) - read a directory. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + */ + export function readdir(path: PathLike, callback: (err: NodeJS.ErrnoException, files: string[]) => void): void; + + // NOTE: This namespace provides design-time support for util.promisify. Exported members do not exist at runtime. + export namespace readdir { + /** + * Asynchronous readdir(3) - read a directory. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. + */ + export function __promisify__(path: PathLike, options?: { encoding: BufferEncoding | null } | BufferEncoding | null): Promise; + + /** + * Asynchronous readdir(3) - read a directory. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. + */ + export function __promisify__(path: PathLike, options: "buffer" | { encoding: "buffer" }): Promise; + + /** + * Asynchronous readdir(3) - read a directory. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. + */ + export function __promisify__(path: PathLike, options?: { encoding?: string | null } | string | null): Promise; + } + + /** + * Synchronous readdir(3) - read a directory. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. + */ + export function readdirSync(path: PathLike, options?: { encoding: BufferEncoding | null } | BufferEncoding | null): string[]; + + /** + * Synchronous readdir(3) - read a directory. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. + */ + export function readdirSync(path: PathLike, options: { encoding: "buffer" } | "buffer"): Buffer[]; + + /** + * Synchronous readdir(3) - read a directory. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. + */ + export function readdirSync(path: PathLike, options?: { encoding?: string | null } | string | null): string[] | Buffer[]; + + /** + * Asynchronous close(2) - close a file descriptor. + * @param fd A file descriptor. + */ + export function close(fd: number, callback: (err: NodeJS.ErrnoException) => void): void; + + // NOTE: This namespace provides design-time support for util.promisify. Exported members do not exist at runtime. + export namespace close { + /** + * Asynchronous close(2) - close a file descriptor. + * @param fd A file descriptor. + */ + export function __promisify__(fd: number): Promise; + } + + /** + * Synchronous close(2) - close a file descriptor. + * @param fd A file descriptor. + */ + export function closeSync(fd: number): void; + + /** + * Asynchronous open(2) - open and possibly create a file. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param mode A file mode. If a string is passed, it is parsed as an octal integer. If not supplied, defaults to `0o666`. + */ + export function open(path: PathLike, flags: string | number, mode: string | number | undefined | null, callback: (err: NodeJS.ErrnoException, fd: number) => void): void; + + /** + * Asynchronous open(2) - open and possibly create a file. If the file is created, its mode will be `0o666`. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + */ + export function open(path: PathLike, flags: string | number, callback: (err: NodeJS.ErrnoException, fd: number) => void): void; + + // NOTE: This namespace provides design-time support for util.promisify. Exported members do not exist at runtime. + export namespace open { + /** + * Asynchronous open(2) - open and possibly create a file. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param mode A file mode. If a string is passed, it is parsed as an octal integer. If not supplied, defaults to `0o666`. + */ + export function __promisify__(path: PathLike, flags: string | number, mode?: string | number | null): Promise; + } + + /** + * Synchronous open(2) - open and possibly create a file, returning a file descriptor.. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param mode A file mode. If a string is passed, it is parsed as an octal integer. If not supplied, defaults to `0o666`. + */ + export function openSync(path: PathLike, flags: string | number, mode?: string | number | null): number; + + /** + * Asynchronously change file timestamps of the file referenced by the supplied path. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param atime The last access time. If a string is provided, it will be coerced to number. + * @param mtime The last modified time. If a string is provided, it will be coerced to number. + */ + export function utimes(path: PathLike, atime: string | number | Date, mtime: string | number | Date, callback: (err: NodeJS.ErrnoException) => void): void; + + // NOTE: This namespace provides design-time support for util.promisify. Exported members do not exist at runtime. + export namespace utimes { + /** + * Asynchronously change file timestamps of the file referenced by the supplied path. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param atime The last access time. If a string is provided, it will be coerced to number. + * @param mtime The last modified time. If a string is provided, it will be coerced to number. + */ + export function __promisify__(path: PathLike, atime: string | number | Date, mtime: string | number | Date): Promise; + } + + /** + * Synchronously change file timestamps of the file referenced by the supplied path. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * @param atime The last access time. If a string is provided, it will be coerced to number. + * @param mtime The last modified time. If a string is provided, it will be coerced to number. + */ + export function utimesSync(path: PathLike, atime: string | number | Date, mtime: string | number | Date): void; + + /** + * Asynchronously change file timestamps of the file referenced by the supplied file descriptor. + * @param fd A file descriptor. + * @param atime The last access time. If a string is provided, it will be coerced to number. + * @param mtime The last modified time. If a string is provided, it will be coerced to number. + */ + export function futimes(fd: number, atime: string | number | Date, mtime: string | number | Date, callback: (err: NodeJS.ErrnoException) => void): void; + + // NOTE: This namespace provides design-time support for util.promisify. Exported members do not exist at runtime. + export namespace futimes { + /** + * Asynchronously change file timestamps of the file referenced by the supplied file descriptor. + * @param fd A file descriptor. + * @param atime The last access time. If a string is provided, it will be coerced to number. + * @param mtime The last modified time. If a string is provided, it will be coerced to number. + */ + export function __promisify__(fd: number, atime: string | number | Date, mtime: string | number | Date): Promise; + } + + /** + * Synchronously change file timestamps of the file referenced by the supplied file descriptor. + * @param fd A file descriptor. + * @param atime The last access time. If a string is provided, it will be coerced to number. + * @param mtime The last modified time. If a string is provided, it will be coerced to number. + */ + export function futimesSync(fd: number, atime: string | number | Date, mtime: string | number | Date): void; + + /** + * Asynchronous fsync(2) - synchronize a file's in-core state with the underlying storage device. + * @param fd A file descriptor. + */ + export function fsync(fd: number, callback: (err: NodeJS.ErrnoException) => void): void; + + // NOTE: This namespace provides design-time support for util.promisify. Exported members do not exist at runtime. + export namespace fsync { + /** + * Asynchronous fsync(2) - synchronize a file's in-core state with the underlying storage device. + * @param fd A file descriptor. + */ + export function __promisify__(fd: number): Promise; + } + + /** + * Synchronous fsync(2) - synchronize a file's in-core state with the underlying storage device. + * @param fd A file descriptor. + */ + export function fsyncSync(fd: number): void; + + /** + * Asynchronously writes `buffer` to the file referenced by the supplied file descriptor. + * @param fd A file descriptor. + * @param offset The part of the buffer to be written. If not supplied, defaults to `0`. + * @param length The number of bytes to write. If not supplied, defaults to `buffer.length - offset`. + * @param position The offset from the beginning of the file where this data should be written. If not supplied, defaults to the current position. + */ + export function write(fd: number, buffer: TBuffer, offset: number | undefined | null, length: number | undefined | null, position: number | undefined | null, callback: (err: NodeJS.ErrnoException, written: number, buffer: TBuffer) => void): void; + + /** + * Asynchronously writes `buffer` to the file referenced by the supplied file descriptor. + * @param fd A file descriptor. + * @param offset The part of the buffer to be written. If not supplied, defaults to `0`. + * @param length The number of bytes to write. If not supplied, defaults to `buffer.length - offset`. + */ + export function write(fd: number, buffer: TBuffer, offset: number | undefined | null, length: number | undefined | null, callback: (err: NodeJS.ErrnoException, written: number, buffer: TBuffer) => void): void; + + /** + * Asynchronously writes `buffer` to the file referenced by the supplied file descriptor. + * @param fd A file descriptor. + * @param offset The part of the buffer to be written. If not supplied, defaults to `0`. + */ + export function write(fd: number, buffer: TBuffer, offset: number | undefined | null, callback: (err: NodeJS.ErrnoException, written: number, buffer: TBuffer) => void): void; + + /** + * Asynchronously writes `buffer` to the file referenced by the supplied file descriptor. + * @param fd A file descriptor. + */ + export function write(fd: number, buffer: TBuffer, callback: (err: NodeJS.ErrnoException, written: number, buffer: TBuffer) => void): void; + + /** + * Asynchronously writes `string` to the file referenced by the supplied file descriptor. + * @param fd A file descriptor. + * @param string A string to write. If something other than a string is supplied it will be coerced to a string. + * @param position The offset from the beginning of the file where this data should be written. If not supplied, defaults to the current position. + * @param encoding The expected string encoding. + */ + export function write(fd: number, string: any, position: number | undefined | null, encoding: string | undefined | null, callback: (err: NodeJS.ErrnoException, written: number, str: string) => void): void; + + /** + * Asynchronously writes `string` to the file referenced by the supplied file descriptor. + * @param fd A file descriptor. + * @param string A string to write. If something other than a string is supplied it will be coerced to a string. + * @param position The offset from the beginning of the file where this data should be written. If not supplied, defaults to the current position. + */ + export function write(fd: number, string: any, position: number | undefined | null, callback: (err: NodeJS.ErrnoException, written: number, str: string) => void): void; + + /** + * Asynchronously writes `string` to the file referenced by the supplied file descriptor. + * @param fd A file descriptor. + * @param string A string to write. If something other than a string is supplied it will be coerced to a string. + */ + export function write(fd: number, string: any, callback: (err: NodeJS.ErrnoException, written: number, str: string) => void): void; + + // NOTE: This namespace provides design-time support for util.promisify. Exported members do not exist at runtime. + export namespace write { + /** + * Asynchronously writes `buffer` to the file referenced by the supplied file descriptor. + * @param fd A file descriptor. + * @param offset The part of the buffer to be written. If not supplied, defaults to `0`. + * @param length The number of bytes to write. If not supplied, defaults to `buffer.length - offset`. + * @param position The offset from the beginning of the file where this data should be written. If not supplied, defaults to the current position. + */ + export function __promisify__(fd: number, buffer?: TBuffer, offset?: number, length?: number, position?: number | null): Promise<{ bytesWritten: number, buffer: TBuffer }>; + + /** + * Asynchronously writes `string` to the file referenced by the supplied file descriptor. + * @param fd A file descriptor. + * @param string A string to write. If something other than a string is supplied it will be coerced to a string. + * @param position The offset from the beginning of the file where this data should be written. If not supplied, defaults to the current position. + * @param encoding The expected string encoding. + */ + export function __promisify__(fd: number, string: any, position?: number | null, encoding?: string | null): Promise<{ bytesWritten: number, buffer: string }>; + } + + /** + * Synchronously writes `buffer` to the file referenced by the supplied file descriptor, returning the number of bytes written. + * @param fd A file descriptor. + * @param offset The part of the buffer to be written. If not supplied, defaults to `0`. + * @param length The number of bytes to write. If not supplied, defaults to `buffer.length - offset`. + * @param position The offset from the beginning of the file where this data should be written. If not supplied, defaults to the current position. + */ + export function writeSync(fd: number, buffer: Buffer | Uint8Array, offset?: number | null, length?: number | null, position?: number | null): number; + + /** + * Synchronously writes `string` to the file referenced by the supplied file descriptor, returning the number of bytes written. + * @param fd A file descriptor. + * @param string A string to write. If something other than a string is supplied it will be coerced to a string. + * @param position The offset from the beginning of the file where this data should be written. If not supplied, defaults to the current position. + * @param encoding The expected string encoding. + */ + export function writeSync(fd: number, string: any, position?: number | null, encoding?: string | null): number; + + /** + * Asynchronously reads data from the file referenced by the supplied file descriptor. + * @param fd A file descriptor. + * @param buffer The buffer that the data will be written to. + * @param offset The offset in the buffer at which to start writing. + * @param length The number of bytes to read. + * @param position The offset from the beginning of the file from which data should be read. If `null`, data will be read from the current position. + */ + export function read(fd: number, buffer: TBuffer, offset: number, length: number, position: number | null, callback?: (err: NodeJS.ErrnoException, bytesRead: number, buffer: TBuffer) => void): void; + + // NOTE: This namespace provides design-time support for util.promisify. Exported members do not exist at runtime. + export namespace read { + /** + * @param fd A file descriptor. + * @param buffer The buffer that the data will be written to. + * @param offset The offset in the buffer at which to start writing. + * @param length The number of bytes to read. + * @param position The offset from the beginning of the file from which data should be read. If `null`, data will be read from the current position. + */ + export function __promisify__(fd: number, buffer: TBuffer, offset: number, length: number, position: number | null): Promise<{ bytesRead: number, buffer: TBuffer }>; + } + + /** + * Synchronously reads data from the file referenced by the supplied file descriptor, returning the number of bytes read. + * @param fd A file descriptor. + * @param buffer The buffer that the data will be written to. + * @param offset The offset in the buffer at which to start writing. + * @param length The number of bytes to read. + * @param position The offset from the beginning of the file from which data should be read. If `null`, data will be read from the current position. + */ + export function readSync(fd: number, buffer: Buffer | Uint8Array, offset: number, length: number, position: number | null): number; + + /** + * Asynchronously reads the entire contents of a file. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * If a file descriptor is provided, the underlying file will _not_ be closed automatically. + * @param options An object that may contain an optional flag. + * If a flag is not provided, it defaults to `'r'`. + */ + export function readFile(path: PathLike | number, options: { encoding?: null; flag?: string; } | undefined | null, callback: (err: NodeJS.ErrnoException, data: Buffer) => void): void; + + /** + * Asynchronously reads the entire contents of a file. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * URL support is _experimental_. + * If a file descriptor is provided, the underlying file will _not_ be closed automatically. + * @param options Either the encoding for the result, or an object that contains the encoding and an optional flag. + * If a flag is not provided, it defaults to `'r'`. + */ + export function readFile(path: PathLike | number, options: { encoding: string; flag?: string; } | string, callback: (err: NodeJS.ErrnoException, data: string) => void): void; + + /** + * Asynchronously reads the entire contents of a file. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * URL support is _experimental_. + * If a file descriptor is provided, the underlying file will _not_ be closed automatically. + * @param options Either the encoding for the result, or an object that contains the encoding and an optional flag. + * If a flag is not provided, it defaults to `'r'`. + */ + export function readFile(path: PathLike | number, options: { encoding?: string | null; flag?: string; } | string | undefined | null, callback: (err: NodeJS.ErrnoException, data: string | Buffer) => void): void; + + /** + * Asynchronously reads the entire contents of a file. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * If a file descriptor is provided, the underlying file will _not_ be closed automatically. + */ + export function readFile(path: PathLike | number, callback: (err: NodeJS.ErrnoException, data: Buffer) => void): void; + + // NOTE: This namespace provides design-time support for util.promisify. Exported members do not exist at runtime. + export namespace readFile { + /** + * Asynchronously reads the entire contents of a file. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * If a file descriptor is provided, the underlying file will _not_ be closed automatically. + * @param options An object that may contain an optional flag. + * If a flag is not provided, it defaults to `'r'`. + */ + export function __promisify__(path: PathLike | number, options?: { encoding?: null; flag?: string; } | null): Promise; + + /** + * Asynchronously reads the entire contents of a file. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * URL support is _experimental_. + * If a file descriptor is provided, the underlying file will _not_ be closed automatically. + * @param options Either the encoding for the result, or an object that contains the encoding and an optional flag. + * If a flag is not provided, it defaults to `'r'`. + */ + export function __promisify__(path: PathLike | number, options: { encoding: string; flag?: string; } | string): Promise; + + /** + * Asynchronously reads the entire contents of a file. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * URL support is _experimental_. + * If a file descriptor is provided, the underlying file will _not_ be closed automatically. + * @param options Either the encoding for the result, or an object that contains the encoding and an optional flag. + * If a flag is not provided, it defaults to `'r'`. + */ + export function __promisify__(path: PathLike | number, options?: { encoding?: string | null; flag?: string; } | string | null): Promise; + } + + /** + * Synchronously reads the entire contents of a file. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * URL support is _experimental_. + * If a file descriptor is provided, the underlying file will _not_ be closed automatically. + * @param options An object that may contain an optional flag. If a flag is not provided, it defaults to `'r'`. + */ + export function readFileSync(path: PathLike | number, options?: { encoding?: null; flag?: string; } | null): Buffer; + + /** + * Synchronously reads the entire contents of a file. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * URL support is _experimental_. + * If a file descriptor is provided, the underlying file will _not_ be closed automatically. + * @param options Either the encoding for the result, or an object that contains the encoding and an optional flag. + * If a flag is not provided, it defaults to `'r'`. + */ + export function readFileSync(path: PathLike | number, options: { encoding: string; flag?: string; } | string): string; + + /** + * Synchronously reads the entire contents of a file. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * URL support is _experimental_. + * If a file descriptor is provided, the underlying file will _not_ be closed automatically. + * @param options Either the encoding for the result, or an object that contains the encoding and an optional flag. + * If a flag is not provided, it defaults to `'r'`. + */ + export function readFileSync(path: PathLike | number, options?: { encoding?: string | null; flag?: string; } | string | null): string | Buffer; + + /** + * Asynchronously writes data to a file, replacing the file if it already exists. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * URL support is _experimental_. + * If a file descriptor is provided, the underlying file will _not_ be closed automatically. + * @param data The data to write. If something other than a Buffer or Uint8Array is provided, the value is coerced to a string. + * @param options Either the encoding for the file, or an object optionally specifying the encoding, file mode, and flag. + * If `encoding` is not supplied, the default of `'utf8'` is used. + * If `mode` is not supplied, the default of `0o666` is used. + * If `mode` is a string, it is parsed as an octal integer. + * If `flag` is not supplied, the default of `'w'` is used. + */ + export function writeFile(path: PathLike | number, data: any, options: { encoding?: string | null; mode?: number | string; flag?: string; } | string | undefined | null, callback: (err: NodeJS.ErrnoException) => void): void; + + /** + * Asynchronously writes data to a file, replacing the file if it already exists. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * URL support is _experimental_. + * If a file descriptor is provided, the underlying file will _not_ be closed automatically. + * @param data The data to write. If something other than a Buffer or Uint8Array is provided, the value is coerced to a string. + */ + export function writeFile(path: PathLike | number, data: any, callback: (err: NodeJS.ErrnoException) => void): void; + + // NOTE: This namespace provides design-time support for util.promisify. Exported members do not exist at runtime. + export namespace writeFile { + /** + * Asynchronously writes data to a file, replacing the file if it already exists. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * URL support is _experimental_. + * If a file descriptor is provided, the underlying file will _not_ be closed automatically. + * @param data The data to write. If something other than a Buffer or Uint8Array is provided, the value is coerced to a string. + * @param options Either the encoding for the file, or an object optionally specifying the encoding, file mode, and flag. + * If `encoding` is not supplied, the default of `'utf8'` is used. + * If `mode` is not supplied, the default of `0o666` is used. + * If `mode` is a string, it is parsed as an octal integer. + * If `flag` is not supplied, the default of `'w'` is used. + */ + export function __promisify__(path: PathLike | number, data: any, options?: { encoding?: string | null; mode?: number | string; flag?: string; } | string | null): Promise; + } + + /** + * Synchronously writes data to a file, replacing the file if it already exists. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * URL support is _experimental_. + * If a file descriptor is provided, the underlying file will _not_ be closed automatically. + * @param data The data to write. If something other than a Buffer or Uint8Array is provided, the value is coerced to a string. + * @param options Either the encoding for the file, or an object optionally specifying the encoding, file mode, and flag. + * If `encoding` is not supplied, the default of `'utf8'` is used. + * If `mode` is not supplied, the default of `0o666` is used. + * If `mode` is a string, it is parsed as an octal integer. + * If `flag` is not supplied, the default of `'w'` is used. + */ + export function writeFileSync(path: PathLike | number, data: any, options?: { encoding?: string | null; mode?: number | string; flag?: string; } | string | null): void; + + /** + * Asynchronously append data to a file, creating the file if it does not exist. + * @param file A path to a file. If a URL is provided, it must use the `file:` protocol. + * URL support is _experimental_. + * If a file descriptor is provided, the underlying file will _not_ be closed automatically. + * @param data The data to write. If something other than a Buffer or Uint8Array is provided, the value is coerced to a string. + * @param options Either the encoding for the file, or an object optionally specifying the encoding, file mode, and flag. + * If `encoding` is not supplied, the default of `'utf8'` is used. + * If `mode` is not supplied, the default of `0o666` is used. + * If `mode` is a string, it is parsed as an octal integer. + * If `flag` is not supplied, the default of `'a'` is used. + */ + export function appendFile(file: PathLike | number, data: any, options: { encoding?: string | null, mode?: string | number, flag?: string } | string | undefined | null, callback: (err: NodeJS.ErrnoException) => void): void; + + /** + * Asynchronously append data to a file, creating the file if it does not exist. + * @param file A path to a file. If a URL is provided, it must use the `file:` protocol. + * URL support is _experimental_. + * If a file descriptor is provided, the underlying file will _not_ be closed automatically. + * @param data The data to write. If something other than a Buffer or Uint8Array is provided, the value is coerced to a string. + */ + export function appendFile(file: PathLike | number, data: any, callback: (err: NodeJS.ErrnoException) => void): void; + + // NOTE: This namespace provides design-time support for util.promisify. Exported members do not exist at runtime. + export namespace appendFile { + /** + * Asynchronously append data to a file, creating the file if it does not exist. + * @param file A path to a file. If a URL is provided, it must use the `file:` protocol. + * URL support is _experimental_. + * If a file descriptor is provided, the underlying file will _not_ be closed automatically. + * @param data The data to write. If something other than a Buffer or Uint8Array is provided, the value is coerced to a string. + * @param options Either the encoding for the file, or an object optionally specifying the encoding, file mode, and flag. + * If `encoding` is not supplied, the default of `'utf8'` is used. + * If `mode` is not supplied, the default of `0o666` is used. + * If `mode` is a string, it is parsed as an octal integer. + * If `flag` is not supplied, the default of `'a'` is used. + */ + export function __promisify__(file: PathLike | number, data: any, options?: { encoding?: string | null, mode?: string | number, flag?: string } | string | null): Promise; + } + + /** + * Synchronously append data to a file, creating the file if it does not exist. + * @param file A path to a file. If a URL is provided, it must use the `file:` protocol. + * URL support is _experimental_. + * If a file descriptor is provided, the underlying file will _not_ be closed automatically. + * @param data The data to write. If something other than a Buffer or Uint8Array is provided, the value is coerced to a string. + * @param options Either the encoding for the file, or an object optionally specifying the encoding, file mode, and flag. + * If `encoding` is not supplied, the default of `'utf8'` is used. + * If `mode` is not supplied, the default of `0o666` is used. + * If `mode` is a string, it is parsed as an octal integer. + * If `flag` is not supplied, the default of `'a'` is used. + */ + export function appendFileSync(file: PathLike | number, data: any, options?: { encoding?: string | null; mode?: number | string; flag?: string; } | string | null): void; + + /** + * Watch for changes on `filename`. The callback `listener` will be called each time the file is accessed. + */ + export function watchFile(filename: PathLike, options: { persistent?: boolean; interval?: number; } | undefined, listener: (curr: Stats, prev: Stats) => void): void; + + /** + * Watch for changes on `filename`. The callback `listener` will be called each time the file is accessed. + * @param filename A path to a file or directory. If a URL is provided, it must use the `file:` protocol. + * URL support is _experimental_. + */ + export function watchFile(filename: PathLike, listener: (curr: Stats, prev: Stats) => void): void; + + /** + * Stop watching for changes on `filename`. + * @param filename A path to a file or directory. If a URL is provided, it must use the `file:` protocol. + * URL support is _experimental_. + */ + export function unwatchFile(filename: PathLike, listener?: (curr: Stats, prev: Stats) => void): void; + + /** + * Watch for changes on `filename`, where `filename` is either a file or a directory, returning an `FSWatcher`. + * @param filename A path to a file or directory. If a URL is provided, it must use the `file:` protocol. + * URL support is _experimental_. + * @param options Either the encoding for the filename provided to the listener, or an object optionally specifying encoding, persistent, and recursive options. + * If `encoding` is not supplied, the default of `'utf8'` is used. + * If `persistent` is not supplied, the default of `true` is used. + * If `recursive` is not supplied, the default of `false` is used. + */ + export function watch(filename: PathLike, options: { encoding?: BufferEncoding | null, persistent?: boolean, recursive?: boolean } | BufferEncoding | undefined | null, listener?: (event: string, filename: string) => void): FSWatcher; + + /** + * Watch for changes on `filename`, where `filename` is either a file or a directory, returning an `FSWatcher`. + * @param filename A path to a file or directory. If a URL is provided, it must use the `file:` protocol. + * URL support is _experimental_. + * @param options Either the encoding for the filename provided to the listener, or an object optionally specifying encoding, persistent, and recursive options. + * If `encoding` is not supplied, the default of `'utf8'` is used. + * If `persistent` is not supplied, the default of `true` is used. + * If `recursive` is not supplied, the default of `false` is used. + */ + export function watch(filename: PathLike, options: { encoding: "buffer", persistent?: boolean, recursive?: boolean } | "buffer", listener?: (event: string, filename: Buffer) => void): FSWatcher; + + /** + * Watch for changes on `filename`, where `filename` is either a file or a directory, returning an `FSWatcher`. + * @param filename A path to a file or directory. If a URL is provided, it must use the `file:` protocol. + * URL support is _experimental_. + * @param options Either the encoding for the filename provided to the listener, or an object optionally specifying encoding, persistent, and recursive options. + * If `encoding` is not supplied, the default of `'utf8'` is used. + * If `persistent` is not supplied, the default of `true` is used. + * If `recursive` is not supplied, the default of `false` is used. + */ + export function watch(filename: PathLike, options: { encoding?: string | null, persistent?: boolean, recursive?: boolean } | string | null, listener?: (event: string, filename: string | Buffer) => void): FSWatcher; + + /** + * Watch for changes on `filename`, where `filename` is either a file or a directory, returning an `FSWatcher`. + * @param filename A path to a file or directory. If a URL is provided, it must use the `file:` protocol. + * URL support is _experimental_. + */ + export function watch(filename: PathLike, listener?: (event: string, filename: string) => any): FSWatcher; + + /** + * Asynchronously tests whether or not the given path exists by checking with the file system. + * @deprecated + * @param path A path to a file or directory. If a URL is provided, it must use the `file:` protocol. + * URL support is _experimental_. + */ + export function exists(path: PathLike, callback: (exists: boolean) => void): void; + + // NOTE: This namespace provides design-time support for util.promisify. Exported members do not exist at runtime. + export namespace exists { + /** + * @param path A path to a file or directory. If a URL is provided, it must use the `file:` protocol. + * URL support is _experimental_. + */ + function __promisify__(path: PathLike): Promise; + } + + /** + * Synchronously tests whether or not the given path exists by checking with the file system. + * @param path A path to a file or directory. If a URL is provided, it must use the `file:` protocol. + * URL support is _experimental_. + */ + export function existsSync(path: PathLike): boolean; + + export namespace constants { + // File Access Constants + + /** Constant for fs.access(). File is visible to the calling process. */ + export const F_OK: number; + + /** Constant for fs.access(). File can be read by the calling process. */ + export const R_OK: number; + + /** Constant for fs.access(). File can be written by the calling process. */ + export const W_OK: number; + + /** Constant for fs.access(). File can be executed by the calling process. */ + export const X_OK: number; + + // File Open Constants + + /** Constant for fs.open(). Flag indicating to open a file for read-only access. */ + export const O_RDONLY: number; + + /** Constant for fs.open(). Flag indicating to open a file for write-only access. */ + export const O_WRONLY: number; + + /** Constant for fs.open(). Flag indicating to open a file for read-write access. */ + export const O_RDWR: number; + + /** Constant for fs.open(). Flag indicating to create the file if it does not already exist. */ + export const O_CREAT: number; + + /** Constant for fs.open(). Flag indicating that opening a file should fail if the O_CREAT flag is set and the file already exists. */ + export const O_EXCL: number; + + /** Constant for fs.open(). Flag indicating that if path identifies a terminal device, opening the path shall not cause that terminal to become the controlling terminal for the process (if the process does not already have one). */ + export const O_NOCTTY: number; + + /** Constant for fs.open(). Flag indicating that if the file exists and is a regular file, and the file is opened successfully for write access, its length shall be truncated to zero. */ + export const O_TRUNC: number; + + /** Constant for fs.open(). Flag indicating that data will be appended to the end of the file. */ + export const O_APPEND: number; + + /** Constant for fs.open(). Flag indicating that the open should fail if the path is not a directory. */ + export const O_DIRECTORY: number; + + /** Constant for fs.open(). Flag indicating reading accesses to the file system will no longer result in an update to the atime information associated with the file. This flag is available on Linux operating systems only. */ + export const O_NOATIME: number; + + /** Constant for fs.open(). Flag indicating that the open should fail if the path is a symbolic link. */ + export const O_NOFOLLOW: number; + + /** Constant for fs.open(). Flag indicating that the file is opened for synchronous I/O. */ + export const O_SYNC: number; + + /** Constant for fs.open(). Flag indicating that the file is opened for synchronous I/O with write operations waiting for data integrity. */ + export const O_DSYNC: number; + + /** Constant for fs.open(). Flag indicating to open the symbolic link itself rather than the resource it is pointing to. */ + export const O_SYMLINK: number; + + /** Constant for fs.open(). When set, an attempt will be made to minimize caching effects of file I/O. */ + export const O_DIRECT: number; + + /** Constant for fs.open(). Flag indicating to open the file in nonblocking mode when possible. */ + export const O_NONBLOCK: number; + + // File Type Constants + + /** Constant for fs.Stats mode property for determining a file's type. Bit mask used to extract the file type code. */ + export const S_IFMT: number; + + /** Constant for fs.Stats mode property for determining a file's type. File type constant for a regular file. */ + export const S_IFREG: number; + + /** Constant for fs.Stats mode property for determining a file's type. File type constant for a directory. */ + export const S_IFDIR: number; + + /** Constant for fs.Stats mode property for determining a file's type. File type constant for a character-oriented device file. */ + export const S_IFCHR: number; + + /** Constant for fs.Stats mode property for determining a file's type. File type constant for a block-oriented device file. */ + export const S_IFBLK: number; + + /** Constant for fs.Stats mode property for determining a file's type. File type constant for a FIFO/pipe. */ + export const S_IFIFO: number; + + /** Constant for fs.Stats mode property for determining a file's type. File type constant for a symbolic link. */ + export const S_IFLNK: number; + + /** Constant for fs.Stats mode property for determining a file's type. File type constant for a socket. */ + export const S_IFSOCK: number; + + // File Mode Constants + + /** Constant for fs.Stats mode property for determining access permissions for a file. File mode indicating readable, writable and executable by owner. */ + export const S_IRWXU: number; + + /** Constant for fs.Stats mode property for determining access permissions for a file. File mode indicating readable by owner. */ + export const S_IRUSR: number; + + /** Constant for fs.Stats mode property for determining access permissions for a file. File mode indicating writable by owner. */ + export const S_IWUSR: number; + + /** Constant for fs.Stats mode property for determining access permissions for a file. File mode indicating executable by owner. */ + export const S_IXUSR: number; + + /** Constant for fs.Stats mode property for determining access permissions for a file. File mode indicating readable, writable and executable by group. */ + export const S_IRWXG: number; + + /** Constant for fs.Stats mode property for determining access permissions for a file. File mode indicating readable by group. */ + export const S_IRGRP: number; + + /** Constant for fs.Stats mode property for determining access permissions for a file. File mode indicating writable by group. */ + export const S_IWGRP: number; + + /** Constant for fs.Stats mode property for determining access permissions for a file. File mode indicating executable by group. */ + export const S_IXGRP: number; + + /** Constant for fs.Stats mode property for determining access permissions for a file. File mode indicating readable, writable and executable by others. */ + export const S_IRWXO: number; + + /** Constant for fs.Stats mode property for determining access permissions for a file. File mode indicating readable by others. */ + export const S_IROTH: number; + + /** Constant for fs.Stats mode property for determining access permissions for a file. File mode indicating writable by others. */ + export const S_IWOTH: number; + + /** Constant for fs.Stats mode property for determining access permissions for a file. File mode indicating executable by others. */ + export const S_IXOTH: number; + + /** Constant for fs.copyFile. Flag indicating the destination file should not be overwritten if it already exists. */ + export const COPYFILE_EXCL: number; + } + + /** + * Asynchronously tests a user's permissions for the file specified by path. + * @param path A path to a file or directory. If a URL is provided, it must use the `file:` protocol. + * URL support is _experimental_. + */ + export function access(path: PathLike, mode: number | undefined, callback: (err: NodeJS.ErrnoException) => void): void; + + /** + * Asynchronously tests a user's permissions for the file specified by path. + * @param path A path to a file or directory. If a URL is provided, it must use the `file:` protocol. + * URL support is _experimental_. + */ + export function access(path: PathLike, callback: (err: NodeJS.ErrnoException) => void): void; + + // NOTE: This namespace provides design-time support for util.promisify. Exported members do not exist at runtime. + export namespace access { + /** + * Asynchronously tests a user's permissions for the file specified by path. + * @param path A path to a file or directory. If a URL is provided, it must use the `file:` protocol. + * URL support is _experimental_. + */ + export function __promisify__(path: PathLike, mode?: number): Promise; + } + + /** + * Synchronously tests a user's permissions for the file specified by path. + * @param path A path to a file or directory. If a URL is provided, it must use the `file:` protocol. + * URL support is _experimental_. + */ + export function accessSync(path: PathLike, mode?: number): void; + + /** + * Returns a new `ReadStream` object. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * URL support is _experimental_. + */ + export function createReadStream(path: PathLike, options?: string | { + flags?: string; + encoding?: string; + fd?: number; + mode?: number; + autoClose?: boolean; + start?: number; + end?: number; + highWaterMark?: number; + }): ReadStream; + + /** + * Returns a new `WriteStream` object. + * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. + * URL support is _experimental_. + */ + export function createWriteStream(path: PathLike, options?: string | { + flags?: string; + encoding?: string; + fd?: number; + mode?: number; + autoClose?: boolean; + start?: number; + }): WriteStream; + + /** + * Asynchronous fdatasync(2) - synchronize a file's in-core state with storage device. + * @param fd A file descriptor. + */ + export function fdatasync(fd: number, callback: (err: NodeJS.ErrnoException) => void): void; + + // NOTE: This namespace provides design-time support for util.promisify. Exported members do not exist at runtime. + export namespace fdatasync { + /** + * Asynchronous fdatasync(2) - synchronize a file's in-core state with storage device. + * @param fd A file descriptor. + */ + export function __promisify__(fd: number): Promise; + } + + /** + * Synchronous fdatasync(2) - synchronize a file's in-core state with storage device. + * @param fd A file descriptor. + */ + export function fdatasyncSync(fd: number): void; + + /** + * Asynchronously copies src to dest. By default, dest is overwritten if it already exists. + * No arguments other than a possible exception are given to the callback function. + * Node.js makes no guarantees about the atomicity of the copy operation. + * If an error occurs after the destination file has been opened for writing, Node.js will attempt + * to remove the destination. + * @param src A path to the source file. + * @param dest A path to the destination file. + */ + export function copyFile(src: PathLike, dest: PathLike, callback: (err: NodeJS.ErrnoException) => void): void; + /** + * Asynchronously copies src to dest. By default, dest is overwritten if it already exists. + * No arguments other than a possible exception are given to the callback function. + * Node.js makes no guarantees about the atomicity of the copy operation. + * If an error occurs after the destination file has been opened for writing, Node.js will attempt + * to remove the destination. + * @param src A path to the source file. + * @param dest A path to the destination file. + * @param flags An integer that specifies the behavior of the copy operation. The only supported flag is fs.constants.COPYFILE_EXCL, which causes the copy operation to fail if dest already exists. + */ + export function copyFile(src: PathLike, dest: PathLike, flags: number, callback: (err: NodeJS.ErrnoException) => void): void; + + // NOTE: This namespace provides design-time support for util.promisify. Exported members do not exist at runtime. + export namespace copyFile { + /** + * Asynchronously copies src to dest. By default, dest is overwritten if it already exists. + * No arguments other than a possible exception are given to the callback function. + * Node.js makes no guarantees about the atomicity of the copy operation. + * If an error occurs after the destination file has been opened for writing, Node.js will attempt + * to remove the destination. + * @param src A path to the source file. + * @param dest A path to the destination file. + * @param flags An optional integer that specifies the behavior of the copy operation. The only supported flag is fs.constants.COPYFILE_EXCL, which causes the copy operation to fail if dest already exists. + */ + export function __promisify__(src: PathLike, dst: PathLike, flags?: number): Promise; + } + + /** + * Synchronously copies src to dest. By default, dest is overwritten if it already exists. + * Node.js makes no guarantees about the atomicity of the copy operation. + * If an error occurs after the destination file has been opened for writing, Node.js will attempt + * to remove the destination. + * @param src A path to the source file. + * @param dest A path to the destination file. + * @param flags An optional integer that specifies the behavior of the copy operation. The only supported flag is fs.constants.COPYFILE_EXCL, which causes the copy operation to fail if dest already exists. + */ + export function copyFileSync(src: PathLike, dest: PathLike, flags?: number): void; } declare module "path" { - /** * A parsed path object generated by path.parse() or consumed by path.format(). */ - export interface ParsedPath { + export interface ParsedPath { /** * The root of the path such as '/' or 'c:\' */ - root: string; + root: string; /** * The full directory path such as '/home/user/dir' or 'c:\path\dir' */ - dir: string; + dir: string; /** * The file name including extension (if any) such as 'index.html' */ - base: string; + base: string; /** * The file extension (if any) such as '.html' */ - ext: string; + ext: string; /** * The file name without extension (if any) such as 'index' */ - name: string; - } + name: string; + } + export interface FormatInputPathObject { + /** + * The root of the path such as '/' or 'c:\' + */ + root?: string; + /** + * The full directory path such as '/home/user/dir' or 'c:\path\dir' + */ + dir?: string; + /** + * The file name including extension (if any) such as 'index.html' + */ + base?: string; + /** + * The file extension (if any) such as '.html' + */ + ext?: string; + /** + * The file name without extension (if any) such as 'index' + */ + name?: string; + } /** * Normalize a string path, reducing '..' and '.' parts. @@ -2925,14 +4636,14 @@ declare module "path" { * * @param p string path to normalize. */ - export function normalize(p: string): string; + export function normalize(p: string): string; /** * Join all arguments together and normalize the resulting path. * Arguments must be strings. In v0.8, non-string arguments were silently ignored. In v0.10 and up, an exception is thrown. * * @param paths paths to join. */ - export function join(...paths: string[]): string; + export function join(...paths: string[]): string; /** * The right-most parameter is considered {to}. Other parameters are considered an array of {from}. * @@ -2942,27 +4653,24 @@ declare module "path" { * * @param pathSegments string paths to join. Non-string arguments are ignored. */ - export function resolve(...pathSegments: any[]): string; + export function resolve(...pathSegments: string[]): string; /** * Determines whether {path} is an absolute path. An absolute path will always resolve to the same location, regardless of the working directory. * * @param path path to test. */ - export function isAbsolute(path: string): boolean; + export function isAbsolute(path: string): boolean; /** * Solve the relative path from {from} to {to}. * At times we have two absolute paths, and we need to derive the relative path from one to the other. This is actually the reverse transform of path.resolve. - * - * @param from - * @param to */ - export function relative(from: string, to: string): string; + export function relative(from: string, to: string): string; /** * Return the directory name of a path. Similar to the Unix dirname command. * * @param p the path to evaluate. */ - export function dirname(p: string): string; + export function dirname(p: string): string; /** * Return the last portion of a path. Similar to the Unix basename command. * Often used to extract the file name from a fully qualified path. @@ -2970,176 +4678,177 @@ declare module "path" { * @param p the path to evaluate. * @param ext optionally, an extension to remove from the result. */ - export function basename(p: string, ext?: string): string; + export function basename(p: string, ext?: string): string; /** * Return the extension of the path, from the last '.' to end of string in the last portion of the path. * If there is no '.' in the last portion of the path or the first character of it is '.', then it returns an empty string * * @param p the path to evaluate. */ - export function extname(p: string): string; + export function extname(p: string): string; /** * The platform-specific file separator. '\\' or '/'. */ - export var sep: string; + export var sep: '\\' | '/'; /** * The platform-specific file delimiter. ';' or ':'. */ - export var delimiter: string; + export var delimiter: ';' | ':'; /** * Returns an object from a path string - the opposite of format(). * * @param pathString path to evaluate. */ - export function parse(pathString: string): ParsedPath; + export function parse(pathString: string): ParsedPath; /** * Returns a path string from an object - the opposite of parse(). * * @param pathString path to evaluate. */ - export function format(pathObject: ParsedPath): string; + export function format(pathObject: FormatInputPathObject): string; - export module posix { - export function normalize(p: string): string; - export function join(...paths: any[]): string; - export function resolve(...pathSegments: any[]): string; - export function isAbsolute(p: string): boolean; - export function relative(from: string, to: string): string; - export function dirname(p: string): string; - export function basename(p: string, ext?: string): string; - export function extname(p: string): string; - export var sep: string; - export var delimiter: string; - export function parse(p: string): ParsedPath; - export function format(pP: ParsedPath): string; - } + export module posix { + export function normalize(p: string): string; + export function join(...paths: any[]): string; + export function resolve(...pathSegments: any[]): string; + export function isAbsolute(p: string): boolean; + export function relative(from: string, to: string): string; + export function dirname(p: string): string; + export function basename(p: string, ext?: string): string; + export function extname(p: string): string; + export var sep: string; + export var delimiter: string; + export function parse(p: string): ParsedPath; + export function format(pP: FormatInputPathObject): string; + } - export module win32 { - export function normalize(p: string): string; - export function join(...paths: any[]): string; - export function resolve(...pathSegments: any[]): string; - export function isAbsolute(p: string): boolean; - export function relative(from: string, to: string): string; - export function dirname(p: string): string; - export function basename(p: string, ext?: string): string; - export function extname(p: string): string; - export var sep: string; - export var delimiter: string; - export function parse(p: string): ParsedPath; - export function format(pP: ParsedPath): string; - } + export module win32 { + export function normalize(p: string): string; + export function join(...paths: any[]): string; + export function resolve(...pathSegments: any[]): string; + export function isAbsolute(p: string): boolean; + export function relative(from: string, to: string): string; + export function dirname(p: string): string; + export function basename(p: string, ext?: string): string; + export function extname(p: string): string; + export var sep: string; + export var delimiter: string; + export function parse(p: string): ParsedPath; + export function format(pP: FormatInputPathObject): string; + } } declare module "string_decoder" { - export interface NodeStringDecoder { - write(buffer: Buffer): string; - end(buffer?: Buffer): string; - } - export var StringDecoder: { - new(encoding?: string): NodeStringDecoder; - }; + export interface NodeStringDecoder { + write(buffer: Buffer): string; + end(buffer?: Buffer): string; + } + export var StringDecoder: { + new(encoding?: string): NodeStringDecoder; + }; } declare module "tls" { - import * as crypto from "crypto"; - import * as net from "net"; - import * as stream from "stream"; + import * as crypto from "crypto"; + import * as dns from "dns"; + import * as net from "net"; + import * as stream from "stream"; - var CLIENT_RENEG_LIMIT: number; - var CLIENT_RENEG_WINDOW: number; + var CLIENT_RENEG_LIMIT: number; + var CLIENT_RENEG_WINDOW: number; - export interface Certificate { + export interface Certificate { /** * Country code. */ - C: string; + C: string; /** * Street. */ - ST: string; + ST: string; /** * Locality. */ - L: string; + L: string; /** * Organization. */ - O: string; + O: string; /** * Organizational unit. */ - OU: string; + OU: string; /** * Common name. */ - CN: string; - } + CN: string; + } - export interface PeerCertificate { - subject: Certificate; - issuer: Certificate; - subjectaltname: string; - infoAccess: { [index: string]: string[] }; - modulus: string; - exponent: string; - valid_from: string; - valid_to: string; - fingerprint: string; - ext_key_usage: string[]; - serialNumber: string; - raw: Buffer; - } + export interface PeerCertificate { + subject: Certificate; + issuer: Certificate; + subjectaltname: string; + infoAccess: { [index: string]: string[] | undefined }; + modulus: string; + exponent: string; + valid_from: string; + valid_to: string; + fingerprint: string; + ext_key_usage: string[]; + serialNumber: string; + raw: Buffer; + } - export interface DetailedPeerCertificate extends PeerCertificate { - issuerCertificate: DetailedPeerCertificate; - } + export interface DetailedPeerCertificate extends PeerCertificate { + issuerCertificate: DetailedPeerCertificate; + } - export interface CipherNameAndProtocol { + export interface CipherNameAndProtocol { /** * The cipher name. */ - name: string; + name: string; /** * SSL/TLS protocol version. */ - version: string; - } + version: string; + } - export class TLSSocket extends net.Socket { + export class TLSSocket extends net.Socket { /** * Construct a new tls.TLSSocket object from an existing TCP socket. */ - constructor(socket: net.Socket, options?: { + constructor(socket: net.Socket, options?: { /** * An optional TLS context object from tls.createSecureContext() */ - secureContext?: SecureContext, + secureContext?: SecureContext, /** * If true the TLS socket will be instantiated in server-mode. * Defaults to false. */ - isServer?: boolean, + isServer?: boolean, /** * An optional net.Server instance. */ - server?: net.Server, + server?: net.Server, /** * If true the server will request a certificate from clients that * connect and attempt to verify that certificate. Defaults to * false. */ - requestCert?: boolean, + requestCert?: boolean, /** * If true the server will reject any connection which is not * authorized with the list of supplied CAs. This option only has an * effect if requestCert is true. Defaults to false. */ - rejectUnauthorized?: boolean, + rejectUnauthorized?: boolean, /** * An array of strings or a Buffer naming possible NPN protocols. * (Protocols should be ordered by their priority.) */ - NPNProtocols?: string[] | Buffer, + NPNProtocols?: string[] | Buffer[] | Uint8Array[] | Buffer | Uint8Array, /** * An array of strings or a Buffer naming possible ALPN protocols. * (Protocols should be ordered by their priority.) When the server @@ -3147,7 +4856,7 @@ declare module "tls" { * precedence over NPN and the server does not send an NPN extension * to the client. */ - ALPNProtocols?: string[] | Buffer, + ALPNProtocols?: string[] | Buffer[] | Uint8Array[] | Buffer | Uint8Array, /** * SNICallback(servername, cb) A function that will be * called if the client supports SNI TLS extension. Two arguments @@ -3157,99 +4866,81 @@ declare module "tls" { * SecureContext.) If SNICallback wasn't provided the default callback * with high-level API will be used (see below). */ - SNICallback?: Function, + SNICallback?: (servername: string, cb: (err: Error | null, ctx: SecureContext) => void) => void, /** * An optional Buffer instance containing a TLS session. */ - session?: Buffer, + session?: Buffer, /** * If true, specifies that the OCSP status request extension will be * added to the client hello and an 'OCSPResponse' event will be * emitted on the socket before establishing a secure communication */ - requestOCSP?: boolean - }); - /** - * Returns the bound address, the address family name and port of the underlying socket as reported by - * the operating system. - * @returns {any} - An object with three properties, e.g. { port: 12346, family: 'IPv4', address: '127.0.0.1' }. - */ - address(): { port: number; family: string; address: string }; + requestOCSP?: boolean + }); + /** * A boolean that is true if the peer certificate was signed by one of the specified CAs, otherwise false. */ - authorized: boolean; + authorized: boolean; /** * The reason why the peer's certificate has not been verified. * This property becomes available only when tlsSocket.authorized === false. */ - authorizationError: Error; + authorizationError: Error; /** * Static boolean value, always true. * May be used to distinguish TLS sockets from regular ones. */ - encrypted: boolean; + encrypted: boolean; /** * Returns an object representing the cipher name and the SSL/TLS protocol version of the current connection. - * @returns {CipherNameAndProtocol} - Returns an object representing the cipher name + * @returns Returns an object representing the cipher name * and the SSL/TLS protocol version of the current connection. */ - getCipher(): CipherNameAndProtocol; + getCipher(): CipherNameAndProtocol; /** * Returns an object representing the peer's certificate. * The returned object has some properties corresponding to the field of the certificate. * If detailed argument is true the full chain with issuer property will be returned, * if false only the top certificate without issuer property. * If the peer does not provide a certificate, it returns null or an empty object. - * @param {boolean} detailed - If true; the full chain with issuer property will be returned. - * @returns {PeerCertificate | DetailedPeerCertificate} - An object representing the peer's certificate. + * @param detailed - If true; the full chain with issuer property will be returned. + * @returns An object representing the peer's certificate. */ - getPeerCertificate(detailed: true): DetailedPeerCertificate; - getPeerCertificate(detailed?: false): PeerCertificate; - getPeerCertificate(detailed?: boolean): PeerCertificate | DetailedPeerCertificate; + getPeerCertificate(detailed: true): DetailedPeerCertificate; + getPeerCertificate(detailed?: false): PeerCertificate; + getPeerCertificate(detailed?: boolean): PeerCertificate | DetailedPeerCertificate; + /** + * Returns a string containing the negotiated SSL/TLS protocol version of the current connection. + * The value `'unknown'` will be returned for connected sockets that have not completed the handshaking process. + * The value `null` will be returned for server sockets or disconnected client sockets. + * See https://www.openssl.org/docs/man1.0.2/ssl/SSL_get_version.html for more information. + * @returns negotiated SSL/TLS protocol version of the current connection + */ + getProtocol(): string | null; /** * Could be used to speed up handshake establishment when reconnecting to the server. - * @returns {any} - ASN.1 encoded TLS session or undefined if none was negotiated. + * @returns ASN.1 encoded TLS session or undefined if none was negotiated. */ - getSession(): any; + getSession(): any; /** * NOTE: Works only with client TLS sockets. * Useful only for debugging, for session reuse provide session option to tls.connect(). - * @returns {any} - TLS session ticket or undefined if none was negotiated. + * @returns TLS session ticket or undefined if none was negotiated. */ - getTLSTicket(): any; - /** - * The string representation of the local IP address. - */ - localAddress: string; - /** - * The numeric representation of the local port. - */ - localPort: number; - /** - * The string representation of the remote IP address. - * For example, '74.125.127.100' or '2001:4860:a005::68'. - */ - remoteAddress: string; - /** - * The string representation of the remote IP family. 'IPv4' or 'IPv6'. - */ - remoteFamily: string; - /** - * The numeric representation of the remote port. For example, 443. - */ - remotePort: number; + getTLSTicket(): any; /** * Initiate TLS renegotiation process. * * NOTE: Can be used to request peer's certificate after the secure connection has been established. * ANOTHER NOTE: When running as the server, socket will be destroyed with an error after handshakeTimeout timeout. - * @param {TlsOptions} options - The options may contain the following fields: rejectUnauthorized, + * @param options - The options may contain the following fields: rejectUnauthorized, * requestCert (See tls.createServer() for details). - * @param {Function} callback - callback(err) will be executed with null as err, once the renegotiation + * @param callback - callback(err) will be executed with null as err, once the renegotiation * is successfully completed. */ - renegotiate(options: TlsOptions, callback: (err: Error) => any): any; + renegotiate(options: { rejectUnauthorized?: boolean, requestCert?: boolean }, callback: (err: Error | null) => void): any; /** * Set maximum TLS fragment size (default and maximum value is: 16384, minimum is: 512). * Smaller fragment size decreases buffering latency on the client: large fragments are buffered by @@ -3257,97 +4948,74 @@ declare module "tls" { * large fragments can span multiple roundtrips, and their processing can be delayed due to packet * loss or reordering. However, smaller fragments add extra TLS framing bytes and CPU overhead, * which may decrease overall server throughput. - * @param {number} size - TLS fragment size (default and maximum value is: 16384, minimum is: 512). - * @returns {boolean} - Returns true on success, false otherwise. + * @param size - TLS fragment size (default and maximum value is: 16384, minimum is: 512). + * @returns Returns true on success, false otherwise. */ - setMaxSendFragment(size: number): boolean; + setMaxSendFragment(size: number): boolean; /** * events.EventEmitter * 1. OCSPResponse * 2. secureConnect - **/ - addListener(event: string, listener: Function): this; - addListener(event: "OCSPResponse", listener: (response: Buffer) => void): this; - addListener(event: "secureConnect", listener: () => void): this; + */ + addListener(event: string, listener: (...args: any[]) => void): this; + addListener(event: "OCSPResponse", listener: (response: Buffer) => void): this; + addListener(event: "secureConnect", listener: () => void): this; - emit(event: string | symbol, ...args: any[]): boolean; - emit(event: "OCSPResponse", response: Buffer): boolean; - emit(event: "secureConnect"): boolean; + emit(event: string | symbol, ...args: any[]): boolean; + emit(event: "OCSPResponse", response: Buffer): boolean; + emit(event: "secureConnect"): boolean; - on(event: string, listener: Function): this; - on(event: "OCSPResponse", listener: (response: Buffer) => void): this; - on(event: "secureConnect", listener: () => void): this; + on(event: string, listener: (...args: any[]) => void): this; + on(event: "OCSPResponse", listener: (response: Buffer) => void): this; + on(event: "secureConnect", listener: () => void): this; - once(event: string, listener: Function): this; - once(event: "OCSPResponse", listener: (response: Buffer) => void): this; - once(event: "secureConnect", listener: () => void): this; + once(event: string, listener: (...args: any[]) => void): this; + once(event: "OCSPResponse", listener: (response: Buffer) => void): this; + once(event: "secureConnect", listener: () => void): this; - prependListener(event: string, listener: Function): this; - prependListener(event: "OCSPResponse", listener: (response: Buffer) => void): this; - prependListener(event: "secureConnect", listener: () => void): this; + prependListener(event: string, listener: (...args: any[]) => void): this; + prependListener(event: "OCSPResponse", listener: (response: Buffer) => void): this; + prependListener(event: "secureConnect", listener: () => void): this; - prependOnceListener(event: string, listener: Function): this; - prependOnceListener(event: "OCSPResponse", listener: (response: Buffer) => void): this; - prependOnceListener(event: "secureConnect", listener: () => void): this; - } + prependOnceListener(event: string, listener: (...args: any[]) => void): this; + prependOnceListener(event: "OCSPResponse", listener: (response: Buffer) => void): this; + prependOnceListener(event: "secureConnect", listener: () => void): this; + } - export interface TlsOptions { - host?: string; - port?: number; - pfx?: string | Buffer[]; - key?: string | string[] | Buffer | any[]; - passphrase?: string; - cert?: string | string[] | Buffer | Buffer[]; - ca?: string | string[] | Buffer | Buffer[]; - crl?: string | string[]; - ciphers?: string; - honorCipherOrder?: boolean; - requestCert?: boolean; - rejectUnauthorized?: boolean; - NPNProtocols?: string[] | Buffer; - SNICallback?: (servername: string, cb: (err: Error, ctx: SecureContext) => any) => any; - ecdhCurve?: string; - dhparam?: string | Buffer; - handshakeTimeout?: number; - ALPNProtocols?: string[] | Buffer; - sessionTimeout?: number; - ticketKeys?: any; - sessionIdContext?: string; - secureProtocol?: string; - } + export interface TlsOptions extends SecureContextOptions { + handshakeTimeout?: number; + requestCert?: boolean; + rejectUnauthorized?: boolean; + NPNProtocols?: string[] | Buffer[] | Uint8Array[] | Buffer | Uint8Array; + ALPNProtocols?: string[] | Buffer[] | Uint8Array[] | Buffer | Uint8Array; + SNICallback?: (servername: string, cb: (err: Error | null, ctx: SecureContext) => void) => void; + sessionTimeout?: number; + ticketKeys?: Buffer; + } - export interface ConnectionOptions { - host?: string; - port?: number; - socket?: net.Socket; - pfx?: string | Buffer - key?: string | string[] | Buffer | Buffer[]; - passphrase?: string; - cert?: string | string[] | Buffer | Buffer[]; - ca?: string | Buffer | (string | Buffer)[]; - rejectUnauthorized?: boolean; - NPNProtocols?: (string | Buffer)[]; - servername?: string; - path?: string; - ALPNProtocols?: (string | Buffer)[]; - checkServerIdentity?: (servername: string, cert: string | Buffer | (string | Buffer)[]) => any; - secureProtocol?: string; - secureContext?: Object; - session?: Buffer; - minDHSize?: number; - } + export interface ConnectionOptions extends SecureContextOptions { + host?: string; + port?: number; + path?: string; // Creates unix socket connection to path. If this option is specified, `host` and `port` are ignored. + socket?: net.Socket; // Establish secure connection on a given socket rather than creating a new socket + rejectUnauthorized?: boolean; // Defaults to true + NPNProtocols?: string[] | Buffer[] | Uint8Array[] | Buffer | Uint8Array; + ALPNProtocols?: string[] | Buffer[] | Uint8Array[] | Buffer | Uint8Array; + checkServerIdentity?: typeof checkServerIdentity; + servername?: string; // SNI TLS Extension + session?: Buffer; + minDHSize?: number; + secureContext?: SecureContext; // If not provided, the entire ConnectionOptions object will be passed to tls.createSecureContext() + lookup?: net.LookupFunction; + } - export interface Server extends net.Server { - close(callback?: Function): Server; - address(): { port: number; family: string; address: string; }; - addContext(hostName: string, credentials: { - key: string; - cert: string; - ca: string; - }): void; - maxConnections: number; - connections: number; + export class Server extends net.Server { + addContext(hostName: string, credentials: { + key: string; + cert: string; + ca: string; + }): void; /** * events.EventEmitter @@ -3356,1022 +5024,2216 @@ declare module "tls" { * 3. OCSPRequest * 4. resumeSession * 5. secureConnection - **/ - addListener(event: string, listener: Function): this; - addListener(event: "tlsClientError", listener: (err: Error, tlsSocket: TLSSocket) => void): this; - addListener(event: "newSession", listener: (sessionId: any, sessionData: any, callback: (err: Error, resp: Buffer) => void) => void): this; - addListener(event: "OCSPRequest", listener: (certificate: Buffer, issuer: Buffer, callback: Function) => void): this; - addListener(event: "resumeSession", listener: (sessionId: any, callback: (err: Error, sessionData: any) => void) => void): this; - addListener(event: "secureConnection", listener: (tlsSocket: TLSSocket) => void): this; + */ + addListener(event: string, listener: (...args: any[]) => void): this; + addListener(event: "tlsClientError", listener: (err: Error, tlsSocket: TLSSocket) => void): this; + addListener(event: "newSession", listener: (sessionId: any, sessionData: any, callback: (err: Error, resp: Buffer) => void) => void): this; + addListener(event: "OCSPRequest", listener: (certificate: Buffer, issuer: Buffer, callback: Function) => void): this; + addListener(event: "resumeSession", listener: (sessionId: any, callback: (err: Error, sessionData: any) => void) => void): this; + addListener(event: "secureConnection", listener: (tlsSocket: TLSSocket) => void): this; - emit(event: string | symbol, ...args: any[]): boolean; - emit(event: "tlsClientError", err: Error, tlsSocket: TLSSocket): boolean; - emit(event: "newSession", sessionId: any, sessionData: any, callback: (err: Error, resp: Buffer) => void): boolean; - emit(event: "OCSPRequest", certificate: Buffer, issuer: Buffer, callback: Function): boolean; - emit(event: "resumeSession", sessionId: any, callback: (err: Error, sessionData: any) => void): boolean; - emit(event: "secureConnection", tlsSocket: TLSSocket): boolean; + emit(event: string | symbol, ...args: any[]): boolean; + emit(event: "tlsClientError", err: Error, tlsSocket: TLSSocket): boolean; + emit(event: "newSession", sessionId: any, sessionData: any, callback: (err: Error, resp: Buffer) => void): boolean; + emit(event: "OCSPRequest", certificate: Buffer, issuer: Buffer, callback: Function): boolean; + emit(event: "resumeSession", sessionId: any, callback: (err: Error, sessionData: any) => void): boolean; + emit(event: "secureConnection", tlsSocket: TLSSocket): boolean; - on(event: string, listener: Function): this; - on(event: "tlsClientError", listener: (err: Error, tlsSocket: TLSSocket) => void): this; - on(event: "newSession", listener: (sessionId: any, sessionData: any, callback: (err: Error, resp: Buffer) => void) => void): this; - on(event: "OCSPRequest", listener: (certificate: Buffer, issuer: Buffer, callback: Function) => void): this; - on(event: "resumeSession", listener: (sessionId: any, callback: (err: Error, sessionData: any) => void) => void): this; - on(event: "secureConnection", listener: (tlsSocket: TLSSocket) => void): this; + on(event: string, listener: (...args: any[]) => void): this; + on(event: "tlsClientError", listener: (err: Error, tlsSocket: TLSSocket) => void): this; + on(event: "newSession", listener: (sessionId: any, sessionData: any, callback: (err: Error, resp: Buffer) => void) => void): this; + on(event: "OCSPRequest", listener: (certificate: Buffer, issuer: Buffer, callback: Function) => void): this; + on(event: "resumeSession", listener: (sessionId: any, callback: (err: Error, sessionData: any) => void) => void): this; + on(event: "secureConnection", listener: (tlsSocket: TLSSocket) => void): this; - once(event: string, listener: Function): this; - once(event: "tlsClientError", listener: (err: Error, tlsSocket: TLSSocket) => void): this; - once(event: "newSession", listener: (sessionId: any, sessionData: any, callback: (err: Error, resp: Buffer) => void) => void): this; - once(event: "OCSPRequest", listener: (certificate: Buffer, issuer: Buffer, callback: Function) => void): this; - once(event: "resumeSession", listener: (sessionId: any, callback: (err: Error, sessionData: any) => void) => void): this; - once(event: "secureConnection", listener: (tlsSocket: TLSSocket) => void): this; + once(event: string, listener: (...args: any[]) => void): this; + once(event: "tlsClientError", listener: (err: Error, tlsSocket: TLSSocket) => void): this; + once(event: "newSession", listener: (sessionId: any, sessionData: any, callback: (err: Error, resp: Buffer) => void) => void): this; + once(event: "OCSPRequest", listener: (certificate: Buffer, issuer: Buffer, callback: Function) => void): this; + once(event: "resumeSession", listener: (sessionId: any, callback: (err: Error, sessionData: any) => void) => void): this; + once(event: "secureConnection", listener: (tlsSocket: TLSSocket) => void): this; - prependListener(event: string, listener: Function): this; - prependListener(event: "tlsClientError", listener: (err: Error, tlsSocket: TLSSocket) => void): this; - prependListener(event: "newSession", listener: (sessionId: any, sessionData: any, callback: (err: Error, resp: Buffer) => void) => void): this; - prependListener(event: "OCSPRequest", listener: (certificate: Buffer, issuer: Buffer, callback: Function) => void): this; - prependListener(event: "resumeSession", listener: (sessionId: any, callback: (err: Error, sessionData: any) => void) => void): this; - prependListener(event: "secureConnection", listener: (tlsSocket: TLSSocket) => void): this; + prependListener(event: string, listener: (...args: any[]) => void): this; + prependListener(event: "tlsClientError", listener: (err: Error, tlsSocket: TLSSocket) => void): this; + prependListener(event: "newSession", listener: (sessionId: any, sessionData: any, callback: (err: Error, resp: Buffer) => void) => void): this; + prependListener(event: "OCSPRequest", listener: (certificate: Buffer, issuer: Buffer, callback: Function) => void): this; + prependListener(event: "resumeSession", listener: (sessionId: any, callback: (err: Error, sessionData: any) => void) => void): this; + prependListener(event: "secureConnection", listener: (tlsSocket: TLSSocket) => void): this; - prependOnceListener(event: string, listener: Function): this; - prependOnceListener(event: "tlsClientError", listener: (err: Error, tlsSocket: TLSSocket) => void): this; - prependOnceListener(event: "newSession", listener: (sessionId: any, sessionData: any, callback: (err: Error, resp: Buffer) => void) => void): this; - prependOnceListener(event: "OCSPRequest", listener: (certificate: Buffer, issuer: Buffer, callback: Function) => void): this; - prependOnceListener(event: "resumeSession", listener: (sessionId: any, callback: (err: Error, sessionData: any) => void) => void): this; - prependOnceListener(event: "secureConnection", listener: (tlsSocket: TLSSocket) => void): this; - } + prependOnceListener(event: string, listener: (...args: any[]) => void): this; + prependOnceListener(event: "tlsClientError", listener: (err: Error, tlsSocket: TLSSocket) => void): this; + prependOnceListener(event: "newSession", listener: (sessionId: any, sessionData: any, callback: (err: Error, resp: Buffer) => void) => void): this; + prependOnceListener(event: "OCSPRequest", listener: (certificate: Buffer, issuer: Buffer, callback: Function) => void): this; + prependOnceListener(event: "resumeSession", listener: (sessionId: any, callback: (err: Error, sessionData: any) => void) => void): this; + prependOnceListener(event: "secureConnection", listener: (tlsSocket: TLSSocket) => void): this; + } - export interface ClearTextStream extends stream.Duplex { - authorized: boolean; - authorizationError: Error; - getPeerCertificate(): any; - getCipher: { - name: string; - version: string; - }; - address: { - port: number; - family: string; - address: string; - }; - remoteAddress: string; - remotePort: number; - } + export interface ClearTextStream extends stream.Duplex { + authorized: boolean; + authorizationError: Error; + getPeerCertificate(): any; + getCipher: { + name: string; + version: string; + }; + address: { + port: number; + family: string; + address: string; + }; + remoteAddress: string; + remotePort: number; + } - export interface SecurePair { - encrypted: any; - cleartext: any; - } + export interface SecurePair { + encrypted: any; + cleartext: any; + } - export interface SecureContextOptions { - pfx?: string | Buffer; - key?: string | Buffer; - passphrase?: string; - cert?: string | Buffer; - ca?: string | Buffer; - crl?: string | string[] - ciphers?: string; - honorCipherOrder?: boolean; - } + export interface SecureContextOptions { + pfx?: string | Buffer | Array; + key?: string | Buffer | Array; + passphrase?: string; + cert?: string | Buffer | Array; + ca?: string | Buffer | Array; + ciphers?: string; + honorCipherOrder?: boolean; + ecdhCurve?: string; + crl?: string | Buffer | Array; + dhparam?: string | Buffer; + secureOptions?: number; // Value is a numeric bitmask of the `SSL_OP_*` options + secureProtocol?: string; // SSL Method, e.g. SSLv23_method + sessionIdContext?: string; + } - export interface SecureContext { - context: any; - } + export interface SecureContext { + context: any; + } - export function createServer(options: TlsOptions, secureConnectionListener?: (socket: TLSSocket) => void): Server; - export function connect(options: ConnectionOptions, secureConnectionListener?: () => void): TLSSocket; - export function connect(port: number, host?: string, options?: ConnectionOptions, secureConnectListener?: () => void): TLSSocket; - export function connect(port: number, options?: ConnectionOptions, secureConnectListener?: () => void): TLSSocket; - export function createSecurePair(credentials?: crypto.Credentials, isServer?: boolean, requestCert?: boolean, rejectUnauthorized?: boolean): SecurePair; - export function createSecureContext(details: SecureContextOptions): SecureContext; + /* + * Verifies the certificate `cert` is issued to host `host`. + * @host The hostname to verify the certificate against + * @cert PeerCertificate representing the peer's certificate + * + * Returns Error object, populating it with the reason, host and cert on failure. On success, returns undefined. + */ + export function checkServerIdentity(host: string, cert: PeerCertificate): Error | undefined; + export function createServer(options: TlsOptions, secureConnectionListener?: (socket: TLSSocket) => void): Server; + export function connect(options: ConnectionOptions, secureConnectionListener?: () => void): TLSSocket; + export function connect(port: number, host?: string, options?: ConnectionOptions, secureConnectListener?: () => void): TLSSocket; + export function connect(port: number, options?: ConnectionOptions, secureConnectListener?: () => void): TLSSocket; + export function createSecurePair(credentials?: crypto.Credentials, isServer?: boolean, requestCert?: boolean, rejectUnauthorized?: boolean): SecurePair; + export function createSecureContext(details: SecureContextOptions): SecureContext; + export function getCiphers(): string[]; + + export var DEFAULT_ECDH_CURVE: string; } declare module "crypto" { - export interface Certificate { - exportChallenge(spkac: string | Buffer): Buffer; - exportPublicKey(spkac: string | Buffer): Buffer; - verifySpkac(spkac: Buffer): boolean; - } - export var Certificate: { - new(): Certificate; - (): Certificate; - } + export interface Certificate { + exportChallenge(spkac: string | Buffer): Buffer; + exportPublicKey(spkac: string | Buffer): Buffer; + verifySpkac(spkac: Buffer): boolean; + } + export var Certificate: { + new(): Certificate; + (): Certificate; + }; - export var fips: boolean; + export var fips: boolean; - export interface CredentialDetails { - pfx: string; - key: string; - passphrase: string; - cert: string; - ca: string | string[]; - crl: string | string[]; - ciphers: string; - } - export interface Credentials { context?: any; } - export function createCredentials(details: CredentialDetails): Credentials; - export function createHash(algorithm: string): Hash; - export function createHmac(algorithm: string, key: string | Buffer): Hmac; + export interface CredentialDetails { + pfx: string; + key: string; + passphrase: string; + cert: string; + ca: string | string[]; + crl: string | string[]; + ciphers: string; + } + export interface Credentials { context?: any; } + export function createCredentials(details: CredentialDetails): Credentials; + export function createHash(algorithm: string): Hash; + export function createHmac(algorithm: string, key: string | Buffer): Hmac; - type Utf8AsciiLatin1Encoding = "utf8" | "ascii" | "latin1"; - type HexBase64Latin1Encoding = "latin1" | "hex" | "base64"; - type Utf8AsciiBinaryEncoding = "utf8" | "ascii" | "binary"; - type HexBase64BinaryEncoding = "binary" | "base64" | "hex"; - type ECDHKeyFormat = "compressed" | "uncompressed" | "hybrid"; + type Utf8AsciiLatin1Encoding = "utf8" | "ascii" | "latin1"; + type HexBase64Latin1Encoding = "latin1" | "hex" | "base64"; + type Utf8AsciiBinaryEncoding = "utf8" | "ascii" | "binary"; + type HexBase64BinaryEncoding = "binary" | "base64" | "hex"; + type ECDHKeyFormat = "compressed" | "uncompressed" | "hybrid"; - export interface Hash extends NodeJS.ReadWriteStream { - update(data: string | Buffer): Hash; - update(data: string | Buffer, input_encoding: Utf8AsciiLatin1Encoding): Hash; - digest(): Buffer; - digest(encoding: HexBase64Latin1Encoding): string; - } - export interface Hmac extends NodeJS.ReadWriteStream { - update(data: string | Buffer): Hmac; - update(data: string | Buffer, input_encoding: Utf8AsciiLatin1Encoding): Hmac; - digest(): Buffer; - digest(encoding: HexBase64Latin1Encoding): string; - } - export function createCipher(algorithm: string, password: any): Cipher; - export function createCipheriv(algorithm: string, key: any, iv: any): Cipher; - export interface Cipher extends NodeJS.ReadWriteStream { - update(data: Buffer): Buffer; - update(data: string, input_encoding: Utf8AsciiBinaryEncoding): Buffer; - update(data: Buffer, input_encoding: any, output_encoding: HexBase64BinaryEncoding): string; - update(data: string, input_encoding: Utf8AsciiBinaryEncoding, output_encoding: HexBase64BinaryEncoding): string; - final(): Buffer; - final(output_encoding: string): string; - setAutoPadding(auto_padding?: boolean): void; - getAuthTag(): Buffer; - setAAD(buffer: Buffer): void; - } - export function createDecipher(algorithm: string, password: any): Decipher; - export function createDecipheriv(algorithm: string, key: any, iv: any): Decipher; - export interface Decipher extends NodeJS.ReadWriteStream { - update(data: Buffer): Buffer; - update(data: string, input_encoding: HexBase64BinaryEncoding): Buffer; - update(data: Buffer, input_encoding: any, output_encoding: Utf8AsciiBinaryEncoding): string; - update(data: string, input_encoding: HexBase64BinaryEncoding, output_encoding: Utf8AsciiBinaryEncoding): string; - final(): Buffer; - final(output_encoding: string): string; - setAutoPadding(auto_padding?: boolean): void; - setAuthTag(tag: Buffer): void; - setAAD(buffer: Buffer): void; - } - export function createSign(algorithm: string): Signer; - export interface Signer extends NodeJS.WritableStream { - update(data: string | Buffer): Signer; - update(data: string | Buffer, input_encoding: Utf8AsciiLatin1Encoding): Signer; - sign(private_key: string | { key: string; passphrase: string }): Buffer; - sign(private_key: string | { key: string; passphrase: string }, output_format: HexBase64Latin1Encoding): string; - } - export function createVerify(algorith: string): Verify; - export interface Verify extends NodeJS.WritableStream { - update(data: string | Buffer): Verify; - update(data: string | Buffer, input_encoding: Utf8AsciiLatin1Encoding): Verify; - verify(object: string, signature: Buffer): boolean; - verify(object: string, signature: string, signature_format: HexBase64Latin1Encoding): boolean; - } - export function createDiffieHellman(prime_length: number, generator?: number): DiffieHellman; - export function createDiffieHellman(prime: Buffer): DiffieHellman; - export function createDiffieHellman(prime: string, prime_encoding: HexBase64Latin1Encoding): DiffieHellman; - export function createDiffieHellman(prime: string, prime_encoding: HexBase64Latin1Encoding, generator: number | Buffer): DiffieHellman; - export function createDiffieHellman(prime: string, prime_encoding: HexBase64Latin1Encoding, generator: string, generator_encoding: HexBase64Latin1Encoding): DiffieHellman; - export interface DiffieHellman { - generateKeys(): Buffer; - generateKeys(encoding: HexBase64Latin1Encoding): string; - computeSecret(other_public_key: Buffer): Buffer; - computeSecret(other_public_key: string, input_encoding: HexBase64Latin1Encoding): Buffer; - computeSecret(other_public_key: string, input_encoding: HexBase64Latin1Encoding, output_encoding: HexBase64Latin1Encoding): string; - getPrime(): Buffer; - getPrime(encoding: HexBase64Latin1Encoding): string; - getGenerator(): Buffer; - getGenerator(encoding: HexBase64Latin1Encoding): string; - getPublicKey(): Buffer; - getPublicKey(encoding: HexBase64Latin1Encoding): string; - getPrivateKey(): Buffer; - getPrivateKey(encoding: HexBase64Latin1Encoding): string; - setPublicKey(public_key: Buffer): void; - setPublicKey(public_key: string, encoding: string): void; - setPrivateKey(private_key: Buffer): void; - setPrivateKey(private_key: string, encoding: string): void; - verifyError: number; - } - export function getDiffieHellman(group_name: string): DiffieHellman; - export function pbkdf2(password: string | Buffer, salt: string | Buffer, iterations: number, keylen: number, digest: string, callback: (err: Error, derivedKey: Buffer) => any): void; - export function pbkdf2Sync(password: string | Buffer, salt: string | Buffer, iterations: number, keylen: number, digest: string): Buffer; - export function randomBytes(size: number): Buffer; - export function randomBytes(size: number, callback: (err: Error, buf: Buffer) => void): void; - export function pseudoRandomBytes(size: number): Buffer; - export function pseudoRandomBytes(size: number, callback: (err: Error, buf: Buffer) => void): void; - export function randomFillSync(buffer: Buffer | Uint8Array, offset?: number, size?: number): Buffer; - export function randomFill(buffer: Buffer, callback: (err: Error, buf: Buffer) => void): void; - export function randomFill(buffer: Uint8Array, callback: (err: Error, buf: Uint8Array) => void): void; - export function randomFill(buffer: Buffer, offset: number, callback: (err: Error, buf: Buffer) => void): void; - export function randomFill(buffer: Uint8Array, offset: number, callback: (err: Error, buf: Uint8Array) => void): void; - export function randomFill(buffer: Buffer, offset: number, size: number, callback: (err: Error, buf: Buffer) => void): void; - export function randomFill(buffer: Uint8Array, offset: number, size: number, callback: (err: Error, buf: Uint8Array) => void): void; - export interface RsaPublicKey { - key: string; - padding?: number; - } - export interface RsaPrivateKey { - key: string; - passphrase?: string, - padding?: number; - } - export function publicEncrypt(public_key: string | RsaPublicKey, buffer: Buffer): Buffer - export function privateDecrypt(private_key: string | RsaPrivateKey, buffer: Buffer): Buffer - export function privateEncrypt(private_key: string | RsaPrivateKey, buffer: Buffer): Buffer - export function publicDecrypt(public_key: string | RsaPublicKey, buffer: Buffer): Buffer - export function getCiphers(): string[]; - export function getCurves(): string[]; - export function getHashes(): string[]; - export interface ECDH { - generateKeys(): Buffer; - generateKeys(encoding: HexBase64Latin1Encoding): string; - generateKeys(encoding: HexBase64Latin1Encoding, format: ECDHKeyFormat): string; - computeSecret(other_public_key: Buffer): Buffer; - computeSecret(other_public_key: string, input_encoding: HexBase64Latin1Encoding): Buffer; - computeSecret(other_public_key: string, input_encoding: HexBase64Latin1Encoding, output_encoding: HexBase64Latin1Encoding): string; - getPrivateKey(): Buffer; - getPrivateKey(encoding: HexBase64Latin1Encoding): string; - getPublicKey(): Buffer; - getPublicKey(encoding: HexBase64Latin1Encoding): string; - getPublicKey(encoding: HexBase64Latin1Encoding, format: ECDHKeyFormat): string; - setPrivateKey(private_key: Buffer): void; - setPrivateKey(private_key: string, encoding: HexBase64Latin1Encoding): void; - } - export function createECDH(curve_name: string): ECDH; - export function timingSafeEqual(a: Buffer, b: Buffer): boolean; - export var DEFAULT_ENCODING: string; + export interface Hash extends NodeJS.ReadWriteStream { + update(data: string | Buffer | DataView): Hash; + update(data: string | Buffer | DataView, input_encoding: Utf8AsciiLatin1Encoding): Hash; + digest(): Buffer; + digest(encoding: HexBase64Latin1Encoding): string; + } + export interface Hmac extends NodeJS.ReadWriteStream { + update(data: string | Buffer | DataView): Hmac; + update(data: string | Buffer | DataView, input_encoding: Utf8AsciiLatin1Encoding): Hmac; + digest(): Buffer; + digest(encoding: HexBase64Latin1Encoding): string; + } + export function createCipher(algorithm: string, password: any): Cipher; + export function createCipheriv(algorithm: string, key: any, iv: any): Cipher; + export interface Cipher extends NodeJS.ReadWriteStream { + update(data: Buffer | DataView): Buffer; + update(data: string, input_encoding: Utf8AsciiBinaryEncoding): Buffer; + update(data: Buffer | DataView, input_encoding: any, output_encoding: HexBase64BinaryEncoding): string; + update(data: string, input_encoding: Utf8AsciiBinaryEncoding, output_encoding: HexBase64BinaryEncoding): string; + final(): Buffer; + final(output_encoding: string): string; + setAutoPadding(auto_padding?: boolean): this; + getAuthTag(): Buffer; + setAAD(buffer: Buffer): this; + } + export function createDecipher(algorithm: string, password: any): Decipher; + export function createDecipheriv(algorithm: string, key: any, iv: any): Decipher; + export interface Decipher extends NodeJS.ReadWriteStream { + update(data: Buffer | DataView): Buffer; + update(data: string, input_encoding: HexBase64BinaryEncoding): Buffer; + update(data: Buffer | DataView, input_encoding: any, output_encoding: Utf8AsciiBinaryEncoding): string; + update(data: string, input_encoding: HexBase64BinaryEncoding, output_encoding: Utf8AsciiBinaryEncoding): string; + final(): Buffer; + final(output_encoding: string): string; + setAutoPadding(auto_padding?: boolean): this; + setAuthTag(tag: Buffer): this; + setAAD(buffer: Buffer): this; + } + export function createSign(algorithm: string): Signer; + export interface Signer extends NodeJS.WritableStream { + update(data: string | Buffer | DataView): Signer; + update(data: string | Buffer | DataView, input_encoding: Utf8AsciiLatin1Encoding): Signer; + sign(private_key: string | { key: string; passphrase: string }): Buffer; + sign(private_key: string | { key: string; passphrase: string }, output_format: HexBase64Latin1Encoding): string; + } + export function createVerify(algorith: string): Verify; + export interface Verify extends NodeJS.WritableStream { + update(data: string | Buffer | DataView): Verify; + update(data: string | Buffer | DataView, input_encoding: Utf8AsciiLatin1Encoding): Verify; + verify(object: string | Object, signature: Buffer | DataView): boolean; + verify(object: string | Object, signature: string, signature_format: HexBase64Latin1Encoding): boolean; + // https://nodejs.org/api/crypto.html#crypto_verifier_verify_object_signature_signature_format + // The signature field accepts a TypedArray type, but it is only available starting ES2017 + } + export function createDiffieHellman(prime_length: number, generator?: number): DiffieHellman; + export function createDiffieHellman(prime: Buffer): DiffieHellman; + export function createDiffieHellman(prime: string, prime_encoding: HexBase64Latin1Encoding): DiffieHellman; + export function createDiffieHellman(prime: string, prime_encoding: HexBase64Latin1Encoding, generator: number | Buffer): DiffieHellman; + export function createDiffieHellman(prime: string, prime_encoding: HexBase64Latin1Encoding, generator: string, generator_encoding: HexBase64Latin1Encoding): DiffieHellman; + export interface DiffieHellman { + generateKeys(): Buffer; + generateKeys(encoding: HexBase64Latin1Encoding): string; + computeSecret(other_public_key: Buffer): Buffer; + computeSecret(other_public_key: string, input_encoding: HexBase64Latin1Encoding): Buffer; + computeSecret(other_public_key: string, input_encoding: HexBase64Latin1Encoding, output_encoding: HexBase64Latin1Encoding): string; + getPrime(): Buffer; + getPrime(encoding: HexBase64Latin1Encoding): string; + getGenerator(): Buffer; + getGenerator(encoding: HexBase64Latin1Encoding): string; + getPublicKey(): Buffer; + getPublicKey(encoding: HexBase64Latin1Encoding): string; + getPrivateKey(): Buffer; + getPrivateKey(encoding: HexBase64Latin1Encoding): string; + setPublicKey(public_key: Buffer): void; + setPublicKey(public_key: string, encoding: string): void; + setPrivateKey(private_key: Buffer): void; + setPrivateKey(private_key: string, encoding: string): void; + verifyError: number; + } + export function getDiffieHellman(group_name: string): DiffieHellman; + export function pbkdf2(password: string | Buffer, salt: string | Buffer, iterations: number, keylen: number, digest: string, callback: (err: Error, derivedKey: Buffer) => any): void; + export function pbkdf2Sync(password: string | Buffer, salt: string | Buffer, iterations: number, keylen: number, digest: string): Buffer; + export function randomBytes(size: number): Buffer; + export function randomBytes(size: number, callback: (err: Error, buf: Buffer) => void): void; + export function pseudoRandomBytes(size: number): Buffer; + export function pseudoRandomBytes(size: number, callback: (err: Error, buf: Buffer) => void): void; + export function randomFillSync(buffer: Buffer | Uint8Array, offset?: number, size?: number): Buffer; + export function randomFill(buffer: Buffer, callback: (err: Error, buf: Buffer) => void): void; + export function randomFill(buffer: Uint8Array, callback: (err: Error, buf: Uint8Array) => void): void; + export function randomFill(buffer: Buffer, offset: number, callback: (err: Error, buf: Buffer) => void): void; + export function randomFill(buffer: Uint8Array, offset: number, callback: (err: Error, buf: Uint8Array) => void): void; + export function randomFill(buffer: Buffer, offset: number, size: number, callback: (err: Error, buf: Buffer) => void): void; + export function randomFill(buffer: Uint8Array, offset: number, size: number, callback: (err: Error, buf: Uint8Array) => void): void; + export interface RsaPublicKey { + key: string; + padding?: number; + } + export interface RsaPrivateKey { + key: string; + passphrase?: string; + padding?: number; + } + export function publicEncrypt(public_key: string | RsaPublicKey, buffer: Buffer): Buffer; + export function privateDecrypt(private_key: string | RsaPrivateKey, buffer: Buffer): Buffer; + export function privateEncrypt(private_key: string | RsaPrivateKey, buffer: Buffer): Buffer; + export function publicDecrypt(public_key: string | RsaPublicKey, buffer: Buffer): Buffer; + export function getCiphers(): string[]; + export function getCurves(): string[]; + export function getHashes(): string[]; + export interface ECDH { + generateKeys(): Buffer; + generateKeys(encoding: HexBase64Latin1Encoding): string; + generateKeys(encoding: HexBase64Latin1Encoding, format: ECDHKeyFormat): string; + computeSecret(other_public_key: Buffer): Buffer; + computeSecret(other_public_key: string, input_encoding: HexBase64Latin1Encoding): Buffer; + computeSecret(other_public_key: string, input_encoding: HexBase64Latin1Encoding, output_encoding: HexBase64Latin1Encoding): string; + getPrivateKey(): Buffer; + getPrivateKey(encoding: HexBase64Latin1Encoding): string; + getPublicKey(): Buffer; + getPublicKey(encoding: HexBase64Latin1Encoding): string; + getPublicKey(encoding: HexBase64Latin1Encoding, format: ECDHKeyFormat): string; + setPrivateKey(private_key: Buffer): void; + setPrivateKey(private_key: string, encoding: HexBase64Latin1Encoding): void; + } + export function createECDH(curve_name: string): ECDH; + export function timingSafeEqual(a: Buffer, b: Buffer): boolean; + export var DEFAULT_ENCODING: string; } declare module "stream" { - import * as events from "events"; + import * as events from "events"; - class internal extends events.EventEmitter { - pipe(destination: T, options?: { end?: boolean; }): T; - } + class internal extends events.EventEmitter { + pipe(destination: T, options?: { end?: boolean; }): T; + } - namespace internal { + namespace internal { + export class Stream extends internal { } - export class Stream extends internal { } + export interface ReadableOptions { + highWaterMark?: number; + encoding?: string; + objectMode?: boolean; + read?: (this: Readable, size?: number) => any; + destroy?: (error?: Error) => any; + } - export interface ReadableOptions { - highWaterMark?: number; - encoding?: string; - objectMode?: boolean; - read?: (this: Readable, size?: number) => any; - } - - export class Readable extends Stream implements NodeJS.ReadableStream { - readable: boolean; - constructor(opts?: ReadableOptions); - _read(size: number): void; - read(size?: number): any; - setEncoding(encoding: string): this; - pause(): this; - resume(): this; - isPaused(): boolean; - pipe(destination: T, options?: { end?: boolean; }): T; - unpipe(destination?: T): this; - unshift(chunk: any): void; - wrap(oldStream: NodeJS.ReadableStream): Readable; - push(chunk: any, encoding?: string): boolean; + export class Readable extends Stream implements NodeJS.ReadableStream { + readable: boolean; + readonly readableHighWaterMark: number; + constructor(opts?: ReadableOptions); + _read(size: number): void; + read(size?: number): any; + setEncoding(encoding: string): this; + pause(): this; + resume(): this; + isPaused(): boolean; + unpipe(destination?: T): this; + unshift(chunk: any): void; + wrap(oldStream: NodeJS.ReadableStream): this; + push(chunk: any, encoding?: string): boolean; + _destroy(err: Error, callback: Function): void; + destroy(error?: Error): void; /** * Event emitter * The defined events on documents including: - * 1. close - * 2. data - * 3. end - * 4. readable - * 5. error - **/ - addListener(event: string, listener: Function): this; - addListener(event: string, listener: Function): this; - addListener(event: "close", listener: () => void): this; - addListener(event: "data", listener: (chunk: Buffer | string) => void): this; - addListener(event: "end", listener: () => void): this; - addListener(event: "readable", listener: () => void): this; - addListener(event: "error", listener: (err: Error) => void): this; + * 1. close + * 2. data + * 3. end + * 4. readable + * 5. error + */ + addListener(event: string, listener: (...args: any[]) => void): this; + addListener(event: "close", listener: () => void): this; + addListener(event: "data", listener: (chunk: Buffer | string) => void): this; + addListener(event: "end", listener: () => void): this; + addListener(event: "readable", listener: () => void): this; + addListener(event: "error", listener: (err: Error) => void): this; - emit(event: string | symbol, ...args: any[]): boolean; - emit(event: "close"): boolean; - emit(event: "data", chunk: Buffer | string): boolean; - emit(event: "end"): boolean; - emit(event: "readable"): boolean; - emit(event: "error", err: Error): boolean; + emit(event: string | symbol, ...args: any[]): boolean; + emit(event: "close"): boolean; + emit(event: "data", chunk: Buffer | string): boolean; + emit(event: "end"): boolean; + emit(event: "readable"): boolean; + emit(event: "error", err: Error): boolean; - on(event: string, listener: Function): this; - on(event: "close", listener: () => void): this; - on(event: "data", listener: (chunk: Buffer | string) => void): this; - on(event: "end", listener: () => void): this; - on(event: "readable", listener: () => void): this; - on(event: "error", listener: (err: Error) => void): this; + on(event: string, listener: (...args: any[]) => void): this; + on(event: "close", listener: () => void): this; + on(event: "data", listener: (chunk: Buffer | string) => void): this; + on(event: "end", listener: () => void): this; + on(event: "readable", listener: () => void): this; + on(event: "error", listener: (err: Error) => void): this; - once(event: string, listener: Function): this; - once(event: "close", listener: () => void): this; - once(event: "data", listener: (chunk: Buffer | string) => void): this; - once(event: "end", listener: () => void): this; - once(event: "readable", listener: () => void): this; - once(event: "error", listener: (err: Error) => void): this; + once(event: string, listener: (...args: any[]) => void): this; + once(event: "close", listener: () => void): this; + once(event: "data", listener: (chunk: Buffer | string) => void): this; + once(event: "end", listener: () => void): this; + once(event: "readable", listener: () => void): this; + once(event: "error", listener: (err: Error) => void): this; - prependListener(event: string, listener: Function): this; - prependListener(event: "close", listener: () => void): this; - prependListener(event: "data", listener: (chunk: Buffer | string) => void): this; - prependListener(event: "end", listener: () => void): this; - prependListener(event: "readable", listener: () => void): this; - prependListener(event: "error", listener: (err: Error) => void): this; + prependListener(event: string, listener: (...args: any[]) => void): this; + prependListener(event: "close", listener: () => void): this; + prependListener(event: "data", listener: (chunk: Buffer | string) => void): this; + prependListener(event: "end", listener: () => void): this; + prependListener(event: "readable", listener: () => void): this; + prependListener(event: "error", listener: (err: Error) => void): this; - prependOnceListener(event: string, listener: Function): this; - prependOnceListener(event: "close", listener: () => void): this; - prependOnceListener(event: "data", listener: (chunk: Buffer | string) => void): this; - prependOnceListener(event: "end", listener: () => void): this; - prependOnceListener(event: "readable", listener: () => void): this; - prependOnceListener(event: "error", listener: (err: Error) => void): this; + prependOnceListener(event: string, listener: (...args: any[]) => void): this; + prependOnceListener(event: "close", listener: () => void): this; + prependOnceListener(event: "data", listener: (chunk: Buffer | string) => void): this; + prependOnceListener(event: "end", listener: () => void): this; + prependOnceListener(event: "readable", listener: () => void): this; + prependOnceListener(event: "error", listener: (err: Error) => void): this; - removeListener(event: string, listener: Function): this; - removeListener(event: "close", listener: () => void): this; - removeListener(event: "data", listener: (chunk: Buffer | string) => void): this; - removeListener(event: "end", listener: () => void): this; - removeListener(event: "readable", listener: () => void): this; - removeListener(event: "error", listener: (err: Error) => void): this; - } + removeListener(event: string, listener: (...args: any[]) => void): this; + removeListener(event: "close", listener: () => void): this; + removeListener(event: "data", listener: (chunk: Buffer | string) => void): this; + removeListener(event: "end", listener: () => void): this; + removeListener(event: "readable", listener: () => void): this; + removeListener(event: "error", listener: (err: Error) => void): this; + } - export interface WritableOptions { - highWaterMark?: number; - decodeStrings?: boolean; - objectMode?: boolean; - write?: (chunk: string | Buffer, encoding: string, callback: Function) => any; - writev?: (chunks: { chunk: string | Buffer, encoding: string }[], callback: Function) => any; - } + export interface WritableOptions { + highWaterMark?: number; + decodeStrings?: boolean; + objectMode?: boolean; + write?: (chunk: any, encoding: string, callback: Function) => any; + writev?: (chunks: Array<{ chunk: any, encoding: string }>, callback: Function) => any; + destroy?: (error?: Error) => any; + final?: (callback: (error?: Error) => void) => void; + } - export class Writable extends Stream implements NodeJS.WritableStream { - writable: boolean; - constructor(opts?: WritableOptions); - _write(chunk: any, encoding: string, callback: Function): void; - write(chunk: any, cb?: Function): boolean; - write(chunk: any, encoding?: string, cb?: Function): boolean; - setDefaultEncoding(encoding: string): this; - end(): void; - end(chunk: any, cb?: Function): void; - end(chunk: any, encoding?: string, cb?: Function): void; + export class Writable extends Stream implements NodeJS.WritableStream { + writable: boolean; + readonly writableHighWaterMark: number; + constructor(opts?: WritableOptions); + _write(chunk: any, encoding: string, callback: (err?: Error) => void): void; + _writev?(chunks: Array<{ chunk: any, encoding: string }>, callback: (err?: Error) => void): void; + _destroy(err: Error, callback: Function): void; + _final(callback: Function): void; + write(chunk: any, cb?: Function): boolean; + write(chunk: any, encoding?: string, cb?: Function): boolean; + setDefaultEncoding(encoding: string): this; + end(cb?: Function): void; + end(chunk: any, cb?: Function): void; + end(chunk: any, encoding?: string, cb?: Function): void; + cork(): void; + uncork(): void; + destroy(error?: Error): void; /** * Event emitter * The defined events on documents including: - * 1. close - * 2. drain - * 3. error - * 4. finish - * 5. pipe - * 6. unpipe - **/ - addListener(event: string, listener: Function): this; - addListener(event: "close", listener: () => void): this; - addListener(event: "drain", listener: () => void): this; - addListener(event: "error", listener: (err: Error) => void): this; - addListener(event: "finish", listener: () => void): this; - addListener(event: "pipe", listener: (src: Readable) => void): this; - addListener(event: "unpipe", listener: (src: Readable) => void): this; + * 1. close + * 2. drain + * 3. error + * 4. finish + * 5. pipe + * 6. unpipe + */ + addListener(event: string, listener: (...args: any[]) => void): this; + addListener(event: "close", listener: () => void): this; + addListener(event: "drain", listener: () => void): this; + addListener(event: "error", listener: (err: Error) => void): this; + addListener(event: "finish", listener: () => void): this; + addListener(event: "pipe", listener: (src: Readable) => void): this; + addListener(event: "unpipe", listener: (src: Readable) => void): this; - emit(event: string | symbol, ...args: any[]): boolean; - emit(event: "close"): boolean; - emit(event: "drain", chunk: Buffer | string): boolean; - emit(event: "error", err: Error): boolean; - emit(event: "finish"): boolean; - emit(event: "pipe", src: Readable): boolean; - emit(event: "unpipe", src: Readable): boolean; + emit(event: string | symbol, ...args: any[]): boolean; + emit(event: "close"): boolean; + emit(event: "drain", chunk: Buffer | string): boolean; + emit(event: "error", err: Error): boolean; + emit(event: "finish"): boolean; + emit(event: "pipe", src: Readable): boolean; + emit(event: "unpipe", src: Readable): boolean; - on(event: string, listener: Function): this; - on(event: "close", listener: () => void): this; - on(event: "drain", listener: () => void): this; - on(event: "error", listener: (err: Error) => void): this; - on(event: "finish", listener: () => void): this; - on(event: "pipe", listener: (src: Readable) => void): this; - on(event: "unpipe", listener: (src: Readable) => void): this; + on(event: string, listener: (...args: any[]) => void): this; + on(event: "close", listener: () => void): this; + on(event: "drain", listener: () => void): this; + on(event: "error", listener: (err: Error) => void): this; + on(event: "finish", listener: () => void): this; + on(event: "pipe", listener: (src: Readable) => void): this; + on(event: "unpipe", listener: (src: Readable) => void): this; - once(event: string, listener: Function): this; - once(event: "close", listener: () => void): this; - once(event: "drain", listener: () => void): this; - once(event: "error", listener: (err: Error) => void): this; - once(event: "finish", listener: () => void): this; - once(event: "pipe", listener: (src: Readable) => void): this; - once(event: "unpipe", listener: (src: Readable) => void): this; + once(event: string, listener: (...args: any[]) => void): this; + once(event: "close", listener: () => void): this; + once(event: "drain", listener: () => void): this; + once(event: "error", listener: (err: Error) => void): this; + once(event: "finish", listener: () => void): this; + once(event: "pipe", listener: (src: Readable) => void): this; + once(event: "unpipe", listener: (src: Readable) => void): this; - prependListener(event: string, listener: Function): this; - prependListener(event: "close", listener: () => void): this; - prependListener(event: "drain", listener: () => void): this; - prependListener(event: "error", listener: (err: Error) => void): this; - prependListener(event: "finish", listener: () => void): this; - prependListener(event: "pipe", listener: (src: Readable) => void): this; - prependListener(event: "unpipe", listener: (src: Readable) => void): this; + prependListener(event: string, listener: (...args: any[]) => void): this; + prependListener(event: "close", listener: () => void): this; + prependListener(event: "drain", listener: () => void): this; + prependListener(event: "error", listener: (err: Error) => void): this; + prependListener(event: "finish", listener: () => void): this; + prependListener(event: "pipe", listener: (src: Readable) => void): this; + prependListener(event: "unpipe", listener: (src: Readable) => void): this; - prependOnceListener(event: string, listener: Function): this; - prependOnceListener(event: "close", listener: () => void): this; - prependOnceListener(event: "drain", listener: () => void): this; - prependOnceListener(event: "error", listener: (err: Error) => void): this; - prependOnceListener(event: "finish", listener: () => void): this; - prependOnceListener(event: "pipe", listener: (src: Readable) => void): this; - prependOnceListener(event: "unpipe", listener: (src: Readable) => void): this; + prependOnceListener(event: string, listener: (...args: any[]) => void): this; + prependOnceListener(event: "close", listener: () => void): this; + prependOnceListener(event: "drain", listener: () => void): this; + prependOnceListener(event: "error", listener: (err: Error) => void): this; + prependOnceListener(event: "finish", listener: () => void): this; + prependOnceListener(event: "pipe", listener: (src: Readable) => void): this; + prependOnceListener(event: "unpipe", listener: (src: Readable) => void): this; - removeListener(event: string, listener: Function): this; - removeListener(event: "close", listener: () => void): this; - removeListener(event: "drain", listener: () => void): this; - removeListener(event: "error", listener: (err: Error) => void): this; - removeListener(event: "finish", listener: () => void): this; - removeListener(event: "pipe", listener: (src: Readable) => void): this; - removeListener(event: "unpipe", listener: (src: Readable) => void): this; - } + removeListener(event: string, listener: (...args: any[]) => void): this; + removeListener(event: "close", listener: () => void): this; + removeListener(event: "drain", listener: () => void): this; + removeListener(event: "error", listener: (err: Error) => void): this; + removeListener(event: "finish", listener: () => void): this; + removeListener(event: "pipe", listener: (src: Readable) => void): this; + removeListener(event: "unpipe", listener: (src: Readable) => void): this; + } - export interface DuplexOptions extends ReadableOptions, WritableOptions { - allowHalfOpen?: boolean; - readableObjectMode?: boolean; - writableObjectMode?: boolean; - } + export interface DuplexOptions extends ReadableOptions, WritableOptions { + allowHalfOpen?: boolean; + readableObjectMode?: boolean; + writableObjectMode?: boolean; + } - // Note: Duplex extends both Readable and Writable. - export class Duplex extends Readable implements Writable { - writable: boolean; - constructor(opts?: DuplexOptions); - _write(chunk: any, encoding: string, callback: Function): void; - write(chunk: any, cb?: Function): boolean; - write(chunk: any, encoding?: string, cb?: Function): boolean; - setDefaultEncoding(encoding: string): this; - end(): void; - end(chunk: any, cb?: Function): void; - end(chunk: any, encoding?: string, cb?: Function): void; - } + // Note: Duplex extends both Readable and Writable. + export class Duplex extends Readable implements Writable { + writable: boolean; + readonly writableHighWaterMark: number; + constructor(opts?: DuplexOptions); + _write(chunk: any, encoding: string, callback: (err?: Error) => void): void; + _writev?(chunks: Array<{ chunk: any, encoding: string }>, callback: (err?: Error) => void): void; + _destroy(err: Error, callback: Function): void; + _final(callback: Function): void; + write(chunk: any, cb?: Function): boolean; + write(chunk: any, encoding?: string, cb?: Function): boolean; + setDefaultEncoding(encoding: string): this; + end(cb?: Function): void; + end(chunk: any, cb?: Function): void; + end(chunk: any, encoding?: string, cb?: Function): void; + cork(): void; + uncork(): void; + } - export interface TransformOptions extends DuplexOptions { - transform?: (chunk: string | Buffer, encoding: string, callback: Function) => any; - flush?: (callback: Function) => any; - } + export interface TransformOptions extends DuplexOptions { + transform?: (chunk: string | Buffer, encoding: string, callback: Function) => any; + flush?: (callback: Function) => any; + } - export class Transform extends Duplex { - constructor(opts?: TransformOptions); - _transform(chunk: any, encoding: string, callback: Function): void; - } + export class Transform extends Duplex { + constructor(opts?: TransformOptions); + _transform(chunk: any, encoding: string, callback: Function): void; + destroy(error?: Error): void; + } - export class PassThrough extends Transform { } - } + export class PassThrough extends Transform { } + } - export = internal; + export = internal; } declare module "util" { - export interface InspectOptions extends NodeJS.InspectOptions { } - export function format(format: any, ...param: any[]): string; - export function debug(string: string): void; - export function error(...param: any[]): void; - export function puts(...param: any[]): void; - export function print(...param: any[]): void; - export function log(string: string): void; - export function inspect(object: any, showHidden?: boolean, depth?: number | null, color?: boolean): string; - export function inspect(object: any, options: InspectOptions): string; - export function isArray(object: any): object is any[]; - export function isRegExp(object: any): object is RegExp; - export function isDate(object: any): object is Date; - export function isError(object: any): object is Error; - export function inherits(constructor: any, superConstructor: any): void; - export function debuglog(key: string): (msg: string, ...param: any[]) => void; - export function isBoolean(object: any): object is boolean; - export function isBuffer(object: any): object is Buffer; - export function isFunction(object: any): boolean; - export function isNull(object: any): object is null; - export function isNullOrUndefined(object: any): object is null | undefined; - export function isNumber(object: any): object is number; - export function isObject(object: any): boolean; - export function isPrimitive(object: any): boolean; - export function isString(object: any): object is string; - export function isSymbol(object: any): object is symbol; - export function isUndefined(object: any): object is undefined; - export function deprecate(fn: T, message: string): T; + export interface InspectOptions extends NodeJS.InspectOptions { } + export function format(format: any, ...param: any[]): string; + export function debug(string: string): void; + export function error(...param: any[]): void; + export function puts(...param: any[]): void; + export function print(...param: any[]): void; + export function log(string: string): void; + export var inspect: { + (object: any, showHidden?: boolean, depth?: number | null, color?: boolean): string; + (object: any, options: InspectOptions): string; + colors: { + [color: string]: [number, number] | undefined + } + styles: { + [style: string]: string | undefined + } + defaultOptions: InspectOptions; + custom: symbol; + }; + export function isArray(object: any): object is any[]; + export function isRegExp(object: any): object is RegExp; + export function isDate(object: any): object is Date; + export function isError(object: any): object is Error; + export function inherits(constructor: any, superConstructor: any): void; + export function debuglog(key: string): (msg: string, ...param: any[]) => void; + export function isBoolean(object: any): object is boolean; + export function isBuffer(object: any): object is Buffer; + export function isFunction(object: any): boolean; + export function isNull(object: any): object is null; + export function isNullOrUndefined(object: any): object is null | undefined; + export function isNumber(object: any): object is number; + export function isObject(object: any): boolean; + export function isPrimitive(object: any): boolean; + export function isString(object: any): object is string; + export function isSymbol(object: any): object is symbol; + export function isUndefined(object: any): object is undefined; + export function deprecate(fn: T, message: string): T; + + export interface CustomPromisify extends Function { + __promisify__: TCustom; + } + + export function callbackify(fn: () => Promise): (callback: (err: NodeJS.ErrnoException) => void) => void; + export function callbackify(fn: () => Promise): (callback: (err: NodeJS.ErrnoException, result: TResult) => void) => void; + export function callbackify(fn: (arg1: T1) => Promise): (arg1: T1, callback: (err: NodeJS.ErrnoException) => void) => void; + export function callbackify(fn: (arg1: T1) => Promise): (arg1: T1, callback: (err: NodeJS.ErrnoException, result: TResult) => void) => void; + export function callbackify(fn: (arg1: T1, arg2: T2) => Promise): (arg1: T1, arg2: T2, callback: (err: NodeJS.ErrnoException) => void) => void; + export function callbackify(fn: (arg1: T1, arg2: T2) => Promise): (arg1: T1, arg2: T2, callback: (err: NodeJS.ErrnoException, result: TResult) => void) => void; + export function callbackify(fn: (arg1: T1, arg2: T2, arg3: T3) => Promise): (arg1: T1, arg2: T2, arg3: T3, callback: (err: NodeJS.ErrnoException) => void) => void; + export function callbackify(fn: (arg1: T1, arg2: T2, arg3: T3) => Promise): (arg1: T1, arg2: T2, arg3: T3, callback: (err: NodeJS.ErrnoException, result: TResult) => void) => void; + export function callbackify(fn: (arg1: T1, arg2: T2, arg3: T3, arg4: T4) => Promise): (arg1: T1, arg2: T2, arg3: T3, arg4: T4, callback: (err: NodeJS.ErrnoException) => void) => void; + export function callbackify(fn: (arg1: T1, arg2: T2, arg3: T3, arg4: T4) => Promise): (arg1: T1, arg2: T2, arg3: T3, arg4: T4, callback: (err: NodeJS.ErrnoException, result: TResult) => void) => void; + export function callbackify(fn: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5) => Promise): (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, callback: (err: NodeJS.ErrnoException) => void) => void; + export function callbackify(fn: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5) => Promise): (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, callback: (err: NodeJS.ErrnoException, result: TResult) => void) => void; + export function callbackify(fn: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6) => Promise): (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, callback: (err: NodeJS.ErrnoException) => void) => void; + export function callbackify(fn: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6) => Promise): (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, callback: (err: NodeJS.ErrnoException, result: TResult) => void) => void; + + export function promisify(fn: CustomPromisify): TCustom; + export function promisify(fn: (callback: (err: Error | null, result: TResult) => void) => void): () => Promise; + export function promisify(fn: (callback: (err: Error | null) => void) => void): () => Promise; + export function promisify(fn: (arg1: T1, callback: (err: Error | null, result: TResult) => void) => void): (arg1: T1) => Promise; + export function promisify(fn: (arg1: T1, callback: (err: Error | null) => void) => void): (arg1: T1) => Promise; + export function promisify(fn: (arg1: T1, arg2: T2, callback: (err: Error | null, result: TResult) => void) => void): (arg1: T1, arg2: T2) => Promise; + export function promisify(fn: (arg1: T1, arg2: T2, callback: (err: Error | null) => void) => void): (arg1: T1, arg2: T2) => Promise; + export function promisify(fn: (arg1: T1, arg2: T2, arg3: T3, callback: (err: Error | null, result: TResult) => void) => void): (arg1: T1, arg2: T2, arg3: T3) => Promise; + export function promisify(fn: (arg1: T1, arg2: T2, arg3: T3, callback: (err: Error | null) => void) => void): (arg1: T1, arg2: T2, arg3: T3) => Promise; + export function promisify(fn: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, callback: (err: Error | null, result: TResult) => void) => void): (arg1: T1, arg2: T2, arg3: T3, arg4: T4) => Promise; + export function promisify(fn: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, callback: (err: Error | null) => void) => void): (arg1: T1, arg2: T2, arg3: T3, arg4: T4) => Promise; + export function promisify(fn: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, callback: (err: Error | null, result: TResult) => void) => void): (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5) => Promise; + export function promisify(fn: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, callback: (err: Error | null) => void) => void): (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5) => Promise; + export function promisify(fn: Function): Function; + export namespace promisify { + const custom: symbol; + } + + export class TextDecoder { + readonly encoding: string; + readonly fatal: boolean; + readonly ignoreBOM: boolean; + constructor( + encoding?: string, + options?: { fatal?: boolean; ignoreBOM?: boolean } + ); + decode( + input?: + Int8Array + | Int16Array + | Int32Array + | Uint8Array + | Uint16Array + | Uint32Array + | Uint8ClampedArray + | Float32Array + | Float64Array + | DataView + | ArrayBuffer + | null, + options?: { stream?: boolean } + ): string; + } + + export class TextEncoder { + readonly encoding: string; + constructor(); + encode(input?: string): Uint8Array; + } } declare module "assert" { - function internal(value: any, message?: string): void; - namespace internal { - export class AssertionError implements Error { - name: string; - message: string; - actual: any; - expected: any; - operator: string; - generatedMessage: boolean; + function internal(value: any, message?: string): void; + namespace internal { + export class AssertionError implements Error { + name: string; + message: string; + actual: any; + expected: any; + operator: string; + generatedMessage: boolean; - constructor(options?: { - message?: string; actual?: any; expected?: any; - operator?: string; stackStartFunction?: Function - }); - } + constructor(options?: { + message?: string; actual?: any; expected?: any; + operator?: string; stackStartFunction?: Function + }); + } - export function fail(actual?: any, expected?: any, message?: string, operator?: string): void; - export function ok(value: any, message?: string): void; - export function equal(actual: any, expected: any, message?: string): void; - export function notEqual(actual: any, expected: any, message?: string): void; - export function deepEqual(actual: any, expected: any, message?: string): void; - export function notDeepEqual(acutal: any, expected: any, message?: string): void; - export function strictEqual(actual: any, expected: any, message?: string): void; - export function notStrictEqual(actual: any, expected: any, message?: string): void; - export function deepStrictEqual(actual: any, expected: any, message?: string): void; - export function notDeepStrictEqual(actual: any, expected: any, message?: string): void; + export function fail(message: string): never; + export function fail(actual: any, expected: any, message?: string, operator?: string): never; + export function ok(value: any, message?: string): void; + export function equal(actual: any, expected: any, message?: string): void; + export function notEqual(actual: any, expected: any, message?: string): void; + export function deepEqual(actual: any, expected: any, message?: string): void; + export function notDeepEqual(acutal: any, expected: any, message?: string): void; + export function strictEqual(actual: any, expected: any, message?: string): void; + export function notStrictEqual(actual: any, expected: any, message?: string): void; + export function deepStrictEqual(actual: any, expected: any, message?: string): void; + export function notDeepStrictEqual(actual: any, expected: any, message?: string): void; - export function throws(block: Function, message?: string): void; - export function throws(block: Function, error: Function, message?: string): void; - export function throws(block: Function, error: RegExp, message?: string): void; - export function throws(block: Function, error: (err: any) => boolean, message?: string): void; + export function throws(block: Function, message?: string): void; + export function throws(block: Function, error: Function, message?: string): void; + export function throws(block: Function, error: RegExp, message?: string): void; + export function throws(block: Function, error: (err: any) => boolean, message?: string): void; - export function doesNotThrow(block: Function, message?: string): void; - export function doesNotThrow(block: Function, error: Function, message?: string): void; - export function doesNotThrow(block: Function, error: RegExp, message?: string): void; - export function doesNotThrow(block: Function, error: (err: any) => boolean, message?: string): void; + export function doesNotThrow(block: Function, message?: string): void; + export function doesNotThrow(block: Function, error: Function, message?: string): void; + export function doesNotThrow(block: Function, error: RegExp, message?: string): void; + export function doesNotThrow(block: Function, error: (err: any) => boolean, message?: string): void; - export function ifError(value: any): void; - } + export function ifError(value: any): void; + } - export = internal; + export = internal; } declare module "tty" { - import * as net from "net"; + import * as net from "net"; - export function isatty(fd: number): boolean; - export interface ReadStream extends net.Socket { - isRaw: boolean; - setRawMode(mode: boolean): void; - isTTY: boolean; - } - export interface WriteStream extends net.Socket { - columns: number; - rows: number; - isTTY: boolean; - } + export function isatty(fd: number): boolean; + export class ReadStream extends net.Socket { + isRaw: boolean; + setRawMode(mode: boolean): void; + isTTY: boolean; + } + export class WriteStream extends net.Socket { + columns: number; + rows: number; + isTTY: boolean; + } } declare module "domain" { - import * as events from "events"; + import * as events from "events"; - export class Domain extends events.EventEmitter implements NodeJS.Domain { - run(fn: Function): void; - add(emitter: events.EventEmitter): void; - remove(emitter: events.EventEmitter): void; - bind(cb: (err: Error, data: any) => any): any; - intercept(cb: (data: any) => any): any; - dispose(): void; - members: any[]; - enter(): void; - exit(): void; - } + export class Domain extends events.EventEmitter implements NodeJS.Domain { + run(fn: Function): void; + add(emitter: events.EventEmitter): void; + remove(emitter: events.EventEmitter): void; + bind(cb: (err: Error, data: any) => any): any; + intercept(cb: (data: any) => any): any; + dispose(): void; + members: any[]; + enter(): void; + exit(): void; + } - export function create(): Domain; + export function create(): Domain; } declare module "constants" { - export var E2BIG: number; - export var EACCES: number; - export var EADDRINUSE: number; - export var EADDRNOTAVAIL: number; - export var EAFNOSUPPORT: number; - export var EAGAIN: number; - export var EALREADY: number; - export var EBADF: number; - export var EBADMSG: number; - export var EBUSY: number; - export var ECANCELED: number; - export var ECHILD: number; - export var ECONNABORTED: number; - export var ECONNREFUSED: number; - export var ECONNRESET: number; - export var EDEADLK: number; - export var EDESTADDRREQ: number; - export var EDOM: number; - export var EEXIST: number; - export var EFAULT: number; - export var EFBIG: number; - export var EHOSTUNREACH: number; - export var EIDRM: number; - export var EILSEQ: number; - export var EINPROGRESS: number; - export var EINTR: number; - export var EINVAL: number; - export var EIO: number; - export var EISCONN: number; - export var EISDIR: number; - export var ELOOP: number; - export var EMFILE: number; - export var EMLINK: number; - export var EMSGSIZE: number; - export var ENAMETOOLONG: number; - export var ENETDOWN: number; - export var ENETRESET: number; - export var ENETUNREACH: number; - export var ENFILE: number; - export var ENOBUFS: number; - export var ENODATA: number; - export var ENODEV: number; - export var ENOENT: number; - export var ENOEXEC: number; - export var ENOLCK: number; - export var ENOLINK: number; - export var ENOMEM: number; - export var ENOMSG: number; - export var ENOPROTOOPT: number; - export var ENOSPC: number; - export var ENOSR: number; - export var ENOSTR: number; - export var ENOSYS: number; - export var ENOTCONN: number; - export var ENOTDIR: number; - export var ENOTEMPTY: number; - export var ENOTSOCK: number; - export var ENOTSUP: number; - export var ENOTTY: number; - export var ENXIO: number; - export var EOPNOTSUPP: number; - export var EOVERFLOW: number; - export var EPERM: number; - export var EPIPE: number; - export var EPROTO: number; - export var EPROTONOSUPPORT: number; - export var EPROTOTYPE: number; - export var ERANGE: number; - export var EROFS: number; - export var ESPIPE: number; - export var ESRCH: number; - export var ETIME: number; - export var ETIMEDOUT: number; - export var ETXTBSY: number; - export var EWOULDBLOCK: number; - export var EXDEV: number; - export var WSAEINTR: number; - export var WSAEBADF: number; - export var WSAEACCES: number; - export var WSAEFAULT: number; - export var WSAEINVAL: number; - export var WSAEMFILE: number; - export var WSAEWOULDBLOCK: number; - export var WSAEINPROGRESS: number; - export var WSAEALREADY: number; - export var WSAENOTSOCK: number; - export var WSAEDESTADDRREQ: number; - export var WSAEMSGSIZE: number; - export var WSAEPROTOTYPE: number; - export var WSAENOPROTOOPT: number; - export var WSAEPROTONOSUPPORT: number; - export var WSAESOCKTNOSUPPORT: number; - export var WSAEOPNOTSUPP: number; - export var WSAEPFNOSUPPORT: number; - export var WSAEAFNOSUPPORT: number; - export var WSAEADDRINUSE: number; - export var WSAEADDRNOTAVAIL: number; - export var WSAENETDOWN: number; - export var WSAENETUNREACH: number; - export var WSAENETRESET: number; - export var WSAECONNABORTED: number; - export var WSAECONNRESET: number; - export var WSAENOBUFS: number; - export var WSAEISCONN: number; - export var WSAENOTCONN: number; - export var WSAESHUTDOWN: number; - export var WSAETOOMANYREFS: number; - export var WSAETIMEDOUT: number; - export var WSAECONNREFUSED: number; - export var WSAELOOP: number; - export var WSAENAMETOOLONG: number; - export var WSAEHOSTDOWN: number; - export var WSAEHOSTUNREACH: number; - export var WSAENOTEMPTY: number; - export var WSAEPROCLIM: number; - export var WSAEUSERS: number; - export var WSAEDQUOT: number; - export var WSAESTALE: number; - export var WSAEREMOTE: number; - export var WSASYSNOTREADY: number; - export var WSAVERNOTSUPPORTED: number; - export var WSANOTINITIALISED: number; - export var WSAEDISCON: number; - export var WSAENOMORE: number; - export var WSAECANCELLED: number; - export var WSAEINVALIDPROCTABLE: number; - export var WSAEINVALIDPROVIDER: number; - export var WSAEPROVIDERFAILEDINIT: number; - export var WSASYSCALLFAILURE: number; - export var WSASERVICE_NOT_FOUND: number; - export var WSATYPE_NOT_FOUND: number; - export var WSA_E_NO_MORE: number; - export var WSA_E_CANCELLED: number; - export var WSAEREFUSED: number; - export var SIGHUP: number; - export var SIGINT: number; - export var SIGILL: number; - export var SIGABRT: number; - export var SIGFPE: number; - export var SIGKILL: number; - export var SIGSEGV: number; - export var SIGTERM: number; - export var SIGBREAK: number; - export var SIGWINCH: number; - export var SSL_OP_ALL: number; - export var SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION: number; - export var SSL_OP_CIPHER_SERVER_PREFERENCE: number; - export var SSL_OP_CISCO_ANYCONNECT: number; - export var SSL_OP_COOKIE_EXCHANGE: number; - export var SSL_OP_CRYPTOPRO_TLSEXT_BUG: number; - export var SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS: number; - export var SSL_OP_EPHEMERAL_RSA: number; - export var SSL_OP_LEGACY_SERVER_CONNECT: number; - export var SSL_OP_MICROSOFT_BIG_SSLV3_BUFFER: number; - export var SSL_OP_MICROSOFT_SESS_ID_BUG: number; - export var SSL_OP_MSIE_SSLV2_RSA_PADDING: number; - export var SSL_OP_NETSCAPE_CA_DN_BUG: number; - export var SSL_OP_NETSCAPE_CHALLENGE_BUG: number; - export var SSL_OP_NETSCAPE_DEMO_CIPHER_CHANGE_BUG: number; - export var SSL_OP_NETSCAPE_REUSE_CIPHER_CHANGE_BUG: number; - export var SSL_OP_NO_COMPRESSION: number; - export var SSL_OP_NO_QUERY_MTU: number; - export var SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION: number; - export var SSL_OP_NO_SSLv2: number; - export var SSL_OP_NO_SSLv3: number; - export var SSL_OP_NO_TICKET: number; - export var SSL_OP_NO_TLSv1: number; - export var SSL_OP_NO_TLSv1_1: number; - export var SSL_OP_NO_TLSv1_2: number; - export var SSL_OP_PKCS1_CHECK_1: number; - export var SSL_OP_PKCS1_CHECK_2: number; - export var SSL_OP_SINGLE_DH_USE: number; - export var SSL_OP_SINGLE_ECDH_USE: number; - export var SSL_OP_SSLEAY_080_CLIENT_DH_BUG: number; - export var SSL_OP_SSLREF2_REUSE_CERT_TYPE_BUG: number; - export var SSL_OP_TLS_BLOCK_PADDING_BUG: number; - export var SSL_OP_TLS_D5_BUG: number; - export var SSL_OP_TLS_ROLLBACK_BUG: number; - export var ENGINE_METHOD_DSA: number; - export var ENGINE_METHOD_DH: number; - export var ENGINE_METHOD_RAND: number; - export var ENGINE_METHOD_ECDH: number; - export var ENGINE_METHOD_ECDSA: number; - export var ENGINE_METHOD_CIPHERS: number; - export var ENGINE_METHOD_DIGESTS: number; - export var ENGINE_METHOD_STORE: number; - export var ENGINE_METHOD_PKEY_METHS: number; - export var ENGINE_METHOD_PKEY_ASN1_METHS: number; - export var ENGINE_METHOD_ALL: number; - export var ENGINE_METHOD_NONE: number; - export var DH_CHECK_P_NOT_SAFE_PRIME: number; - export var DH_CHECK_P_NOT_PRIME: number; - export var DH_UNABLE_TO_CHECK_GENERATOR: number; - export var DH_NOT_SUITABLE_GENERATOR: number; - export var NPN_ENABLED: number; - export var RSA_PKCS1_PADDING: number; - export var RSA_SSLV23_PADDING: number; - export var RSA_NO_PADDING: number; - export var RSA_PKCS1_OAEP_PADDING: number; - export var RSA_X931_PADDING: number; - export var RSA_PKCS1_PSS_PADDING: number; - export var POINT_CONVERSION_COMPRESSED: number; - export var POINT_CONVERSION_UNCOMPRESSED: number; - export var POINT_CONVERSION_HYBRID: number; - export var O_RDONLY: number; - export var O_WRONLY: number; - export var O_RDWR: number; - export var S_IFMT: number; - export var S_IFREG: number; - export var S_IFDIR: number; - export var S_IFCHR: number; - export var S_IFBLK: number; - export var S_IFIFO: number; - export var S_IFSOCK: number; - export var S_IRWXU: number; - export var S_IRUSR: number; - export var S_IWUSR: number; - export var S_IXUSR: number; - export var S_IRWXG: number; - export var S_IRGRP: number; - export var S_IWGRP: number; - export var S_IXGRP: number; - export var S_IRWXO: number; - export var S_IROTH: number; - export var S_IWOTH: number; - export var S_IXOTH: number; - export var S_IFLNK: number; - export var O_CREAT: number; - export var O_EXCL: number; - export var O_NOCTTY: number; - export var O_DIRECTORY: number; - export var O_NOATIME: number; - export var O_NOFOLLOW: number; - export var O_SYNC: number; - export var O_SYMLINK: number; - export var O_DIRECT: number; - export var O_NONBLOCK: number; - export var O_TRUNC: number; - export var O_APPEND: number; - export var F_OK: number; - export var R_OK: number; - export var W_OK: number; - export var X_OK: number; - export var UV_UDP_REUSEADDR: number; - export var SIGQUIT: number; - export var SIGTRAP: number; - export var SIGIOT: number; - export var SIGBUS: number; - export var SIGUSR1: number; - export var SIGUSR2: number; - export var SIGPIPE: number; - export var SIGALRM: number; - export var SIGCHLD: number; - export var SIGSTKFLT: number; - export var SIGCONT: number; - export var SIGSTOP: number; - export var SIGTSTP: number; - export var SIGTTIN: number; - export var SIGTTOU: number; - export var SIGURG: number; - export var SIGXCPU: number; - export var SIGXFSZ: number; - export var SIGVTALRM: number; - export var SIGPROF: number; - export var SIGIO: number; - export var SIGPOLL: number; - export var SIGPWR: number; - export var SIGSYS: number; - export var SIGUNUSED: number; - export var defaultCoreCipherList: string; - export var defaultCipherList: string; - export var ENGINE_METHOD_RSA: number; - export var ALPN_ENABLED: number; + export var E2BIG: number; + export var EACCES: number; + export var EADDRINUSE: number; + export var EADDRNOTAVAIL: number; + export var EAFNOSUPPORT: number; + export var EAGAIN: number; + export var EALREADY: number; + export var EBADF: number; + export var EBADMSG: number; + export var EBUSY: number; + export var ECANCELED: number; + export var ECHILD: number; + export var ECONNABORTED: number; + export var ECONNREFUSED: number; + export var ECONNRESET: number; + export var EDEADLK: number; + export var EDESTADDRREQ: number; + export var EDOM: number; + export var EEXIST: number; + export var EFAULT: number; + export var EFBIG: number; + export var EHOSTUNREACH: number; + export var EIDRM: number; + export var EILSEQ: number; + export var EINPROGRESS: number; + export var EINTR: number; + export var EINVAL: number; + export var EIO: number; + export var EISCONN: number; + export var EISDIR: number; + export var ELOOP: number; + export var EMFILE: number; + export var EMLINK: number; + export var EMSGSIZE: number; + export var ENAMETOOLONG: number; + export var ENETDOWN: number; + export var ENETRESET: number; + export var ENETUNREACH: number; + export var ENFILE: number; + export var ENOBUFS: number; + export var ENODATA: number; + export var ENODEV: number; + export var ENOENT: number; + export var ENOEXEC: number; + export var ENOLCK: number; + export var ENOLINK: number; + export var ENOMEM: number; + export var ENOMSG: number; + export var ENOPROTOOPT: number; + export var ENOSPC: number; + export var ENOSR: number; + export var ENOSTR: number; + export var ENOSYS: number; + export var ENOTCONN: number; + export var ENOTDIR: number; + export var ENOTEMPTY: number; + export var ENOTSOCK: number; + export var ENOTSUP: number; + export var ENOTTY: number; + export var ENXIO: number; + export var EOPNOTSUPP: number; + export var EOVERFLOW: number; + export var EPERM: number; + export var EPIPE: number; + export var EPROTO: number; + export var EPROTONOSUPPORT: number; + export var EPROTOTYPE: number; + export var ERANGE: number; + export var EROFS: number; + export var ESPIPE: number; + export var ESRCH: number; + export var ETIME: number; + export var ETIMEDOUT: number; + export var ETXTBSY: number; + export var EWOULDBLOCK: number; + export var EXDEV: number; + export var WSAEINTR: number; + export var WSAEBADF: number; + export var WSAEACCES: number; + export var WSAEFAULT: number; + export var WSAEINVAL: number; + export var WSAEMFILE: number; + export var WSAEWOULDBLOCK: number; + export var WSAEINPROGRESS: number; + export var WSAEALREADY: number; + export var WSAENOTSOCK: number; + export var WSAEDESTADDRREQ: number; + export var WSAEMSGSIZE: number; + export var WSAEPROTOTYPE: number; + export var WSAENOPROTOOPT: number; + export var WSAEPROTONOSUPPORT: number; + export var WSAESOCKTNOSUPPORT: number; + export var WSAEOPNOTSUPP: number; + export var WSAEPFNOSUPPORT: number; + export var WSAEAFNOSUPPORT: number; + export var WSAEADDRINUSE: number; + export var WSAEADDRNOTAVAIL: number; + export var WSAENETDOWN: number; + export var WSAENETUNREACH: number; + export var WSAENETRESET: number; + export var WSAECONNABORTED: number; + export var WSAECONNRESET: number; + export var WSAENOBUFS: number; + export var WSAEISCONN: number; + export var WSAENOTCONN: number; + export var WSAESHUTDOWN: number; + export var WSAETOOMANYREFS: number; + export var WSAETIMEDOUT: number; + export var WSAECONNREFUSED: number; + export var WSAELOOP: number; + export var WSAENAMETOOLONG: number; + export var WSAEHOSTDOWN: number; + export var WSAEHOSTUNREACH: number; + export var WSAENOTEMPTY: number; + export var WSAEPROCLIM: number; + export var WSAEUSERS: number; + export var WSAEDQUOT: number; + export var WSAESTALE: number; + export var WSAEREMOTE: number; + export var WSASYSNOTREADY: number; + export var WSAVERNOTSUPPORTED: number; + export var WSANOTINITIALISED: number; + export var WSAEDISCON: number; + export var WSAENOMORE: number; + export var WSAECANCELLED: number; + export var WSAEINVALIDPROCTABLE: number; + export var WSAEINVALIDPROVIDER: number; + export var WSAEPROVIDERFAILEDINIT: number; + export var WSASYSCALLFAILURE: number; + export var WSASERVICE_NOT_FOUND: number; + export var WSATYPE_NOT_FOUND: number; + export var WSA_E_NO_MORE: number; + export var WSA_E_CANCELLED: number; + export var WSAEREFUSED: number; + export var SIGHUP: number; + export var SIGINT: number; + export var SIGILL: number; + export var SIGABRT: number; + export var SIGFPE: number; + export var SIGKILL: number; + export var SIGSEGV: number; + export var SIGTERM: number; + export var SIGBREAK: number; + export var SIGWINCH: number; + export var SSL_OP_ALL: number; + export var SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION: number; + export var SSL_OP_CIPHER_SERVER_PREFERENCE: number; + export var SSL_OP_CISCO_ANYCONNECT: number; + export var SSL_OP_COOKIE_EXCHANGE: number; + export var SSL_OP_CRYPTOPRO_TLSEXT_BUG: number; + export var SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS: number; + export var SSL_OP_EPHEMERAL_RSA: number; + export var SSL_OP_LEGACY_SERVER_CONNECT: number; + export var SSL_OP_MICROSOFT_BIG_SSLV3_BUFFER: number; + export var SSL_OP_MICROSOFT_SESS_ID_BUG: number; + export var SSL_OP_MSIE_SSLV2_RSA_PADDING: number; + export var SSL_OP_NETSCAPE_CA_DN_BUG: number; + export var SSL_OP_NETSCAPE_CHALLENGE_BUG: number; + export var SSL_OP_NETSCAPE_DEMO_CIPHER_CHANGE_BUG: number; + export var SSL_OP_NETSCAPE_REUSE_CIPHER_CHANGE_BUG: number; + export var SSL_OP_NO_COMPRESSION: number; + export var SSL_OP_NO_QUERY_MTU: number; + export var SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION: number; + export var SSL_OP_NO_SSLv2: number; + export var SSL_OP_NO_SSLv3: number; + export var SSL_OP_NO_TICKET: number; + export var SSL_OP_NO_TLSv1: number; + export var SSL_OP_NO_TLSv1_1: number; + export var SSL_OP_NO_TLSv1_2: number; + export var SSL_OP_PKCS1_CHECK_1: number; + export var SSL_OP_PKCS1_CHECK_2: number; + export var SSL_OP_SINGLE_DH_USE: number; + export var SSL_OP_SINGLE_ECDH_USE: number; + export var SSL_OP_SSLEAY_080_CLIENT_DH_BUG: number; + export var SSL_OP_SSLREF2_REUSE_CERT_TYPE_BUG: number; + export var SSL_OP_TLS_BLOCK_PADDING_BUG: number; + export var SSL_OP_TLS_D5_BUG: number; + export var SSL_OP_TLS_ROLLBACK_BUG: number; + export var ENGINE_METHOD_DSA: number; + export var ENGINE_METHOD_DH: number; + export var ENGINE_METHOD_RAND: number; + export var ENGINE_METHOD_ECDH: number; + export var ENGINE_METHOD_ECDSA: number; + export var ENGINE_METHOD_CIPHERS: number; + export var ENGINE_METHOD_DIGESTS: number; + export var ENGINE_METHOD_STORE: number; + export var ENGINE_METHOD_PKEY_METHS: number; + export var ENGINE_METHOD_PKEY_ASN1_METHS: number; + export var ENGINE_METHOD_ALL: number; + export var ENGINE_METHOD_NONE: number; + export var DH_CHECK_P_NOT_SAFE_PRIME: number; + export var DH_CHECK_P_NOT_PRIME: number; + export var DH_UNABLE_TO_CHECK_GENERATOR: number; + export var DH_NOT_SUITABLE_GENERATOR: number; + export var NPN_ENABLED: number; + export var RSA_PKCS1_PADDING: number; + export var RSA_SSLV23_PADDING: number; + export var RSA_NO_PADDING: number; + export var RSA_PKCS1_OAEP_PADDING: number; + export var RSA_X931_PADDING: number; + export var RSA_PKCS1_PSS_PADDING: number; + export var POINT_CONVERSION_COMPRESSED: number; + export var POINT_CONVERSION_UNCOMPRESSED: number; + export var POINT_CONVERSION_HYBRID: number; + export var O_RDONLY: number; + export var O_WRONLY: number; + export var O_RDWR: number; + export var S_IFMT: number; + export var S_IFREG: number; + export var S_IFDIR: number; + export var S_IFCHR: number; + export var S_IFBLK: number; + export var S_IFIFO: number; + export var S_IFSOCK: number; + export var S_IRWXU: number; + export var S_IRUSR: number; + export var S_IWUSR: number; + export var S_IXUSR: number; + export var S_IRWXG: number; + export var S_IRGRP: number; + export var S_IWGRP: number; + export var S_IXGRP: number; + export var S_IRWXO: number; + export var S_IROTH: number; + export var S_IWOTH: number; + export var S_IXOTH: number; + export var S_IFLNK: number; + export var O_CREAT: number; + export var O_EXCL: number; + export var O_NOCTTY: number; + export var O_DIRECTORY: number; + export var O_NOATIME: number; + export var O_NOFOLLOW: number; + export var O_SYNC: number; + export var O_DSYNC: number; + export var O_SYMLINK: number; + export var O_DIRECT: number; + export var O_NONBLOCK: number; + export var O_TRUNC: number; + export var O_APPEND: number; + export var F_OK: number; + export var R_OK: number; + export var W_OK: number; + export var X_OK: number; + export var UV_UDP_REUSEADDR: number; + export var SIGQUIT: number; + export var SIGTRAP: number; + export var SIGIOT: number; + export var SIGBUS: number; + export var SIGUSR1: number; + export var SIGUSR2: number; + export var SIGPIPE: number; + export var SIGALRM: number; + export var SIGCHLD: number; + export var SIGSTKFLT: number; + export var SIGCONT: number; + export var SIGSTOP: number; + export var SIGTSTP: number; + export var SIGTTIN: number; + export var SIGTTOU: number; + export var SIGURG: number; + export var SIGXCPU: number; + export var SIGXFSZ: number; + export var SIGVTALRM: number; + export var SIGPROF: number; + export var SIGIO: number; + export var SIGPOLL: number; + export var SIGPWR: number; + export var SIGSYS: number; + export var SIGUNUSED: number; + export var defaultCoreCipherList: string; + export var defaultCipherList: string; + export var ENGINE_METHOD_RSA: number; + export var ALPN_ENABLED: number; +} + +declare module "module" { + export = NodeJS.Module; } declare module "process" { - export = process; + export = process; } +// tslint:disable-next-line:no-declare-current-package declare module "v8" { - interface HeapSpaceInfo { - space_name: string; - space_size: number; - space_used_size: number; - space_available_size: number; - physical_space_size: number; - } + interface HeapSpaceInfo { + space_name: string; + space_size: number; + space_used_size: number; + space_available_size: number; + physical_space_size: number; + } - //** Signifies if the --zap_code_space option is enabled or not. 1 == enabled, 0 == disabled. */ - type DoesZapCodeSpaceFlag = 0 | 1; + // ** Signifies if the --zap_code_space option is enabled or not. 1 == enabled, 0 == disabled. */ + type DoesZapCodeSpaceFlag = 0 | 1; - interface HeapInfo { - total_heap_size: number; - total_heap_size_executable: number; - total_physical_size: number; - total_available_size: number; - used_heap_size: number; - heap_size_limit: number; - malloced_memory: number; - peak_malloced_memory: number; - does_zap_garbage: DoesZapCodeSpaceFlag; - } + interface HeapInfo { + total_heap_size: number; + total_heap_size_executable: number; + total_physical_size: number; + total_available_size: number; + used_heap_size: number; + heap_size_limit: number; + malloced_memory: number; + peak_malloced_memory: number; + does_zap_garbage: DoesZapCodeSpaceFlag; + } - export function getHeapStatistics(): HeapInfo; - export function getHeapSpaceStatistics(): HeapSpaceInfo[]; - export function setFlagsFromString(flags: string): void; + export function getHeapStatistics(): HeapInfo; + export function getHeapSpaceStatistics(): HeapSpaceInfo[]; + export function setFlagsFromString(flags: string): void; } declare module "timers" { - export function setTimeout(callback: (...args: any[]) => void, ms: number, ...args: any[]): NodeJS.Timer; - export function clearTimeout(timeoutId: NodeJS.Timer): void; - export function setInterval(callback: (...args: any[]) => void, ms: number, ...args: any[]): NodeJS.Timer; - export function clearInterval(intervalId: NodeJS.Timer): void; - export function setImmediate(callback: (...args: any[]) => void, ...args: any[]): any; - export function clearImmediate(immediateId: any): void; + export function setTimeout(callback: (...args: any[]) => void, ms: number, ...args: any[]): NodeJS.Timer; + export namespace setTimeout { + export function __promisify__(ms: number): Promise; + export function __promisify__(ms: number, value: T): Promise; + } + export function clearTimeout(timeoutId: NodeJS.Timer): void; + export function setInterval(callback: (...args: any[]) => void, ms: number, ...args: any[]): NodeJS.Timer; + export function clearInterval(intervalId: NodeJS.Timer): void; + export function setImmediate(callback: (...args: any[]) => void, ...args: any[]): any; + export namespace setImmediate { + export function __promisify__(): Promise; + export function __promisify__(value: T): Promise; + } + export function clearImmediate(immediateId: any): void; } declare module "console" { - export = console; + export = console; } /** - * _debugger module is not documented. - * Source code is at https://github.com/nodejs/node/blob/master/lib/_debugger.js + * Async Hooks module: https://nodejs.org/api/async_hooks.html */ -declare module "_debugger" { - export interface Packet { - raw: string; - headers: string[]; - body: Message; - } +declare module "async_hooks" { + /** + * Returns the asyncId of the current execution context. + */ + export function executionAsyncId(): number; + /// @deprecated - replaced by executionAsyncId() + export function currentId(): number; - export interface Message { - seq: number; - type: string; - } + /** + * Returns the ID of the resource responsible for calling the callback that is currently being executed. + */ + export function triggerAsyncId(): number; + /// @deprecated - replaced by triggerAsyncId() + export function triggerId(): number; - export interface RequestInfo { - command: string; - arguments: any; - } + export interface HookCallbacks { + /** + * Called when a class is constructed that has the possibility to emit an asynchronous event. + * @param asyncId a unique ID for the async resource + * @param type the type of the async resource + * @param triggerAsyncId the unique ID of the async resource in whose execution context this async resource was created + * @param resource reference to the resource representing the async operation, needs to be released during destroy + */ + init?(asyncId: number, type: string, triggerAsyncId: number, resource: Object): void; - export interface Request extends Message, RequestInfo { - } + /** + * When an asynchronous operation is initiated or completes a callback is called to notify the user. + * The before callback is called just before said callback is executed. + * @param asyncId the unique identifier assigned to the resource about to execute the callback. + */ + before?(asyncId: number): void; - export interface Event extends Message { - event: string; - body?: any; - } + /** + * Called immediately after the callback specified in before is completed. + * @param asyncId the unique identifier assigned to the resource which has executed the callback. + */ + after?(asyncId: number): void; - export interface Response extends Message { - request_seq: number; - success: boolean; - /** Contains error message if success === false. */ - message?: string; - /** Contains message body if success === true. */ - body?: any; - } + /** + * Called when a promise has resolve() called. This may not be in the same execution id + * as the promise itself. + * @param asyncId the unique id for the promise that was resolve()d. + */ + promiseResolve?(asyncId: number): void; - export interface BreakpointMessageBody { - type: string; - target: number; - line: number; - } + /** + * Called after the resource corresponding to asyncId is destroyed + * @param asyncId a unique ID for the async resource + */ + destroy?(asyncId: number): void; + } - export class Protocol { - res: Packet; - state: string; - execute(data: string): void; - serialize(rq: Request): string; - onResponse: (pkt: Packet) => void; - } + export interface AsyncHook { + /** + * Enable the callbacks for a given AsyncHook instance. If no callbacks are provided enabling is a noop. + */ + enable(): this; - export var NO_FRAME: number; - export var port: number; + /** + * Disable the callbacks for a given AsyncHook instance from the global pool of AsyncHook callbacks to be executed. Once a hook has been disabled it will not be called again until enabled. + */ + disable(): this; + } - export interface ScriptDesc { - name: string; - id: number; - isNative?: boolean; - handle?: number; - type: string; - lineOffset?: number; - columnOffset?: number; - lineCount?: number; - } + /** + * Registers functions to be called for different lifetime events of each async operation. + * @param options the callbacks to register + * @return an AsyncHooks instance used for disabling and enabling hooks + */ + export function createHook(options: HookCallbacks): AsyncHook; - export interface Breakpoint { - id: number; - scriptId: number; - script: ScriptDesc; - line: number; - condition?: string; - scriptReq?: string; - } + export interface AsyncResourceOptions { + /** + * The ID of the execution context that created this async event. + * Default: `executionAsyncId()` + */ + triggerAsyncId?: number; - export interface RequestHandler { - (err: boolean, body: Message, res: Packet): void; - request_seq?: number; - } + /** + * Disables automatic `emitDestroy` when the object is garbage collected. + * This usually does not need to be set (even if `emitDestroy` is called + * manually), unless the resource's `asyncId` is retrieved and the + * sensitive API's `emitDestroy` is called with it. + * Default: `false` + */ + requireManualDestroy?: boolean; + } - export interface ResponseBodyHandler { - (err: boolean, body?: any): void; - request_seq?: number; - } + /** + * The class AsyncResource was designed to be extended by the embedder's async resources. + * Using this users can easily trigger the lifetime events of their own resources. + */ + export class AsyncResource { + /** + * AsyncResource() is meant to be extended. Instantiating a + * new AsyncResource() also triggers init. If triggerAsyncId is omitted then + * async_hook.executionAsyncId() is used. + * @param type The type of async event. + * @param triggerAsyncId The ID of the execution context that created + * this async event (default: `executionAsyncId()`), or an + * AsyncResourceOptions object (since 8.10) + */ + constructor(type: string, triggerAsyncId?: number | AsyncResourceOptions); - export interface ExceptionInfo { - text: string; - } + /** + * Call AsyncHooks before callbacks. + */ + emitBefore(): void; - export interface BreakResponse { - script?: ScriptDesc; - exception?: ExceptionInfo; - sourceLine: number; - sourceLineText: string; - sourceColumn: number; - } + /** + * Call AsyncHooks after callbacks + */ + emitAfter(): void; - export function SourceInfo(body: BreakResponse): string; + /** + * Call AsyncHooks destroy callbacks. + */ + emitDestroy(): void; - export interface ClientInstance extends NodeJS.EventEmitter { - protocol: Protocol; - scripts: ScriptDesc[]; - handles: ScriptDesc[]; - breakpoints: Breakpoint[]; - currentSourceLine: number; - currentSourceColumn: number; - currentSourceLineText: string; - currentFrame: number; - currentScript: string; + /** + * @return the unique ID assigned to this AsyncResource instance. + */ + asyncId(): number; - connect(port: number, host: string): void; - req(req: any, cb: RequestHandler): void; - reqFrameEval(code: string, frame: number, cb: RequestHandler): void; - mirrorObject(obj: any, depth: number, cb: ResponseBodyHandler): void; - setBreakpoint(rq: BreakpointMessageBody, cb: RequestHandler): void; - clearBreakpoint(rq: Request, cb: RequestHandler): void; - listbreakpoints(cb: RequestHandler): void; - reqSource(from: number, to: number, cb: RequestHandler): void; - reqScripts(cb: any): void; - reqContinue(cb: RequestHandler): void; - } - - export var Client: { - new(): ClientInstance - } + /** + * @return the trigger ID for this AsyncResource instance. + */ + triggerAsyncId(): number; + } } + +declare module "http2" { + import * as events from "events"; + import * as fs from "fs"; + import * as net from "net"; + import * as stream from "stream"; + import * as tls from "tls"; + import * as url from "url"; + + import { IncomingHttpHeaders, OutgoingHttpHeaders } from "http"; + export { IncomingHttpHeaders, OutgoingHttpHeaders } from "http"; + + // Http2Stream + + export interface StreamPriorityOptions { + exclusive?: boolean; + parent?: number; + weight?: number; + silent?: boolean; + } + + export interface StreamState { + localWindowSize?: number; + state?: number; + streamLocalClose?: number; + streamRemoteClose?: number; + sumDependencyWeight?: number; + weight?: number; + } + + export interface ServerStreamResponseOptions { + endStream?: boolean; + getTrailers?: (trailers: OutgoingHttpHeaders) => void; + } + + export interface StatOptions { + offset: number; + length: number; + } + + export interface ServerStreamFileResponseOptions { + statCheck?: (stats: fs.Stats, headers: OutgoingHttpHeaders, statOptions: StatOptions) => void | boolean; + getTrailers?: (trailers: OutgoingHttpHeaders) => void; + offset?: number; + length?: number; + } + + export interface ServerStreamFileResponseOptionsWithError extends ServerStreamFileResponseOptions { + onError?: (err: NodeJS.ErrnoException) => void; + } + + export interface Http2Stream extends stream.Duplex { + readonly aborted: boolean; + readonly destroyed: boolean; + priority(options: StreamPriorityOptions): void; + readonly rstCode: number; + rstStream(code: number): void; + rstWithNoError(): void; + rstWithProtocolError(): void; + rstWithCancel(): void; + rstWithRefuse(): void; + rstWithInternalError(): void; + readonly session: Http2Session; + setTimeout(msecs: number, callback?: () => void): void; + readonly state: StreamState; + + addListener(event: string, listener: (...args: any[]) => void): this; + addListener(event: "aborted", listener: () => void): this; + addListener(event: "close", listener: () => void): this; + addListener(event: "data", listener: (chunk: Buffer | string) => void): this; + addListener(event: "drain", listener: () => void): this; + addListener(event: "end", listener: () => void): this; + addListener(event: "error", listener: (err: Error) => void): this; + addListener(event: "finish", listener: () => void): this; + addListener(event: "frameError", listener: (frameType: number, errorCode: number) => void): this; + addListener(event: "pipe", listener: (src: stream.Readable) => void): this; + addListener(event: "unpipe", listener: (src: stream.Readable) => void): this; + addListener(event: "streamClosed", listener: (code: number) => void): this; + addListener(event: "timeout", listener: () => void): this; + addListener(event: "trailers", listener: (trailers: IncomingHttpHeaders, flags: number) => void): this; + + emit(event: string | symbol, ...args: any[]): boolean; + emit(event: "aborted"): boolean; + emit(event: "close"): boolean; + emit(event: "data", chunk: Buffer | string): boolean; + emit(event: "drain"): boolean; + emit(event: "end"): boolean; + emit(event: "error", err: Error): boolean; + emit(event: "finish"): boolean; + emit(event: "frameError", frameType: number, errorCode: number): boolean; + emit(event: "pipe", src: stream.Readable): boolean; + emit(event: "unpipe", src: stream.Readable): boolean; + emit(event: "streamClosed", code: number): boolean; + emit(event: "timeout"): boolean; + emit(event: "trailers", trailers: IncomingHttpHeaders, flags: number): boolean; + + on(event: string, listener: (...args: any[]) => void): this; + on(event: "aborted", listener: () => void): this; + on(event: "close", listener: () => void): this; + on(event: "data", listener: (chunk: Buffer | string) => void): this; + on(event: "drain", listener: () => void): this; + on(event: "end", listener: () => void): this; + on(event: "error", listener: (err: Error) => void): this; + on(event: "finish", listener: () => void): this; + on(event: "frameError", listener: (frameType: number, errorCode: number) => void): this; + on(event: "pipe", listener: (src: stream.Readable) => void): this; + on(event: "unpipe", listener: (src: stream.Readable) => void): this; + on(event: "streamClosed", listener: (code: number) => void): this; + on(event: "timeout", listener: () => void): this; + on(event: "trailers", listener: (trailers: IncomingHttpHeaders, flags: number) => void): this; + + once(event: string, listener: (...args: any[]) => void): this; + once(event: "aborted", listener: () => void): this; + once(event: "close", listener: () => void): this; + once(event: "data", listener: (chunk: Buffer | string) => void): this; + once(event: "drain", listener: () => void): this; + once(event: "end", listener: () => void): this; + once(event: "error", listener: (err: Error) => void): this; + once(event: "finish", listener: () => void): this; + once(event: "frameError", listener: (frameType: number, errorCode: number) => void): this; + once(event: "pipe", listener: (src: stream.Readable) => void): this; + once(event: "unpipe", listener: (src: stream.Readable) => void): this; + once(event: "streamClosed", listener: (code: number) => void): this; + once(event: "timeout", listener: () => void): this; + once(event: "trailers", listener: (trailers: IncomingHttpHeaders, flags: number) => void): this; + + prependListener(event: string, listener: (...args: any[]) => void): this; + prependListener(event: "aborted", listener: () => void): this; + prependListener(event: "close", listener: () => void): this; + prependListener(event: "data", listener: (chunk: Buffer | string) => void): this; + prependListener(event: "drain", listener: () => void): this; + prependListener(event: "end", listener: () => void): this; + prependListener(event: "error", listener: (err: Error) => void): this; + prependListener(event: "finish", listener: () => void): this; + prependListener(event: "frameError", listener: (frameType: number, errorCode: number) => void): this; + prependListener(event: "pipe", listener: (src: stream.Readable) => void): this; + prependListener(event: "unpipe", listener: (src: stream.Readable) => void): this; + prependListener(event: "streamClosed", listener: (code: number) => void): this; + prependListener(event: "timeout", listener: () => void): this; + prependListener(event: "trailers", listener: (trailers: IncomingHttpHeaders, flags: number) => void): this; + + prependOnceListener(event: string, listener: (...args: any[]) => void): this; + prependOnceListener(event: "aborted", listener: () => void): this; + prependOnceListener(event: "close", listener: () => void): this; + prependOnceListener(event: "data", listener: (chunk: Buffer | string) => void): this; + prependOnceListener(event: "drain", listener: () => void): this; + prependOnceListener(event: "end", listener: () => void): this; + prependOnceListener(event: "error", listener: (err: Error) => void): this; + prependOnceListener(event: "finish", listener: () => void): this; + prependOnceListener(event: "frameError", listener: (frameType: number, errorCode: number) => void): this; + prependOnceListener(event: "pipe", listener: (src: stream.Readable) => void): this; + prependOnceListener(event: "unpipe", listener: (src: stream.Readable) => void): this; + prependOnceListener(event: "streamClosed", listener: (code: number) => void): this; + prependOnceListener(event: "timeout", listener: () => void): this; + prependOnceListener(event: "trailers", listener: (trailers: IncomingHttpHeaders, flags: number) => void): this; + } + + export interface ClientHttp2Stream extends Http2Stream { + addListener(event: string, listener: (...args: any[]) => void): this; + addListener(event: "headers", listener: (headers: IncomingHttpHeaders, flags: number) => void): this; + addListener(event: "push", listener: (headers: IncomingHttpHeaders, flags: number) => void): this; + addListener(event: "response", listener: (headers: IncomingHttpHeaders, flags: number) => void): this; + + emit(event: string | symbol, ...args: any[]): boolean; + emit(event: "headers", headers: IncomingHttpHeaders, flags: number): boolean; + emit(event: "push", headers: IncomingHttpHeaders, flags: number): boolean; + emit(event: "response", headers: IncomingHttpHeaders, flags: number): boolean; + + on(event: string, listener: (...args: any[]) => void): this; + on(event: "headers", listener: (headers: IncomingHttpHeaders, flags: number) => void): this; + on(event: "push", listener: (headers: IncomingHttpHeaders, flags: number) => void): this; + on(event: "response", listener: (headers: IncomingHttpHeaders, flags: number) => void): this; + + once(event: string, listener: (...args: any[]) => void): this; + once(event: "headers", listener: (headers: IncomingHttpHeaders, flags: number) => void): this; + once(event: "push", listener: (headers: IncomingHttpHeaders, flags: number) => void): this; + once(event: "response", listener: (headers: IncomingHttpHeaders, flags: number) => void): this; + + prependListener(event: string, listener: (...args: any[]) => void): this; + prependListener(event: "headers", listener: (headers: IncomingHttpHeaders, flags: number) => void): this; + prependListener(event: "push", listener: (headers: IncomingHttpHeaders, flags: number) => void): this; + prependListener(event: "response", listener: (headers: IncomingHttpHeaders, flags: number) => void): this; + + prependOnceListener(event: string, listener: (...args: any[]) => void): this; + prependOnceListener(event: "headers", listener: (headers: IncomingHttpHeaders, flags: number) => void): this; + prependOnceListener(event: "push", listener: (headers: IncomingHttpHeaders, flags: number) => void): this; + prependOnceListener(event: "response", listener: (headers: IncomingHttpHeaders, flags: number) => void): this; + } + + export interface ServerHttp2Stream extends Http2Stream { + additionalHeaders(headers: OutgoingHttpHeaders): void; + readonly headersSent: boolean; + readonly pushAllowed: boolean; + pushStream(headers: OutgoingHttpHeaders, callback?: (pushStream: ServerHttp2Stream) => void): void; + pushStream(headers: OutgoingHttpHeaders, options?: StreamPriorityOptions, callback?: (pushStream: ServerHttp2Stream) => void): void; + respond(headers?: OutgoingHttpHeaders, options?: ServerStreamResponseOptions): void; + respondWithFD(fd: number, headers?: OutgoingHttpHeaders, options?: ServerStreamFileResponseOptions): void; + respondWithFile(path: string, headers?: OutgoingHttpHeaders, options?: ServerStreamFileResponseOptionsWithError): void; + } + + // Http2Session + + export interface Settings { + headerTableSize?: number; + enablePush?: boolean; + initialWindowSize?: number; + maxFrameSize?: number; + maxConcurrentStreams?: number; + maxHeaderListSize?: number; + } + + export interface ClientSessionRequestOptions { + endStream?: boolean; + exclusive?: boolean; + parent?: number; + weight?: number; + getTrailers?: (trailers: OutgoingHttpHeaders, flags: number) => void; + } + + export interface SessionShutdownOptions { + graceful?: boolean; + errorCode?: number; + lastStreamID?: number; + opaqueData?: Buffer | Uint8Array; + } + + export interface SessionState { + effectiveLocalWindowSize?: number; + effectiveRecvDataLength?: number; + nextStreamID?: number; + localWindowSize?: number; + lastProcStreamID?: number; + remoteWindowSize?: number; + outboundQueueSize?: number; + deflateDynamicTableSize?: number; + inflateDynamicTableSize?: number; + } + + export interface Http2Session extends events.EventEmitter { + destroy(): void; + readonly destroyed: boolean; + readonly localSettings: Settings; + readonly pendingSettingsAck: boolean; + readonly remoteSettings: Settings; + rstStream(stream: Http2Stream, code?: number): void; + setTimeout(msecs: number, callback?: () => void): void; + shutdown(callback?: () => void): void; + shutdown(options: SessionShutdownOptions, callback?: () => void): void; + readonly socket: net.Socket | tls.TLSSocket; + readonly state: SessionState; + priority(stream: Http2Stream, options: StreamPriorityOptions): void; + settings(settings: Settings): void; + readonly type: number; + + addListener(event: string, listener: (...args: any[]) => void): this; + addListener(event: "close", listener: () => void): this; + addListener(event: "error", listener: (err: Error) => void): this; + addListener(event: "frameError", listener: (frameType: number, errorCode: number, streamID: number) => void): this; + addListener(event: "goaway", listener: (errorCode: number, lastStreamID: number, opaqueData: Buffer) => void): this; + addListener(event: "localSettings", listener: (settings: Settings) => void): this; + addListener(event: "remoteSettings", listener: (settings: Settings) => void): this; + addListener(event: "socketError", listener: (err: Error) => void): this; + addListener(event: "timeout", listener: () => void): this; + + emit(event: string | symbol, ...args: any[]): boolean; + emit(event: "close"): boolean; + emit(event: "error", err: Error): boolean; + emit(event: "frameError", frameType: number, errorCode: number, streamID: number): boolean; + emit(event: "goaway", errorCode: number, lastStreamID: number, opaqueData: Buffer): boolean; + emit(event: "localSettings", settings: Settings): boolean; + emit(event: "remoteSettings", settings: Settings): boolean; + emit(event: "socketError", err: Error): boolean; + emit(event: "timeout"): boolean; + + on(event: string, listener: (...args: any[]) => void): this; + on(event: "close", listener: () => void): this; + on(event: "error", listener: (err: Error) => void): this; + on(event: "frameError", listener: (frameType: number, errorCode: number, streamID: number) => void): this; + on(event: "goaway", listener: (errorCode: number, lastStreamID: number, opaqueData: Buffer) => void): this; + on(event: "localSettings", listener: (settings: Settings) => void): this; + on(event: "remoteSettings", listener: (settings: Settings) => void): this; + on(event: "socketError", listener: (err: Error) => void): this; + on(event: "timeout", listener: () => void): this; + + once(event: string, listener: (...args: any[]) => void): this; + once(event: "close", listener: () => void): this; + once(event: "error", listener: (err: Error) => void): this; + once(event: "frameError", listener: (frameType: number, errorCode: number, streamID: number) => void): this; + once(event: "goaway", listener: (errorCode: number, lastStreamID: number, opaqueData: Buffer) => void): this; + once(event: "localSettings", listener: (settings: Settings) => void): this; + once(event: "remoteSettings", listener: (settings: Settings) => void): this; + once(event: "socketError", listener: (err: Error) => void): this; + once(event: "timeout", listener: () => void): this; + + prependListener(event: string, listener: (...args: any[]) => void): this; + prependListener(event: "close", listener: () => void): this; + prependListener(event: "error", listener: (err: Error) => void): this; + prependListener(event: "frameError", listener: (frameType: number, errorCode: number, streamID: number) => void): this; + prependListener(event: "goaway", listener: (errorCode: number, lastStreamID: number, opaqueData: Buffer) => void): this; + prependListener(event: "localSettings", listener: (settings: Settings) => void): this; + prependListener(event: "remoteSettings", listener: (settings: Settings) => void): this; + prependListener(event: "socketError", listener: (err: Error) => void): this; + prependListener(event: "timeout", listener: () => void): this; + + prependOnceListener(event: string, listener: (...args: any[]) => void): this; + prependOnceListener(event: "close", listener: () => void): this; + prependOnceListener(event: "error", listener: (err: Error) => void): this; + prependOnceListener(event: "frameError", listener: (frameType: number, errorCode: number, streamID: number) => void): this; + prependOnceListener(event: "goaway", listener: (errorCode: number, lastStreamID: number, opaqueData: Buffer) => void): this; + prependOnceListener(event: "localSettings", listener: (settings: Settings) => void): this; + prependOnceListener(event: "remoteSettings", listener: (settings: Settings) => void): this; + prependOnceListener(event: "socketError", listener: (err: Error) => void): this; + prependOnceListener(event: "timeout", listener: () => void): this; + } + + export interface ClientHttp2Session extends Http2Session { + request(headers?: OutgoingHttpHeaders, options?: ClientSessionRequestOptions): ClientHttp2Stream; + + addListener(event: string, listener: (...args: any[]) => void): this; + addListener(event: "connect", listener: (session: ClientHttp2Session, socket: net.Socket | tls.TLSSocket) => void): this; + addListener(event: "stream", listener: (stream: ClientHttp2Stream, headers: IncomingHttpHeaders, flags: number) => void): this; + + emit(event: string | symbol, ...args: any[]): boolean; + emit(event: "connect", session: ClientHttp2Session, socket: net.Socket | tls.TLSSocket): boolean; + emit(event: "stream", stream: ClientHttp2Stream, headers: IncomingHttpHeaders, flags: number): boolean; + + on(event: string, listener: (...args: any[]) => void): this; + on(event: "connect", listener: (session: ClientHttp2Session, socket: net.Socket | tls.TLSSocket) => void): this; + on(event: "stream", listener: (stream: ClientHttp2Stream, headers: IncomingHttpHeaders, flags: number) => void): this; + + once(event: string, listener: (...args: any[]) => void): this; + once(event: "connect", listener: (session: ClientHttp2Session, socket: net.Socket | tls.TLSSocket) => void): this; + once(event: "stream", listener: (stream: ClientHttp2Stream, headers: IncomingHttpHeaders, flags: number) => void): this; + + prependListener(event: string, listener: (...args: any[]) => void): this; + prependListener(event: "connect", listener: (session: ClientHttp2Session, socket: net.Socket | tls.TLSSocket) => void): this; + prependListener(event: "stream", listener: (stream: ClientHttp2Stream, headers: IncomingHttpHeaders, flags: number) => void): this; + + prependOnceListener(event: string, listener: (...args: any[]) => void): this; + prependOnceListener(event: "connect", listener: (session: ClientHttp2Session, socket: net.Socket | tls.TLSSocket) => void): this; + prependOnceListener(event: "stream", listener: (stream: ClientHttp2Stream, headers: IncomingHttpHeaders, flags: number) => void): this; + } + + export interface ServerHttp2Session extends Http2Session { + readonly server: Http2Server | Http2SecureServer; + + addListener(event: string, listener: (...args: any[]) => void): this; + addListener(event: "connect", listener: (session: ServerHttp2Session, socket: net.Socket | tls.TLSSocket) => void): this; + addListener(event: "stream", listener: (stream: ServerHttp2Stream, headers: IncomingHttpHeaders, flags: number) => void): this; + + emit(event: string | symbol, ...args: any[]): boolean; + emit(event: "connect", session: ServerHttp2Session, socket: net.Socket | tls.TLSSocket): boolean; + emit(event: "stream", stream: ServerHttp2Stream, headers: IncomingHttpHeaders, flags: number): boolean; + + on(event: string, listener: (...args: any[]) => void): this; + on(event: "connect", listener: (session: ServerHttp2Session, socket: net.Socket | tls.TLSSocket) => void): this; + on(event: "stream", listener: (stream: ServerHttp2Stream, headers: IncomingHttpHeaders, flags: number) => void): this; + + once(event: string, listener: (...args: any[]) => void): this; + once(event: "connect", listener: (session: ServerHttp2Session, socket: net.Socket | tls.TLSSocket) => void): this; + once(event: "stream", listener: (stream: ServerHttp2Stream, headers: IncomingHttpHeaders, flags: number) => void): this; + + prependListener(event: string, listener: (...args: any[]) => void): this; + prependListener(event: "connect", listener: (session: ServerHttp2Session, socket: net.Socket | tls.TLSSocket) => void): this; + prependListener(event: "stream", listener: (stream: ServerHttp2Stream, headers: IncomingHttpHeaders, flags: number) => void): this; + + prependOnceListener(event: string, listener: (...args: any[]) => void): this; + prependOnceListener(event: "connect", listener: (session: ServerHttp2Session, socket: net.Socket | tls.TLSSocket) => void): this; + prependOnceListener(event: "stream", listener: (stream: ServerHttp2Stream, headers: IncomingHttpHeaders, flags: number) => void): this; + } + + // Http2Server + + export interface SessionOptions { + maxDeflateDynamicTableSize?: number; + maxReservedRemoteStreams?: number; + maxSendHeaderBlockLength?: number; + paddingStrategy?: number; + peerMaxConcurrentStreams?: number; + selectPadding?: (frameLen: number, maxFrameLen: number) => number; + settings?: Settings; + } + + export type ClientSessionOptions = SessionOptions; + export type ServerSessionOptions = SessionOptions; + + export interface SecureClientSessionOptions extends ClientSessionOptions, tls.ConnectionOptions { } + export interface SecureServerSessionOptions extends ServerSessionOptions, tls.TlsOptions { } + + export interface ServerOptions extends ServerSessionOptions { + allowHTTP1?: boolean; + } + + export interface SecureServerOptions extends SecureServerSessionOptions { + allowHTTP1?: boolean; + } + + export interface Http2Server extends net.Server { + addListener(event: string, listener: (...args: any[]) => void): this; + addListener(event: "request", listener: (request: Http2ServerRequest, response: Http2ServerResponse) => void): this; + addListener(event: "sessionError", listener: (err: Error) => void): this; + addListener(event: "socketError", listener: (err: Error) => void): this; + addListener(event: "stream", listener: (stream: ServerHttp2Stream, headers: IncomingHttpHeaders, flags: number) => void): this; + addListener(event: "timeout", listener: () => void): this; + + emit(event: string | symbol, ...args: any[]): boolean; + emit(event: "request", request: Http2ServerRequest, response: Http2ServerResponse): boolean; + emit(event: "sessionError", err: Error): boolean; + emit(event: "socketError", err: Error): boolean; + emit(event: "stream", stream: ServerHttp2Stream, headers: IncomingHttpHeaders, flags: number): boolean; + emit(event: "timeout"): boolean; + + on(event: string, listener: (...args: any[]) => void): this; + on(event: "request", listener: (request: Http2ServerRequest, response: Http2ServerResponse) => void): this; + on(event: "sessionError", listener: (err: Error) => void): this; + on(event: "socketError", listener: (err: Error) => void): this; + on(event: "stream", listener: (stream: ServerHttp2Stream, headers: IncomingHttpHeaders, flags: number) => void): this; + on(event: "timeout", listener: () => void): this; + + once(event: string, listener: (...args: any[]) => void): this; + once(event: "request", listener: (request: Http2ServerRequest, response: Http2ServerResponse) => void): this; + once(event: "sessionError", listener: (err: Error) => void): this; + once(event: "socketError", listener: (err: Error) => void): this; + once(event: "stream", listener: (stream: ServerHttp2Stream, headers: IncomingHttpHeaders, flags: number) => void): this; + once(event: "timeout", listener: () => void): this; + + prependListener(event: string, listener: (...args: any[]) => void): this; + prependListener(event: "request", listener: (request: Http2ServerRequest, response: Http2ServerResponse) => void): this; + prependListener(event: "sessionError", listener: (err: Error) => void): this; + prependListener(event: "socketError", listener: (err: Error) => void): this; + prependListener(event: "stream", listener: (stream: ServerHttp2Stream, headers: IncomingHttpHeaders, flags: number) => void): this; + prependListener(event: "timeout", listener: () => void): this; + + prependOnceListener(event: string, listener: (...args: any[]) => void): this; + prependOnceListener(event: "request", listener: (request: Http2ServerRequest, response: Http2ServerResponse) => void): this; + prependOnceListener(event: "sessionError", listener: (err: Error) => void): this; + prependOnceListener(event: "socketError", listener: (err: Error) => void): this; + prependOnceListener(event: "stream", listener: (stream: ServerHttp2Stream, headers: IncomingHttpHeaders, flags: number) => void): this; + prependOnceListener(event: "timeout", listener: () => void): this; + } + + export interface Http2SecureServer extends tls.Server { + addListener(event: string, listener: (...args: any[]) => void): this; + addListener(event: "request", listener: (request: Http2ServerRequest, response: Http2ServerResponse) => void): this; + addListener(event: "sessionError", listener: (err: Error) => void): this; + addListener(event: "socketError", listener: (err: Error) => void): this; + addListener(event: "stream", listener: (stream: ServerHttp2Stream, headers: IncomingHttpHeaders, flags: number) => void): this; + addListener(event: "timeout", listener: () => void): this; + addListener(event: "unknownProtocol", listener: (socket: tls.TLSSocket) => void): this; + + emit(event: string | symbol, ...args: any[]): boolean; + emit(event: "request", request: Http2ServerRequest, response: Http2ServerResponse): boolean; + emit(event: "sessionError", err: Error): boolean; + emit(event: "socketError", err: Error): boolean; + emit(event: "stream", stream: ServerHttp2Stream, headers: IncomingHttpHeaders, flags: number): boolean; + emit(event: "timeout"): boolean; + emit(event: "unknownProtocol", socket: tls.TLSSocket): boolean; + + on(event: string, listener: (...args: any[]) => void): this; + on(event: "request", listener: (request: Http2ServerRequest, response: Http2ServerResponse) => void): this; + on(event: "sessionError", listener: (err: Error) => void): this; + on(event: "socketError", listener: (err: Error) => void): this; + on(event: "stream", listener: (stream: ServerHttp2Stream, headers: IncomingHttpHeaders, flags: number) => void): this; + on(event: "timeout", listener: () => void): this; + on(event: "unknownProtocol", listener: (socket: tls.TLSSocket) => void): this; + + once(event: string, listener: (...args: any[]) => void): this; + once(event: "request", listener: (request: Http2ServerRequest, response: Http2ServerResponse) => void): this; + once(event: "sessionError", listener: (err: Error) => void): this; + once(event: "socketError", listener: (err: Error) => void): this; + once(event: "stream", listener: (stream: ServerHttp2Stream, headers: IncomingHttpHeaders, flags: number) => void): this; + once(event: "timeout", listener: () => void): this; + once(event: "unknownProtocol", listener: (socket: tls.TLSSocket) => void): this; + + prependListener(event: string, listener: (...args: any[]) => void): this; + prependListener(event: "request", listener: (request: Http2ServerRequest, response: Http2ServerResponse) => void): this; + prependListener(event: "sessionError", listener: (err: Error) => void): this; + prependListener(event: "socketError", listener: (err: Error) => void): this; + prependListener(event: "stream", listener: (stream: ServerHttp2Stream, headers: IncomingHttpHeaders, flags: number) => void): this; + prependListener(event: "timeout", listener: () => void): this; + prependListener(event: "unknownProtocol", listener: (socket: tls.TLSSocket) => void): this; + + prependOnceListener(event: string, listener: (...args: any[]) => void): this; + prependOnceListener(event: "request", listener: (request: Http2ServerRequest, response: Http2ServerResponse) => void): this; + prependOnceListener(event: "sessionError", listener: (err: Error) => void): this; + prependOnceListener(event: "socketError", listener: (err: Error) => void): this; + prependOnceListener(event: "stream", listener: (stream: ServerHttp2Stream, headers: IncomingHttpHeaders, flags: number) => void): this; + prependOnceListener(event: "timeout", listener: () => void): this; + prependOnceListener(event: "unknownProtocol", listener: (socket: tls.TLSSocket) => void): this; + } + + export interface Http2ServerRequest extends stream.Readable { + headers: IncomingHttpHeaders; + httpVersion: string; + method: string; + rawHeaders: string[]; + rawTrailers: string[]; + setTimeout(msecs: number, callback?: () => void): void; + socket: net.Socket | tls.TLSSocket; + stream: ServerHttp2Stream; + trailers: IncomingHttpHeaders; + url: string; + + addListener(event: string, listener: (...args: any[]) => void): this; + addListener(event: "aborted", listener: (hadError: boolean, code: number) => void): this; + + emit(event: string | symbol, ...args: any[]): boolean; + emit(event: "aborted", hadError: boolean, code: number): boolean; + + on(event: string, listener: (...args: any[]) => void): this; + on(event: "aborted", listener: (hadError: boolean, code: number) => void): this; + + once(event: string, listener: (...args: any[]) => void): this; + once(event: "aborted", listener: (hadError: boolean, code: number) => void): this; + + prependListener(event: string, listener: (...args: any[]) => void): this; + prependListener(event: "aborted", listener: (hadError: boolean, code: number) => void): this; + + prependOnceListener(event: string, listener: (...args: any[]) => void): this; + prependOnceListener(event: "aborted", listener: (hadError: boolean, code: number) => void): this; + } + + export interface Http2ServerResponse extends events.EventEmitter { + addTrailers(trailers: OutgoingHttpHeaders): void; + connection: net.Socket | tls.TLSSocket; + end(callback?: () => void): void; + end(data?: string | Buffer, callback?: () => void): void; + end(data?: string | Buffer, encoding?: string, callback?: () => void): void; + readonly finished: boolean; + getHeader(name: string): string; + getHeaderNames(): string[]; + getHeaders(): OutgoingHttpHeaders; + hasHeader(name: string): boolean; + readonly headersSent: boolean; + removeHeader(name: string): void; + sendDate: boolean; + setHeader(name: string, value: number | string | string[]): void; + setTimeout(msecs: number, callback?: () => void): void; + socket: net.Socket | tls.TLSSocket; + statusCode: number; + statusMessage: ''; + stream: ServerHttp2Stream; + write(chunk: string | Buffer, callback?: (err: Error) => void): boolean; + write(chunk: string | Buffer, encoding?: string, callback?: (err: Error) => void): boolean; + writeContinue(): void; + writeHead(statusCode: number, headers?: OutgoingHttpHeaders): void; + writeHead(statusCode: number, statusMessage?: string, headers?: OutgoingHttpHeaders): void; + createPushResponse(headers: OutgoingHttpHeaders, callback: (err: Error | null, res: Http2ServerResponse) => void): void; + + addListener(event: string, listener: (...args: any[]) => void): this; + addListener(event: "aborted", listener: (hadError: boolean, code: number) => void): this; + addListener(event: "close", listener: () => void): this; + addListener(event: "drain", listener: () => void): this; + addListener(event: "error", listener: (error: Error) => void): this; + addListener(event: "finish", listener: () => void): this; + + emit(event: string | symbol, ...args: any[]): boolean; + emit(event: "aborted", hadError: boolean, code: number): boolean; + emit(event: "close"): boolean; + emit(event: "drain"): boolean; + emit(event: "error", error: Error): boolean; + emit(event: "finish"): boolean; + + on(event: string, listener: (...args: any[]) => void): this; + on(event: "aborted", listener: (hadError: boolean, code: number) => void): this; + on(event: "close", listener: () => void): this; + on(event: "drain", listener: () => void): this; + on(event: "error", listener: (error: Error) => void): this; + on(event: "finish", listener: () => void): this; + + once(event: string, listener: (...args: any[]) => void): this; + once(event: "aborted", listener: (hadError: boolean, code: number) => void): this; + once(event: "close", listener: () => void): this; + once(event: "drain", listener: () => void): this; + once(event: "error", listener: (error: Error) => void): this; + once(event: "finish", listener: () => void): this; + + prependListener(event: string, listener: (...args: any[]) => void): this; + prependListener(event: "aborted", listener: (hadError: boolean, code: number) => void): this; + prependListener(event: "close", listener: () => void): this; + prependListener(event: "drain", listener: () => void): this; + prependListener(event: "error", listener: (error: Error) => void): this; + prependListener(event: "finish", listener: () => void): this; + + prependOnceListener(event: string, listener: (...args: any[]) => void): this; + prependOnceListener(event: "aborted", listener: (hadError: boolean, code: number) => void): this; + prependOnceListener(event: "close", listener: () => void): this; + prependOnceListener(event: "drain", listener: () => void): this; + prependOnceListener(event: "error", listener: (error: Error) => void): this; + prependOnceListener(event: "finish", listener: () => void): this; + } + + // Public API + + export namespace constants { + export const NGHTTP2_SESSION_SERVER: number; + export const NGHTTP2_SESSION_CLIENT: number; + export const NGHTTP2_STREAM_STATE_IDLE: number; + export const NGHTTP2_STREAM_STATE_OPEN: number; + export const NGHTTP2_STREAM_STATE_RESERVED_LOCAL: number; + export const NGHTTP2_STREAM_STATE_RESERVED_REMOTE: number; + export const NGHTTP2_STREAM_STATE_HALF_CLOSED_LOCAL: number; + export const NGHTTP2_STREAM_STATE_HALF_CLOSED_REMOTE: number; + export const NGHTTP2_STREAM_STATE_CLOSED: number; + export const NGHTTP2_NO_ERROR: number; + export const NGHTTP2_PROTOCOL_ERROR: number; + export const NGHTTP2_INTERNAL_ERROR: number; + export const NGHTTP2_FLOW_CONTROL_ERROR: number; + export const NGHTTP2_SETTINGS_TIMEOUT: number; + export const NGHTTP2_STREAM_CLOSED: number; + export const NGHTTP2_FRAME_SIZE_ERROR: number; + export const NGHTTP2_REFUSED_STREAM: number; + export const NGHTTP2_CANCEL: number; + export const NGHTTP2_COMPRESSION_ERROR: number; + export const NGHTTP2_CONNECT_ERROR: number; + export const NGHTTP2_ENHANCE_YOUR_CALM: number; + export const NGHTTP2_INADEQUATE_SECURITY: number; + export const NGHTTP2_HTTP_1_1_REQUIRED: number; + export const NGHTTP2_ERR_FRAME_SIZE_ERROR: number; + export const NGHTTP2_FLAG_NONE: number; + export const NGHTTP2_FLAG_END_STREAM: number; + export const NGHTTP2_FLAG_END_HEADERS: number; + export const NGHTTP2_FLAG_ACK: number; + export const NGHTTP2_FLAG_PADDED: number; + export const NGHTTP2_FLAG_PRIORITY: number; + export const DEFAULT_SETTINGS_HEADER_TABLE_SIZE: number; + export const DEFAULT_SETTINGS_ENABLE_PUSH: number; + export const DEFAULT_SETTINGS_INITIAL_WINDOW_SIZE: number; + export const DEFAULT_SETTINGS_MAX_FRAME_SIZE: number; + export const MAX_MAX_FRAME_SIZE: number; + export const MIN_MAX_FRAME_SIZE: number; + export const MAX_INITIAL_WINDOW_SIZE: number; + export const NGHTTP2_DEFAULT_WEIGHT: number; + export const NGHTTP2_SETTINGS_HEADER_TABLE_SIZE: number; + export const NGHTTP2_SETTINGS_ENABLE_PUSH: number; + export const NGHTTP2_SETTINGS_MAX_CONCURRENT_STREAMS: number; + export const NGHTTP2_SETTINGS_INITIAL_WINDOW_SIZE: number; + export const NGHTTP2_SETTINGS_MAX_FRAME_SIZE: number; + export const NGHTTP2_SETTINGS_MAX_HEADER_LIST_SIZE: number; + export const PADDING_STRATEGY_NONE: number; + export const PADDING_STRATEGY_MAX: number; + export const PADDING_STRATEGY_CALLBACK: number; + export const HTTP2_HEADER_STATUS: string; + export const HTTP2_HEADER_METHOD: string; + export const HTTP2_HEADER_AUTHORITY: string; + export const HTTP2_HEADER_SCHEME: string; + export const HTTP2_HEADER_PATH: string; + export const HTTP2_HEADER_ACCEPT_CHARSET: string; + export const HTTP2_HEADER_ACCEPT_ENCODING: string; + export const HTTP2_HEADER_ACCEPT_LANGUAGE: string; + export const HTTP2_HEADER_ACCEPT_RANGES: string; + export const HTTP2_HEADER_ACCEPT: string; + export const HTTP2_HEADER_ACCESS_CONTROL_ALLOW_ORIGIN: string; + export const HTTP2_HEADER_AGE: string; + export const HTTP2_HEADER_ALLOW: string; + export const HTTP2_HEADER_AUTHORIZATION: string; + export const HTTP2_HEADER_CACHE_CONTROL: string; + export const HTTP2_HEADER_CONNECTION: string; + export const HTTP2_HEADER_CONTENT_DISPOSITION: string; + export const HTTP2_HEADER_CONTENT_ENCODING: string; + export const HTTP2_HEADER_CONTENT_LANGUAGE: string; + export const HTTP2_HEADER_CONTENT_LENGTH: string; + export const HTTP2_HEADER_CONTENT_LOCATION: string; + export const HTTP2_HEADER_CONTENT_MD5: string; + export const HTTP2_HEADER_CONTENT_RANGE: string; + export const HTTP2_HEADER_CONTENT_TYPE: string; + export const HTTP2_HEADER_COOKIE: string; + export const HTTP2_HEADER_DATE: string; + export const HTTP2_HEADER_ETAG: string; + export const HTTP2_HEADER_EXPECT: string; + export const HTTP2_HEADER_EXPIRES: string; + export const HTTP2_HEADER_FROM: string; + export const HTTP2_HEADER_HOST: string; + export const HTTP2_HEADER_IF_MATCH: string; + export const HTTP2_HEADER_IF_MODIFIED_SINCE: string; + export const HTTP2_HEADER_IF_NONE_MATCH: string; + export const HTTP2_HEADER_IF_RANGE: string; + export const HTTP2_HEADER_IF_UNMODIFIED_SINCE: string; + export const HTTP2_HEADER_LAST_MODIFIED: string; + export const HTTP2_HEADER_LINK: string; + export const HTTP2_HEADER_LOCATION: string; + export const HTTP2_HEADER_MAX_FORWARDS: string; + export const HTTP2_HEADER_PREFER: string; + export const HTTP2_HEADER_PROXY_AUTHENTICATE: string; + export const HTTP2_HEADER_PROXY_AUTHORIZATION: string; + export const HTTP2_HEADER_RANGE: string; + export const HTTP2_HEADER_REFERER: string; + export const HTTP2_HEADER_REFRESH: string; + export const HTTP2_HEADER_RETRY_AFTER: string; + export const HTTP2_HEADER_SERVER: string; + export const HTTP2_HEADER_SET_COOKIE: string; + export const HTTP2_HEADER_STRICT_TRANSPORT_SECURITY: string; + export const HTTP2_HEADER_TRANSFER_ENCODING: string; + export const HTTP2_HEADER_TE: string; + export const HTTP2_HEADER_UPGRADE: string; + export const HTTP2_HEADER_USER_AGENT: string; + export const HTTP2_HEADER_VARY: string; + export const HTTP2_HEADER_VIA: string; + export const HTTP2_HEADER_WWW_AUTHENTICATE: string; + export const HTTP2_HEADER_HTTP2_SETTINGS: string; + export const HTTP2_HEADER_KEEP_ALIVE: string; + export const HTTP2_HEADER_PROXY_CONNECTION: string; + export const HTTP2_METHOD_ACL: string; + export const HTTP2_METHOD_BASELINE_CONTROL: string; + export const HTTP2_METHOD_BIND: string; + export const HTTP2_METHOD_CHECKIN: string; + export const HTTP2_METHOD_CHECKOUT: string; + export const HTTP2_METHOD_CONNECT: string; + export const HTTP2_METHOD_COPY: string; + export const HTTP2_METHOD_DELETE: string; + export const HTTP2_METHOD_GET: string; + export const HTTP2_METHOD_HEAD: string; + export const HTTP2_METHOD_LABEL: string; + export const HTTP2_METHOD_LINK: string; + export const HTTP2_METHOD_LOCK: string; + export const HTTP2_METHOD_MERGE: string; + export const HTTP2_METHOD_MKACTIVITY: string; + export const HTTP2_METHOD_MKCALENDAR: string; + export const HTTP2_METHOD_MKCOL: string; + export const HTTP2_METHOD_MKREDIRECTREF: string; + export const HTTP2_METHOD_MKWORKSPACE: string; + export const HTTP2_METHOD_MOVE: string; + export const HTTP2_METHOD_OPTIONS: string; + export const HTTP2_METHOD_ORDERPATCH: string; + export const HTTP2_METHOD_PATCH: string; + export const HTTP2_METHOD_POST: string; + export const HTTP2_METHOD_PRI: string; + export const HTTP2_METHOD_PROPFIND: string; + export const HTTP2_METHOD_PROPPATCH: string; + export const HTTP2_METHOD_PUT: string; + export const HTTP2_METHOD_REBIND: string; + export const HTTP2_METHOD_REPORT: string; + export const HTTP2_METHOD_SEARCH: string; + export const HTTP2_METHOD_TRACE: string; + export const HTTP2_METHOD_UNBIND: string; + export const HTTP2_METHOD_UNCHECKOUT: string; + export const HTTP2_METHOD_UNLINK: string; + export const HTTP2_METHOD_UNLOCK: string; + export const HTTP2_METHOD_UPDATE: string; + export const HTTP2_METHOD_UPDATEREDIRECTREF: string; + export const HTTP2_METHOD_VERSION_CONTROL: string; + export const HTTP_STATUS_CONTINUE: number; + export const HTTP_STATUS_SWITCHING_PROTOCOLS: number; + export const HTTP_STATUS_PROCESSING: number; + export const HTTP_STATUS_OK: number; + export const HTTP_STATUS_CREATED: number; + export const HTTP_STATUS_ACCEPTED: number; + export const HTTP_STATUS_NON_AUTHORITATIVE_INFORMATION: number; + export const HTTP_STATUS_NO_CONTENT: number; + export const HTTP_STATUS_RESET_CONTENT: number; + export const HTTP_STATUS_PARTIAL_CONTENT: number; + export const HTTP_STATUS_MULTI_STATUS: number; + export const HTTP_STATUS_ALREADY_REPORTED: number; + export const HTTP_STATUS_IM_USED: number; + export const HTTP_STATUS_MULTIPLE_CHOICES: number; + export const HTTP_STATUS_MOVED_PERMANENTLY: number; + export const HTTP_STATUS_FOUND: number; + export const HTTP_STATUS_SEE_OTHER: number; + export const HTTP_STATUS_NOT_MODIFIED: number; + export const HTTP_STATUS_USE_PROXY: number; + export const HTTP_STATUS_TEMPORARY_REDIRECT: number; + export const HTTP_STATUS_PERMANENT_REDIRECT: number; + export const HTTP_STATUS_BAD_REQUEST: number; + export const HTTP_STATUS_UNAUTHORIZED: number; + export const HTTP_STATUS_PAYMENT_REQUIRED: number; + export const HTTP_STATUS_FORBIDDEN: number; + export const HTTP_STATUS_NOT_FOUND: number; + export const HTTP_STATUS_METHOD_NOT_ALLOWED: number; + export const HTTP_STATUS_NOT_ACCEPTABLE: number; + export const HTTP_STATUS_PROXY_AUTHENTICATION_REQUIRED: number; + export const HTTP_STATUS_REQUEST_TIMEOUT: number; + export const HTTP_STATUS_CONFLICT: number; + export const HTTP_STATUS_GONE: number; + export const HTTP_STATUS_LENGTH_REQUIRED: number; + export const HTTP_STATUS_PRECONDITION_FAILED: number; + export const HTTP_STATUS_PAYLOAD_TOO_LARGE: number; + export const HTTP_STATUS_URI_TOO_LONG: number; + export const HTTP_STATUS_UNSUPPORTED_MEDIA_TYPE: number; + export const HTTP_STATUS_RANGE_NOT_SATISFIABLE: number; + export const HTTP_STATUS_EXPECTATION_FAILED: number; + export const HTTP_STATUS_TEAPOT: number; + export const HTTP_STATUS_MISDIRECTED_REQUEST: number; + export const HTTP_STATUS_UNPROCESSABLE_ENTITY: number; + export const HTTP_STATUS_LOCKED: number; + export const HTTP_STATUS_FAILED_DEPENDENCY: number; + export const HTTP_STATUS_UNORDERED_COLLECTION: number; + export const HTTP_STATUS_UPGRADE_REQUIRED: number; + export const HTTP_STATUS_PRECONDITION_REQUIRED: number; + export const HTTP_STATUS_TOO_MANY_REQUESTS: number; + export const HTTP_STATUS_REQUEST_HEADER_FIELDS_TOO_LARGE: number; + export const HTTP_STATUS_UNAVAILABLE_FOR_LEGAL_REASONS: number; + export const HTTP_STATUS_INTERNAL_SERVER_ERROR: number; + export const HTTP_STATUS_NOT_IMPLEMENTED: number; + export const HTTP_STATUS_BAD_GATEWAY: number; + export const HTTP_STATUS_SERVICE_UNAVAILABLE: number; + export const HTTP_STATUS_GATEWAY_TIMEOUT: number; + export const HTTP_STATUS_HTTP_VERSION_NOT_SUPPORTED: number; + export const HTTP_STATUS_VARIANT_ALSO_NEGOTIATES: number; + export const HTTP_STATUS_INSUFFICIENT_STORAGE: number; + export const HTTP_STATUS_LOOP_DETECTED: number; + export const HTTP_STATUS_BANDWIDTH_LIMIT_EXCEEDED: number; + export const HTTP_STATUS_NOT_EXTENDED: number; + export const HTTP_STATUS_NETWORK_AUTHENTICATION_REQUIRED: number; + } + + export function getDefaultSettings(): Settings; + export function getPackedSettings(settings: Settings): Settings; + export function getUnpackedSettings(buf: Buffer | Uint8Array): Settings; + + export function createServer(onRequestHandler?: (request: Http2ServerRequest, response: Http2ServerResponse) => void): Http2Server; + export function createServer(options: ServerOptions, onRequestHandler?: (request: Http2ServerRequest, response: Http2ServerResponse) => void): Http2Server; + + export function createSecureServer(onRequestHandler?: (request: Http2ServerRequest, response: Http2ServerResponse) => void): Http2SecureServer; + export function createSecureServer(options: SecureServerOptions, onRequestHandler?: (request: Http2ServerRequest, response: Http2ServerResponse) => void): Http2SecureServer; + + export function connect(authority: string | url.URL, listener?: (session: ClientHttp2Session, socket: net.Socket | tls.TLSSocket) => void): ClientHttp2Session; + export function connect(authority: string | url.URL, options?: ClientSessionOptions | SecureClientSessionOptions, listener?: (session: ClientHttp2Session, socket: net.Socket | tls.TLSSocket) => void): ClientHttp2Session; +} + +declare module "perf_hooks" { + export interface PerformanceEntry { + /** + * The total number of milliseconds elapsed for this entry. + * This value will not be meaningful for all Performance Entry types. + */ + readonly duration: number; + + /** + * The name of the performance entry. + */ + readonly name: string; + + /** + * The high resolution millisecond timestamp marking the starting time of the Performance Entry. + */ + readonly startTime: number; + + /** + * The type of the performance entry. + * Currently it may be one of: 'node', 'mark', 'measure', 'gc', or 'function'. + */ + readonly entryType: string; + + /** + * When performanceEntry.entryType is equal to 'gc', the performance.kind property identifies + * the type of garbage collection operation that occurred. + * The value may be one of perf_hooks.constants. + */ + readonly kind?: number; + } + + export interface PerformanceNodeTiming extends PerformanceEntry { + /** + * The high resolution millisecond timestamp at which the Node.js process completed bootstrap. + */ + readonly bootstrapComplete: number; + + /** + * The high resolution millisecond timestamp at which cluster processing ended. + */ + readonly clusterSetupEnd: number; + + /** + * The high resolution millisecond timestamp at which cluster processing started. + */ + readonly clusterSetupStart: number; + + /** + * The high resolution millisecond timestamp at which the Node.js event loop exited. + */ + readonly loopExit: number; + + /** + * The high resolution millisecond timestamp at which the Node.js event loop started. + */ + readonly loopStart: number; + + /** + * The high resolution millisecond timestamp at which main module load ended. + */ + readonly moduleLoadEnd: number; + + /** + * The high resolution millisecond timestamp at which main module load started. + */ + readonly moduleLoadStart: number; + + /** + * The high resolution millisecond timestamp at which the Node.js process was initialized. + */ + readonly nodeStart: number; + + /** + * The high resolution millisecond timestamp at which preload module load ended. + */ + readonly preloadModuleLoadEnd: number; + + /** + * The high resolution millisecond timestamp at which preload module load started. + */ + readonly preloadModuleLoadStart: number; + + /** + * The high resolution millisecond timestamp at which third_party_main processing ended. + */ + readonly thirdPartyMainEnd: number; + + /** + * The high resolution millisecond timestamp at which third_party_main processing started. + */ + readonly thirdPartyMainStart: number; + + /** + * The high resolution millisecond timestamp at which the V8 platform was initialized. + */ + readonly v8Start: number; + } + + export interface Performance { + /** + * If name is not provided, removes all PerformanceFunction objects from the Performance Timeline. + * If name is provided, removes entries with name. + * @param name + */ + clearFunctions(name?: string): void; + + /** + * If name is not provided, removes all PerformanceMark objects from the Performance Timeline. + * If name is provided, removes only the named mark. + * @param name + */ + clearMarks(name?: string): void; + + /** + * If name is not provided, removes all PerformanceMeasure objects from the Performance Timeline. + * If name is provided, removes only objects whose performanceEntry.name matches name. + */ + clearMeasures(name?: string): void; + + /** + * Returns a list of all PerformanceEntry objects in chronological order with respect to performanceEntry.startTime. + * @return list of all PerformanceEntry objects + */ + getEntries(): PerformanceEntry[]; + + /** + * Returns a list of all PerformanceEntry objects in chronological order with respect to performanceEntry.startTime + * whose performanceEntry.name is equal to name, and optionally, whose performanceEntry.entryType is equal to type. + * @param name + * @param type + * @return list of all PerformanceEntry objects + */ + getEntriesByName(name: string, type?: string): PerformanceEntry[]; + + /** + * Returns a list of all PerformanceEntry objects in chronological order with respect to performanceEntry.startTime + * whose performanceEntry.entryType is equal to type. + * @param type + * @return list of all PerformanceEntry objects + */ + getEntriesByType(type: string): PerformanceEntry[]; + + /** + * Creates a new PerformanceMark entry in the Performance Timeline. + * A PerformanceMark is a subclass of PerformanceEntry whose performanceEntry.entryType is always 'mark', + * and whose performanceEntry.duration is always 0. + * Performance marks are used to mark specific significant moments in the Performance Timeline. + * @param name + */ + mark(name?: string): void; + + /** + * Creates a new PerformanceMeasure entry in the Performance Timeline. + * A PerformanceMeasure is a subclass of PerformanceEntry whose performanceEntry.entryType is always 'measure', + * and whose performanceEntry.duration measures the number of milliseconds elapsed since startMark and endMark. + * + * The startMark argument may identify any existing PerformanceMark in the the Performance Timeline, or may identify + * any of the timestamp properties provided by the PerformanceNodeTiming class. If the named startMark does not exist, + * then startMark is set to timeOrigin by default. + * + * The endMark argument must identify any existing PerformanceMark in the the Performance Timeline or any of the timestamp + * properties provided by the PerformanceNodeTiming class. If the named endMark does not exist, an error will be thrown. + * @param name + * @param startMark + * @param endMark + */ + measure(name: string, startMark: string, endMark: string): void; + + /** + * An instance of the PerformanceNodeTiming class that provides performance metrics for specific Node.js operational milestones. + */ + readonly nodeTiming: PerformanceNodeTiming; + + /** + * @return the current high resolution millisecond timestamp + */ + now(): number; + + /** + * The timeOrigin specifies the high resolution millisecond timestamp from which all performance metric durations are measured. + */ + readonly timeOrigin: number; + + /** + * Wraps a function within a new function that measures the running time of the wrapped function. + * A PerformanceObserver must be subscribed to the 'function' event type in order for the timing details to be accessed. + * @param fn + */ + timerify any>(fn: T): T; + } + + export interface PerformanceObserverEntryList { + /** + * @return a list of PerformanceEntry objects in chronological order with respect to performanceEntry.startTime. + */ + getEntries(): PerformanceEntry[]; + + /** + * @return a list of PerformanceEntry objects in chronological order with respect to performanceEntry.startTime + * whose performanceEntry.name is equal to name, and optionally, whose performanceEntry.entryType is equal to type. + */ + getEntriesByName(name: string, type?: string): PerformanceEntry[]; + + /** + * @return Returns a list of PerformanceEntry objects in chronological order with respect to performanceEntry.startTime + * whose performanceEntry.entryType is equal to type. + */ + getEntriesByType(type: string): PerformanceEntry[]; + } + + export type PerformanceObserverCallback = (list: PerformanceObserverEntryList, observer: PerformanceObserver) => void; + + export class PerformanceObserver { + constructor(callback: PerformanceObserverCallback); + + /** + * Disconnects the PerformanceObserver instance from all notifications. + */ + disconnect(): void; + + /** + * Subscribes the PerformanceObserver instance to notifications of new PerformanceEntry instances identified by options.entryTypes. + * When options.buffered is false, the callback will be invoked once for every PerformanceEntry instance. + * Property buffered defaults to false. + * @param options + */ + observe(options: { entryTypes: string[], buffered?: boolean }): void; + } + + export namespace constants { + export const NODE_PERFORMANCE_GC_MAJOR: number; + export const NODE_PERFORMANCE_GC_MINOR: number; + export const NODE_PERFORMANCE_GC_INCREMENTAL: number; + export const NODE_PERFORMANCE_GC_WEAKCB: number; + } + + const performance: Performance; +} \ No newline at end of file diff --git a/src/typings/vscode-textmate.d.ts b/src/typings/vscode-textmate.d.ts index 2237194fac..be13184027 100644 --- a/src/typings/vscode-textmate.d.ts +++ b/src/typings/vscode-textmate.d.ts @@ -23,13 +23,16 @@ declare module "vscode-textmate" { readonly name?: string; readonly settings: IRawThemeSetting[]; } + export interface Thenable extends PromiseLike { + } /** * A registry helper that can locate grammar file paths given scope names. */ export interface RegistryOptions { theme?: IRawTheme; - getFilePath(scopeName: string): string; + loadGrammar(scopeName: string): Thenable; getInjections?(scopeName: string): string[]; + getOnigLib?(): Thenable; } /** * A map from scope name to a language id. Please do not use language id 0. @@ -38,10 +41,10 @@ declare module "vscode-textmate" { [scopeName: string]: number; } /** - * A map from scope name to a token type. + * A map from selectors to token types. */ export interface ITokenTypeMap { - [scopeName: string]: StandardTokenType; + [selector: string]: StandardTokenType; } export const enum StandardTokenType { Other = 0, @@ -72,25 +75,25 @@ declare module "vscode-textmate" { * Load the grammar for `scopeName` and all referenced included grammars asynchronously. * Please do not use language id 0. */ - loadGrammarWithEmbeddedLanguages(initialScopeName: string, initialLanguage: number, embeddedLanguages: IEmbeddedLanguagesMap, callback: (err: any, grammar: IGrammar) => void): void; + loadGrammarWithEmbeddedLanguages(initialScopeName: string, initialLanguage: number, embeddedLanguages: IEmbeddedLanguagesMap): Thenable; /** * Load the grammar for `scopeName` and all referenced included grammars asynchronously. * Please do not use language id 0. */ - loadGrammarWithConfiguration(initialScopeName: string, initialLanguage: number, configuration: IGrammarConfiguration, callback: (err: any, grammar: IGrammar) => void): void; + loadGrammarWithConfiguration(initialScopeName: string, initialLanguage: number, configuration: IGrammarConfiguration): Thenable; /** * Load the grammar for `scopeName` and all referenced included grammars asynchronously. */ - loadGrammar(initialScopeName: string, callback: (err: any, grammar: IGrammar) => void): void; - private _loadGrammar(initialScopeName, callback); + loadGrammar(initialScopeName: string): Thenable; + private _loadGrammar(initialScopeName, initialLanguage, embeddedLanguages, tokenTypes); /** - * Load the grammar at `path` synchronously. + * Adds a rawGrammar. */ - loadGrammarFromPathSync(path: string, initialLanguage?: number, embeddedLanguages?: IEmbeddedLanguagesMap): IGrammar; + addGrammar(rawGrammar: IRawGrammar, injections?: string[], initialLanguage?: number, embeddedLanguages?: IEmbeddedLanguagesMap): Thenable; /** - * Get the grammar for `scopeName`. The grammar must first be created via `loadGrammar` or `loadGrammarFromPathSync`. + * Get the grammar for `scopeName`. The grammar must first be created via `loadGrammar` or `addGrammar`. */ - grammarForScopeName(scopeName: string, initialLanguage?: number, embeddedLanguages?: IEmbeddedLanguagesMap, tokenTypes?: ITokenTypeMap): IGrammar; + grammarForScopeName(scopeName: string, initialLanguage?: number, embeddedLanguages?: IEmbeddedLanguagesMap, tokenTypes?: ITokenTypeMap): Thenable; } /** * A grammar @@ -179,4 +182,75 @@ declare module "vscode-textmate" { equals(other: StackElement): boolean; } export const INITIAL: StackElement; + export const parseRawGrammar: (content: string, filePath: string) => IRawGrammar; + export interface ILocation { + readonly filename: string; + readonly line: number; + readonly char: number; + } + export interface ILocatable { + readonly $vscodeTextmateLocation?: ILocation; + } + export interface IRawGrammar extends ILocatable { + repository: IRawRepository; + readonly scopeName: string; + readonly patterns: IRawRule[]; + readonly injections?: { + [expression: string]: IRawRule; + }; + readonly injectionSelector?: string; + readonly fileTypes?: string[]; + readonly name?: string; + readonly firstLineMatch?: string; + } + export interface IRawRepositoryMap { + [name: string]: IRawRule; + $self: IRawRule; + $base: IRawRule; + } + export type IRawRepository = IRawRepositoryMap & ILocatable; + export interface IRawRule extends ILocatable { + id?: number; + readonly include?: string; + readonly name?: string; + readonly contentName?: string; + readonly match?: string; + readonly captures?: IRawCaptures; + readonly begin?: string; + readonly beginCaptures?: IRawCaptures; + readonly end?: string; + readonly endCaptures?: IRawCaptures; + readonly while?: string; + readonly whileCaptures?: IRawCaptures; + readonly patterns?: IRawRule[]; + readonly repository?: IRawRepository; + readonly applyEndPatternLast?: boolean; + } + export interface IRawCapturesMap { + [captureId: string]: IRawRule; + } + export type IRawCaptures = IRawCapturesMap & ILocatable; + export interface IOnigLib { + createOnigScanner(sources: string[]): OnigScanner; + createOnigString(sources: string): OnigString; + } + export interface IOnigCaptureIndex { + start: number; + end: number; + length: number; + } + export interface IOnigMatch { + index: number; + captureIndices: IOnigCaptureIndex[]; + scanner: OnigScanner; + } + export interface OnigScanner { + findNextMatchSync(string: string | OnigString, startPosition: number): IOnigMatch; + } + export interface OnigString { + readonly content: string; + readonly dispose?: () => void; + } + + } diff --git a/src/typings/vscode-xterm.d.ts b/src/typings/vscode-xterm.d.ts index 2bbcfac4f8..b3a6c367c6 100644 --- a/src/typings/vscode-xterm.d.ts +++ b/src/typings/vscode-xterm.d.ts @@ -13,6 +13,11 @@ declare module 'vscode-xterm' { */ export type FontWeight = 'normal' | 'bold' | '100' | '200' | '300' | '400' | '500' | '600' | '700' | '800' | '900'; + /** + * A string representing a renderer type. + */ + export type RendererType = 'dom' | 'canvas'; + /** * An object containing start up options for the terminal. */ @@ -54,6 +59,11 @@ declare module 'vscode-xterm' { */ disableStdin?: boolean; + /** + * Whether to draw bold text in bright colors. The default is true. + */ + drawBoldTextInBrightColors?: boolean; + /** * Whether to enable the rendering of bold text. * @@ -61,6 +71,24 @@ declare module 'vscode-xterm' { */ enableBold?: boolean; + /** + * What character atlas implementation to use. The character atlas caches drawn characters, + * speeding up rendering significantly. However, it can introduce some minor rendering + * artifacts. + * + * - 'none': Don't use an atlas. + * - 'static': Generate an atlas when the terminal starts or is reconfigured. This atlas will + * only contain ASCII characters in 16 colors. + * - 'dynamic': Generate an atlas using a LRU cache as characters are requested. Limited to + * ASCII characters (for now), but supports 256 colors. For characters covered by the static + * cache, it's slightly slower in comparison, since there's more overhead involved in + * managing the cache. + * + * Currently defaults to 'static'. This option may be removed in the future. If it is, passed + * parameters will be ignored. + */ + experimentalCharAtlas?: 'none' | 'static' | 'dynamic'; + /** * The font size used to render text. */ @@ -96,6 +124,32 @@ declare module 'vscode-xterm' { */ macOptionIsMeta?: boolean; + /** + * Whether holding a modifier key will force normal selection behavior, + * regardless of whether the terminal is in mouse events mode. This will + * also prevent mouse events from being emitted by the terminal. For example, + * this allows you to use xterm.js' regular selection inside tmux with + * mouse mode enabled. + */ + macOptionClickForcesSelection?: boolean; + + /** + * (EXPERIMENTAL) The type of renderer to use, this allows using the + * fallback DOM renderer when canvas is too slow for the environment. The + * following features do not work when the DOM renderer is used: + * + * - Links + * - Line height + * - Letter spacing + * - Cursor blink + * - Cursor style + * + * This option is marked as experiemental because it will eventually be + * moved to an addon. You can only set this option in the constructor (not + * setOption). + */ + rendererType?: RendererType; + /** * Whether to select the word under the cursor on right click, this is * standard behavior in a lot of macOS applications. @@ -251,7 +305,7 @@ declare module 'vscode-xterm' { /** * The class that represents an xterm.js terminal. */ - export class Terminal implements IEventEmitter { + export class Terminal implements IEventEmitter, IDisposable { /** * The element containing the terminal. */ @@ -451,8 +505,16 @@ declare module 'vscode-xterm' { */ selectLines(start: number, end: number): void; + /* + * Disposes of the terminal, detaching it from the DOM and removing any + * active listeners. + */ + dispose(): void; + /** * Destroys the terminal and detaches it from the DOM. + * + * @deprecated Use dispose() instead. */ destroy(): void; @@ -499,7 +561,7 @@ declare module 'vscode-xterm' { * Retrieves an option's value from the terminal. * @param key The option key. */ - getOption(key: 'bellSound' | 'bellStyle' | 'cursorStyle' | 'fontFamily' | 'fontWeight' | 'fontWeightBold' | 'termName'): string; + getOption(key: 'bellSound' | 'bellStyle' | 'cursorStyle' | 'fontFamily' | 'fontWeight' | 'fontWeightBold' | 'rendererType' | 'termName'): string; /** * Retrieves an option's value from the terminal. * @param key The option key. @@ -617,19 +679,40 @@ declare module 'vscode-xterm' { // Modifications to official .d.ts below declare module 'vscode-xterm' { - interface Terminal { + interface TerminalCore { + debug: boolean; + buffer: { y: number; ybase: number; ydisp: number; x: number; + lines: any[]; + + translateBufferLineToString(lineIndex: number, trimRight: boolean): string; }; + send(text: string): void; + /** * Emit an event on the terminal. */ emit(type: string, data: any): void; + charMeasure?: { height: number, width: number }; + + renderer: { + _renderLayers: any[]; + onIntersectionChange: any; + }; + } + + interface Terminal { + _core: TerminalCore; + + webLinksInit(handler?: (event: MouseEvent, uri: string) => void, options?: ILinkMatcherOptions): void; + winptyCompatInit(): void; + /** * Find the next instance of the term, then scroll to and select it. If it * doesn't exist, do nothing. @@ -645,9 +728,5 @@ declare module 'vscode-xterm' { * @return Whether a result was found. */ findPrevious(term: string): boolean; - - webLinksInit(handler?: (event: MouseEvent, uri: string) => void, options?: ILinkMatcherOptions): void; - winptyCompatInit(): void; - charMeasure?: { height: number, width: number }; } } diff --git a/src/vs/base/browser/browser.ts b/src/vs/base/browser/browser.ts index 7215885c8a..d304951913 100644 --- a/src/vs/base/browser/browser.ts +++ b/src/vs/base/browser/browser.ts @@ -157,8 +157,19 @@ export const isSafari = (userAgent.indexOf('Chrome') === -1) && (userAgent.index export const isIPad = (userAgent.indexOf('iPad') >= 0); export const isEdgeWebView = isEdge && (userAgent.indexOf('WebView/') >= 0); -export const isChromev56 = ( - userAgent.indexOf('Chrome/56.') >= 0 - // Edge likes to impersonate Chrome sometimes - && userAgent.indexOf('Edge/') === -1 -); +export function hasClipboardSupport() { + if (isIE) { + return false; + } + + if (isEdge) { + let index = userAgent.indexOf('Edge/'); + let version = parseInt(userAgent.substring(index + 5, userAgent.indexOf('.', index)), 10); + + if (!version || (version >= 12 && version <= 16)) { + return false; + } + } + + return true; +} \ No newline at end of file diff --git a/src/vs/base/browser/builder.ts b/src/vs/base/browser/builder.ts index d58c74d905..b5dcb79765 100644 --- a/src/vs/base/browser/builder.ts +++ b/src/vs/base/browser/builder.ts @@ -5,9 +5,8 @@ 'use strict'; import 'vs/css!./builder'; -import { TPromise } from 'vs/base/common/winjs.base'; import * as types from 'vs/base/common/types'; -import { IDisposable, dispose } from 'vs/base/common/lifecycle'; +import { IDisposable, dispose, toDisposable } from 'vs/base/common/lifecycle'; import * as strings from 'vs/base/common/strings'; import * as assert from 'vs/base/common/assert'; import * as DOM from 'vs/base/browser/dom'; @@ -70,8 +69,8 @@ export class Builder implements IDisposable { private offdom: boolean; private container: HTMLElement; private createdElements: HTMLElement[]; - private toUnbind: { [type: string]: IDisposable[]; }; - private captureToUnbind: { [type: string]: IDisposable[]; }; + private toDispose: { [type: string]: IDisposable[]; }; + private captureToDispose: { [type: string]: IDisposable[]; }; constructor(element?: HTMLElement, offdom?: boolean) { this.offdom = offdom; @@ -81,27 +80,27 @@ export class Builder implements IDisposable { this.currentElement = element; this.createdElements = []; - this.toUnbind = {}; - this.captureToUnbind = {}; + this.toDispose = {}; + this.captureToDispose = {}; } /** * Returns a new builder that lets the current HTML Element of this builder be the container * for future additions on the builder. */ - public asContainer(): Builder { + asContainer(): Builder { return withBuilder(this, this.offdom); } /** * Clones the builder providing the same properties as this one. */ - public clone(): Builder { + clone(): Builder { let builder = new Builder(this.container, this.offdom); builder.currentElement = this.currentElement; builder.createdElements = this.createdElements; - builder.captureToUnbind = this.captureToUnbind; - builder.toUnbind = this.toUnbind; + builder.captureToDispose = this.captureToDispose; + builder.toDispose = this.toDispose; return builder; } @@ -113,9 +112,9 @@ export class Builder implements IDisposable { * at the end. * This method is a no-op unless the builder was created with the offdom option to be true. */ - public build(container?: Builder, index?: number): Builder; - public build(container?: HTMLElement, index?: number): Builder; - public build(container?: any, index?: number): Builder { + build(container?: Builder, index?: number): Builder; + build(container?: HTMLElement, index?: number): Builder; + build(container?: any, index?: number): Builder { assert.ok(this.offdom, 'This builder was not created off-dom, so build() can not be called.'); // Use builders own container if present @@ -154,9 +153,9 @@ export class Builder implements IDisposable { * attached the current element. If the current element has a parent, it will be * detached from that parent. */ - public appendTo(container?: Builder, index?: number): Builder; - public appendTo(container?: HTMLElement, index?: number): Builder; - public appendTo(container?: any, index?: number): Builder { + appendTo(container?: Builder, index?: number): Builder; + appendTo(container?: HTMLElement, index?: number): Builder; + appendTo(container?: any, index?: number): Builder { // Use builders own container if present if (!container) { @@ -194,9 +193,9 @@ export class Builder implements IDisposable { * of the return value being the builder which called the operation (`a` in the * first case; `b` in the second case). */ - public append(child: HTMLElement, index?: number): Builder; - public append(child: Builder, index?: number): Builder; - public append(child: any, index?: number): Builder { + append(child: HTMLElement, index?: number): Builder; + append(child: Builder, index?: number): Builder; + append(child: any, index?: number): Builder { assert.ok(child, 'Need a child to append'); if (DOM.isHTMLElement(child)) { @@ -213,7 +212,7 @@ export class Builder implements IDisposable { /** * Removes the current element of this builder from its parent node. */ - public offDOM(): Builder { + offDOM(): Builder { if (this.currentElement.parentNode) { this.currentElement.parentNode.removeChild(this.currentElement); } @@ -224,14 +223,14 @@ export class Builder implements IDisposable { /** * Returns the HTML Element the builder is currently active on. */ - public getHTMLElement(): HTMLElement { + getHTMLElement(): HTMLElement { return this.currentElement; } /** * Returns the HTML Element the builder is building in. */ - public getContainer(): HTMLElement { + getContainer(): HTMLElement { return this.container; } @@ -245,7 +244,7 @@ export class Builder implements IDisposable { * of the element. The function will be called with a new builder created with the * provided element. */ - public div(attributes?: any, fn?: (builder: Builder) => void): Builder { + div(attributes?: any, fn?: (builder: Builder) => void): Builder { return this.doElement('div', attributes, fn); } @@ -257,7 +256,7 @@ export class Builder implements IDisposable { * of the element. The function will be called with a new builder created with the * provided element. */ - public p(attributes?: any, fn?: (builder: Builder) => void): Builder { + p(attributes?: any, fn?: (builder: Builder) => void): Builder { return this.doElement('p', attributes, fn); } @@ -269,7 +268,7 @@ export class Builder implements IDisposable { * of the element. The function will be called with a new builder created with the * provided element. */ - public ul(attributes?: any, fn?: (builder: Builder) => void): Builder { + ul(attributes?: any, fn?: (builder: Builder) => void): Builder { return this.doElement('ul', attributes, fn); } @@ -281,7 +280,7 @@ export class Builder implements IDisposable { * of the element. The function will be called with a new builder created with the * provided element. */ - public li(attributes?: any, fn?: (builder: Builder) => void): Builder { + li(attributes?: any, fn?: (builder: Builder) => void): Builder { return this.doElement('li', attributes, fn); } @@ -293,7 +292,7 @@ export class Builder implements IDisposable { * of the element. The function will be called with a new builder created with the * provided element. */ - public span(attributes?: any, fn?: (builder: Builder) => void): Builder { + span(attributes?: any, fn?: (builder: Builder) => void): Builder { return this.doElement('span', attributes, fn); } @@ -305,7 +304,7 @@ export class Builder implements IDisposable { * of the element. The function will be called with a new builder created with the * provided element. */ - public img(attributes?: any, fn?: (builder: Builder) => void): Builder { + img(attributes?: any, fn?: (builder: Builder) => void): Builder { return this.doElement('img', attributes, fn); } @@ -317,7 +316,7 @@ export class Builder implements IDisposable { * of the element. The function will be called with a new builder created with the * provided element. */ - public a(attributes?: any, fn?: (builder: Builder) => void): Builder { + a(attributes?: any, fn?: (builder: Builder) => void): Builder { return this.doElement('a', attributes, fn); } @@ -329,7 +328,7 @@ export class Builder implements IDisposable { * of the element. The function will be called with a new builder created with the * provided element. */ - public element(name: string, attributes?: any, fn?: (builder: Builder) => void): Builder { + element(name: string, attributes?: any, fn?: (builder: Builder) => void): Builder { return this.doElement(name, attributes, fn); } @@ -371,7 +370,7 @@ export class Builder implements IDisposable { /** * Calls focus() on the current HTML element; */ - public domFocus(): Builder { + domFocus(): Builder { this.currentElement.focus(); return this; @@ -380,7 +379,7 @@ export class Builder implements IDisposable { /** * Calls blur() on the current HTML element; */ - public domBlur(): Builder { + domBlur(): Builder { this.currentElement.blur(); return this; @@ -389,14 +388,14 @@ export class Builder implements IDisposable { /** * Registers listener on event types on the current element. */ - public on(type: string, fn: (e: E, builder: Builder, unbind: IDisposable) => void, listenerToUnbindContainer?: IDisposable[], useCapture?: boolean): Builder; - public on(typeArray: string[], fn: (e: E, builder: Builder, unbind: IDisposable) => void, listenerToUnbindContainer?: IDisposable[], useCapture?: boolean): Builder; - public on(arg1: any, fn: (e: E, builder: Builder, unbind: IDisposable) => void, listenerToUnbindContainer?: IDisposable[], useCapture?: boolean): Builder { + on(type: string, fn: (e: E, builder: Builder, unbind: IDisposable) => void, listenerToDisposeContainer?: IDisposable[], useCapture?: boolean): Builder; + on(typeArray: string[], fn: (e: E, builder: Builder, unbind: IDisposable) => void, listenerToDisposeContainer?: IDisposable[], useCapture?: boolean): Builder; + on(arg1: any, fn: (e: E, builder: Builder, unbind: IDisposable) => void, listenerToDisposeContainer?: IDisposable[], useCapture?: boolean): Builder { // Event Type Array if (types.isArray(arg1)) { arg1.forEach((type: string) => { - this.on(type, fn, listenerToUnbindContainer, useCapture); + this.on(type, fn, listenerToDisposeContainer, useCapture); }); } @@ -411,15 +410,15 @@ export class Builder implements IDisposable { // Remember for off() use if (useCapture) { - if (!this.captureToUnbind[type]) { - this.captureToUnbind[type] = []; + if (!this.captureToDispose[type]) { + this.captureToDispose[type] = []; } - this.captureToUnbind[type].push(unbind); + this.captureToDispose[type].push(unbind); } else { - if (!this.toUnbind[type]) { - this.toUnbind[type] = []; + if (!this.toDispose[type]) { + this.toDispose[type] = []; } - this.toUnbind[type].push(unbind); + this.toDispose[type].push(unbind); } // Bind to Element @@ -428,8 +427,8 @@ export class Builder implements IDisposable { this.setProperty(LISTENER_BINDING_ID, listenerBinding); // Add to Array if passed in - if (listenerToUnbindContainer && types.isArray(listenerToUnbindContainer)) { - listenerToUnbindContainer.push(unbind); + if (listenerToDisposeContainer && types.isArray(listenerToDisposeContainer)) { + listenerToDisposeContainer.push(unbind); } } @@ -439,9 +438,9 @@ export class Builder implements IDisposable { /** * Removes all listeners from all elements created by the builder for the given event type. */ - public off(type: string, useCapture?: boolean): Builder; - public off(typeArray: string[], useCapture?: boolean): Builder; - public off(arg1: any, useCapture?: boolean): Builder { + off(type: string, useCapture?: boolean): Builder; + off(typeArray: string[], useCapture?: boolean): Builder; + off(arg1: any, useCapture?: boolean): Builder { // Event Type Array if (types.isArray(arg1)) { @@ -454,12 +453,12 @@ export class Builder implements IDisposable { else { let type = arg1; if (useCapture) { - if (this.captureToUnbind[type]) { - this.captureToUnbind[type] = dispose(this.captureToUnbind[type]); + if (this.captureToDispose[type]) { + this.captureToDispose[type] = dispose(this.captureToDispose[type]); } } else { - if (this.toUnbind[type]) { - this.toUnbind[type] = dispose(this.toUnbind[type]); + if (this.toDispose[type]) { + this.toDispose[type] = dispose(this.toDispose[type]); } } } @@ -481,9 +480,9 @@ export class Builder implements IDisposable { * Registers listener on event types on the current element and removes * them after first invocation. */ - public once(type: string, fn: (e: E, builder: Builder, unbind: IDisposable) => void, listenerToUnbindContainer?: IDisposable[], useCapture?: boolean): Builder; - public once(typesArray: string[], fn: (e: E, builder: Builder, unbind: IDisposable) => void, listenerToUnbindContainer?: IDisposable[], useCapture?: boolean): Builder; - public once(arg1: any, fn: (e: E, builder: Builder, unbind: IDisposable) => void, listenerToUnbindContainer?: IDisposable[], useCapture?: boolean): Builder { + once(type: string, fn: (e: E, builder: Builder, unbind: IDisposable) => void, listenerToDisposeContainer?: IDisposable[], useCapture?: boolean): Builder; + once(typesArray: string[], fn: (e: E, builder: Builder, unbind: IDisposable) => void, listenerToDisposeContainer?: IDisposable[], useCapture?: boolean): Builder; + once(arg1: any, fn: (e: E, builder: Builder, unbind: IDisposable) => void, listenerToDisposeContainer?: IDisposable[], useCapture?: boolean): Builder { // Event Type Array if (types.isArray(arg1)) { @@ -503,8 +502,8 @@ export class Builder implements IDisposable { }, useCapture || false); // Add to Array if passed in - if (listenerToUnbindContainer && types.isArray(listenerToUnbindContainer)) { - listenerToUnbindContainer.push(unbind); + if (listenerToDisposeContainer && types.isArray(listenerToDisposeContainer)) { + listenerToDisposeContainer.push(unbind); } } @@ -520,12 +519,12 @@ export class Builder implements IDisposable { * c) an object literal passed in will apply the properties of the literal as attributes * to the current element of the builder. */ - public attr(name: string): string; - public attr(name: string, value: string): Builder; - public attr(name: string, value: boolean): Builder; - public attr(name: string, value: number): Builder; - public attr(attributes: any): Builder; - public attr(firstP: any, secondP?: any): any { + attr(name: string): string; + attr(name: string, value: string): Builder; + attr(name: string, value: boolean): Builder; + attr(name: string, value: number): Builder; + attr(attributes: any): Builder; + attr(firstP: any, secondP?: any): any { // Apply Object Literal to Attributes of Element if (types.isObject(firstP)) { @@ -574,14 +573,14 @@ export class Builder implements IDisposable { /** * Removes an attribute by the given name. */ - public removeAttribute(prop: string): void { + removeAttribute(prop: string): void { this.currentElement.removeAttribute(prop); } /** * Sets the id attribute to the value provided for the current HTML element of the builder. */ - public id(id: string): Builder { + id(id: string): Builder { this.currentElement.setAttribute('id', id); return this; @@ -590,7 +589,7 @@ export class Builder implements IDisposable { /** * Sets the title attribute to the value provided for the current HTML element of the builder. */ - public title(title: string): Builder { + title(title: string): Builder { this.currentElement.setAttribute('title', title); return this; @@ -599,7 +598,7 @@ export class Builder implements IDisposable { /** * Sets the type attribute to the value provided for the current HTML element of the builder. */ - public type(type: string): Builder { + type(type: string): Builder { this.currentElement.setAttribute('type', type); return this; @@ -608,7 +607,7 @@ export class Builder implements IDisposable { /** * Sets the value attribute to the value provided for the current HTML element of the builder. */ - public value(value: string): Builder { + value(value: string): Builder { this.currentElement.setAttribute('value', value); return this; @@ -617,7 +616,7 @@ export class Builder implements IDisposable { /** * Sets the tabindex attribute to the value provided for the current HTML element of the builder. */ - public tabindex(index: number): Builder { + tabindex(index: number): Builder { this.currentElement.setAttribute('tabindex', index.toString()); return this; @@ -633,10 +632,10 @@ export class Builder implements IDisposable { * c) an object literal passed in will apply the properties of the literal as styles * to the current element of the builder. */ - public style(name: string): string; - public style(name: string, value: string): Builder; - public style(attributes: any): Builder; - public style(firstP: any, secondP?: any): any { + style(name: string): string; + style(name: string, value: string): Builder; + style(attributes: any): Builder; + style(firstP: any, secondP?: any): any { // Apply Object Literal to Styles of Element if (types.isObject(firstP)) { @@ -702,14 +701,14 @@ export class Builder implements IDisposable { /** * Returns the computed CSS style for the current HTML element of the builder. */ - public getComputedStyle(): CSSStyleDeclaration { + getComputedStyle(): CSSStyleDeclaration { return DOM.getComputedStyle(this.currentElement); } /** * Adds the variable list of arguments as class names to the current HTML element of the builder. */ - public addClass(...classes: string[]): Builder { + addClass(...classes: string[]): Builder { classes.forEach((nameValue: string) => { let names = nameValue.split(' '); names.forEach((name: string) => { @@ -724,7 +723,7 @@ export class Builder implements IDisposable { * Sets the class name of the current HTML element of the builder to the provided className. * If shouldAddClass is provided - for true class is added, for false class is removed. */ - public setClass(className: string, shouldAddClass: boolean = null): Builder { + setClass(className: string, shouldAddClass: boolean = null): Builder { if (shouldAddClass === null) { this.currentElement.className = className; } else if (shouldAddClass) { @@ -739,14 +738,14 @@ export class Builder implements IDisposable { /** * Returns whether the current HTML element of the builder has the provided class assigned. */ - public hasClass(className: string): boolean { + hasClass(className: string): boolean { return DOM.hasClass(this.currentElement, className); } /** * Removes the variable list of arguments as class names from the current HTML element of the builder. */ - public removeClass(...classes: string[]): Builder { + removeClass(...classes: string[]): Builder { classes.forEach((nameValue: string) => { let names = nameValue.split(' '); names.forEach((name: string) => { @@ -760,7 +759,7 @@ export class Builder implements IDisposable { /** * Adds or removes the provided className for the current HTML element of the builder. */ - public toggleClass(className: string): Builder { + toggleClass(className: string): Builder { if (this.hasClass(className)) { this.removeClass(className); } else { @@ -773,7 +772,7 @@ export class Builder implements IDisposable { /** * Sets the CSS property color. */ - public color(color: string): Builder { + color(color: string): Builder { this.currentElement.style.color = color; return this; @@ -782,10 +781,10 @@ export class Builder implements IDisposable { /** * Sets the CSS property padding. */ - public padding(padding: string): Builder; - public padding(top: number, right?: number, bottom?: number, left?: number): Builder; - public padding(top: string, right?: string, bottom?: string, left?: string): Builder; - public padding(top: any, right?: any, bottom?: any, left?: any): Builder { + padding(padding: string): Builder; + padding(top: number, right?: number, bottom?: number, left?: number): Builder; + padding(top: string, right?: string, bottom?: string, left?: string): Builder; + padding(top: any, right?: any, bottom?: any, left?: any): Builder { if (types.isString(top) && top.indexOf(' ') >= 0) { return this.padding.apply(this, top.split(' ')); } @@ -812,10 +811,10 @@ export class Builder implements IDisposable { /** * Sets the CSS property margin. */ - public margin(margin: string): Builder; - public margin(top: number, right?: number, bottom?: number, left?: number): Builder; - public margin(top: string, right?: string, bottom?: string, left?: string): Builder; - public margin(top: any, right?: any, bottom?: any, left?: any): Builder { + margin(margin: string): Builder; + margin(top: number, right?: number, bottom?: number, left?: number): Builder; + margin(top: string, right?: string, bottom?: string, left?: string): Builder; + margin(top: any, right?: any, bottom?: any, left?: any): Builder { if (types.isString(top) && top.indexOf(' ') >= 0) { return this.margin.apply(this, top.split(' ')); } @@ -842,10 +841,10 @@ export class Builder implements IDisposable { /** * Sets the CSS property position. */ - public position(position: string): Builder; - public position(top: number, right?: number, bottom?: number, left?: number, position?: string): Builder; - public position(top: string, right?: string, bottom?: string, left?: string, position?: string): Builder; - public position(top: any, right?: any, bottom?: any, left?: any, position?: string): Builder { + position(position: string): Builder; + position(top: number, right?: number, bottom?: number, left?: number, position?: string): Builder; + position(top: string, right?: string, bottom?: string, left?: string, position?: string): Builder; + position(top: any, right?: any, bottom?: any, left?: any, position?: string): Builder { if (types.isString(top) && top.indexOf(' ') >= 0) { return this.position.apply(this, top.split(' ')); } @@ -878,10 +877,10 @@ export class Builder implements IDisposable { /** * Sets the CSS property size. */ - public size(size: string): Builder; - public size(width: number, height?: number): Builder; - public size(width: string, height?: string): Builder; - public size(width: any, height?: any): Builder { + size(size: string): Builder; + size(width: number, height?: number): Builder; + size(width: string, height?: string): Builder; + size(width: any, height?: any): Builder { if (types.isString(width) && width.indexOf(' ') >= 0) { return this.size.apply(this, width.split(' ')); } @@ -900,7 +899,7 @@ export class Builder implements IDisposable { /** * Sets the CSS property display. */ - public display(display: string): Builder { + display(display: string): Builder { this.currentElement.style.display = display; return this; @@ -909,7 +908,7 @@ export class Builder implements IDisposable { /** * Shows the current element of the builder. */ - public show(): Builder { + show(): Builder { if (this.hasClass('monaco-builder-hidden')) { this.removeClass('monaco-builder-hidden'); } @@ -917,7 +916,7 @@ export class Builder implements IDisposable { this.attr('aria-hidden', 'false'); // Cancel any pending showDelayed() invocation - this.cancelVisibilityPromise(); + this.cancelVisibilityTimeout(); return this; } @@ -929,18 +928,18 @@ export class Builder implements IDisposable { * only show the element when a specific delay is reached (e.g. for a long running * operation. */ - public showDelayed(delay: number): Builder { + showDelayed(delay: number): Builder { // Cancel any pending showDelayed() invocation - this.cancelVisibilityPromise(); + this.cancelVisibilityTimeout(); - let promise = TPromise.timeout(delay); - this.setProperty(VISIBILITY_BINDING_ID, promise); - - promise.done(() => { + // Install new delay for showing + const handle = setTimeout(() => { this.removeProperty(VISIBILITY_BINDING_ID); this.show(); - }); + }, delay); + + this.setProperty(VISIBILITY_BINDING_ID, toDisposable(() => clearTimeout(handle))); return this; } @@ -948,14 +947,14 @@ export class Builder implements IDisposable { /** * Hides the current element of the builder. */ - public hide(): Builder { + hide(): Builder { if (!this.hasClass('monaco-builder-hidden')) { this.addClass('monaco-builder-hidden'); } this.attr('aria-hidden', 'true'); // Cancel any pending showDelayed() invocation - this.cancelVisibilityPromise(); + this.cancelVisibilityTimeout(); return this; } @@ -963,14 +962,14 @@ export class Builder implements IDisposable { /** * Returns true if the current element of the builder is hidden. */ - public isHidden(): boolean { + isHidden(): boolean { return this.hasClass('monaco-builder-hidden') || this.currentElement.style.display === 'none'; } - private cancelVisibilityPromise(): void { - let promise: TPromise = this.getProperty(VISIBILITY_BINDING_ID); - if (promise) { - promise.cancel(); + private cancelVisibilityTimeout(): void { + const visibilityDisposable = this.getProperty(VISIBILITY_BINDING_ID) as IDisposable; + if (visibilityDisposable) { + visibilityDisposable.dispose(); this.removeProperty(VISIBILITY_BINDING_ID); } } @@ -986,7 +985,7 @@ export class Builder implements IDisposable { /** * Sets the innerHTML attribute. */ - public innerHtml(html: string, append?: boolean): Builder { + innerHtml(html: string, append?: boolean): Builder { if (append) { this.currentElement.innerHTML += html; } else { @@ -1000,7 +999,7 @@ export class Builder implements IDisposable { * Sets the textContent property of the element. * All HTML special characters will be escaped. */ - public text(text: string, append?: boolean): Builder { + text(text: string, append?: boolean): Builder { if (append) { // children is child Elements versus childNodes includes textNodes if (this.currentElement.children.length === 0) { @@ -1021,14 +1020,14 @@ export class Builder implements IDisposable { /** * Sets the innerHTML attribute in escaped form. */ - public safeInnerHtml(html: string, append?: boolean): Builder { + safeInnerHtml(html: string, append?: boolean): Builder { return this.innerHtml(strings.escape(html), append); } /** * Allows to store arbritary data into the current element. */ - public setProperty(key: string, value: any): Builder { + setProperty(key: string, value: any): Builder { setPropertyOnElement(this.currentElement, key, value); return this; @@ -1037,14 +1036,14 @@ export class Builder implements IDisposable { /** * Allows to get arbritary data from the current element. */ - public getProperty(key: string, fallback?: any): any { + getProperty(key: string, fallback?: any): any { return getPropertyFromElement(this.currentElement, key, fallback); } /** * Removes a property from the current element that is stored under the given key. */ - public removeProperty(key: string): Builder { + removeProperty(key: string): Builder { if (hasData(this.currentElement)) { delete data(this.currentElement)[key]; } @@ -1055,7 +1054,7 @@ export class Builder implements IDisposable { /** * Returns a new builder with the child at the given index. */ - public child(index = 0): Builder { + child(index = 0): Builder { let children = this.currentElement.children; return withElement(children.item(index)); @@ -1095,7 +1094,7 @@ export class Builder implements IDisposable { * event listners registered and also clear any data binding and properties stored * to any child element. */ - public empty(): Builder { + empty(): Builder { this.unbindDescendants(this.currentElement); this.clearChildren(); @@ -1110,7 +1109,7 @@ export class Builder implements IDisposable { /** * Removes all HTML elements from the current element of the builder. */ - public clearChildren(): Builder { + clearChildren(): Builder { // Remove Elements if (this.currentElement) { @@ -1124,7 +1123,7 @@ export class Builder implements IDisposable { * Removes the current HTML element and all its children from its parent and unbinds * all listeners and properties set to the data slots. */ - public destroy(): void { + destroy(): void { if (this.currentElement) { @@ -1154,15 +1153,15 @@ export class Builder implements IDisposable { let type: string; - for (type in this.toUnbind) { - if (this.toUnbind.hasOwnProperty(type) && types.isArray(this.toUnbind[type])) { - this.toUnbind[type] = dispose(this.toUnbind[type]); + for (type in this.toDispose) { + if (this.toDispose.hasOwnProperty(type) && types.isArray(this.toDispose[type])) { + this.toDispose[type] = dispose(this.toDispose[type]); } } - for (type in this.captureToUnbind) { - if (this.captureToUnbind.hasOwnProperty(type) && types.isArray(this.captureToUnbind[type])) { - this.captureToUnbind[type] = dispose(this.captureToUnbind[type]); + for (type in this.captureToDispose) { + if (this.captureToDispose.hasOwnProperty(type) && types.isArray(this.captureToDispose[type])) { + this.captureToDispose[type] = dispose(this.captureToDispose[type]); } } @@ -1171,22 +1170,22 @@ export class Builder implements IDisposable { this.container = null; this.offdom = null; this.createdElements = null; - this.captureToUnbind = null; - this.toUnbind = null; + this.captureToDispose = null; + this.toDispose = null; } /** * Removes the current HTML element and all its children from its parent and unbinds * all listeners and properties set to the data slots. */ - public dispose(): void { + dispose(): void { this.destroy(); } /** * Gets the size (in pixels) of an element, including the margin. */ - public getTotalSize(): DOM.Dimension { + getTotalSize(): DOM.Dimension { let totalWidth = DOM.getTotalWidth(this.currentElement); let totalHeight = DOM.getTotalHeight(this.currentElement); @@ -1196,7 +1195,7 @@ export class Builder implements IDisposable { /** * Another variant of getting the inner dimensions of an element. */ - public getClientArea(): DOM.Dimension { + getClientArea(): DOM.Dimension { return DOM.getClientArea(this.currentElement); } } @@ -1207,7 +1206,7 @@ export class Builder implements IDisposable { */ export class MultiBuilder extends Builder { - public length: number; + length: number; private builders: Builder[]; @@ -1288,11 +1287,11 @@ export class MultiBuilder extends Builder { } } - public item(i: number): Builder { + item(i: number): Builder { return this.builders[i]; } - public push(...items: Builder[]): void { + push(...items: Builder[]): void { for (let i = 0; i < items.length; i++) { this.builders.push(items[i]); } @@ -1300,7 +1299,7 @@ export class MultiBuilder extends Builder { this.length = this.builders.length; } - public clone(): MultiBuilder { + clone(): MultiBuilder { return new MultiBuilder(this); } } diff --git a/src/vs/base/browser/contextmenu.ts b/src/vs/base/browser/contextmenu.ts index 35ac0f0d9b..5be2f4dfc8 100644 --- a/src/vs/base/browser/contextmenu.ts +++ b/src/vs/base/browser/contextmenu.ts @@ -4,10 +4,11 @@ *--------------------------------------------------------------------------------------------*/ 'use strict'; -import { IAction, IActionRunner, Action } from 'vs/base/common/actions'; +import { IAction, IActionRunner } from 'vs/base/common/actions'; import { IActionItem } from 'vs/base/browser/ui/actionbar/actionbar'; import { TPromise } from 'vs/base/common/winjs.base'; import { ResolvedKeybinding } from 'vs/base/common/keyCodes'; +import { SubmenuAction } from 'vs/base/browser/ui/menu/menu'; export interface IEvent { shiftKey?: boolean; @@ -16,9 +17,9 @@ export interface IEvent { metaKey?: boolean; } -export class ContextSubMenu extends Action { +export class ContextSubMenu extends SubmenuAction { constructor(label: string, public entries: (ContextSubMenu | IAction)[]) { - super('contextsubmenu', label, '', true); + super(label, entries, 'contextsubmenu'); } } diff --git a/src/vs/base/browser/dnd.ts b/src/vs/base/browser/dnd.ts index 73f0f36a77..05b66d3281 100644 --- a/src/vs/base/browser/dnd.ts +++ b/src/vs/base/browser/dnd.ts @@ -5,19 +5,20 @@ 'use strict'; -import { IDisposable, dispose } from 'vs/base/common/lifecycle'; +import { Disposable } from 'vs/base/common/lifecycle'; import { addDisposableListener } from 'vs/base/browser/dom'; /** * A helper that will execute a provided function when the provided HTMLElement receives * dragover event for 800ms. If the drag is aborted before, the callback will not be triggered. */ -export class DelayedDragHandler { - private toDispose: IDisposable[] = []; +export class DelayedDragHandler extends Disposable { private timeout: number; constructor(container: HTMLElement, callback: () => void) { - this.toDispose.push(addDisposableListener(container, 'dragover', () => { + super(); + + this._register(addDisposableListener(container, 'dragover', () => { if (!this.timeout) { this.timeout = setTimeout(() => { callback(); @@ -28,7 +29,7 @@ export class DelayedDragHandler { })); ['dragleave', 'drop', 'dragend'].forEach(type => { - this.toDispose.push(addDisposableListener(container, type, () => { + this._register(addDisposableListener(container, type, () => { this.clearDragTimeout(); })); }); @@ -41,8 +42,9 @@ export class DelayedDragHandler { } } - public dispose(): void { - this.toDispose = dispose(this.toDispose); + dispose(): void { + super.dispose(); + this.clearDragTimeout(); } } @@ -70,3 +72,15 @@ export const DataTransfers = { */ TEXT: 'text/plain' }; + +export function applyDragImage(event: DragEvent, label: string, clazz: string): void { + const dragImage = document.createElement('div'); + dragImage.className = clazz; + dragImage.textContent = label; + + document.body.appendChild(dragImage); + event.dataTransfer.setDragImage(dragImage, -10, -10); + + // Removes the element when the DND operation is done + setTimeout(() => document.body.removeChild(dragImage), 0); +} \ No newline at end of file diff --git a/src/vs/base/browser/dom.ts b/src/vs/base/browser/dom.ts index bc41b74fce..fe2fa50c49 100644 --- a/src/vs/base/browser/dom.ts +++ b/src/vs/base/browser/dom.ts @@ -539,7 +539,6 @@ const sizeUtils = { getMarginBottom: function (element: HTMLElement): number { return getDimension(element, 'margin-bottom', 'marginBottom'); }, - __commaSentinel: false }; @@ -635,11 +634,11 @@ export function getDomNodePagePosition(domNode: HTMLElement): IDomNodePagePositi } export interface IStandardWindow { - scrollX: number; - scrollY: number; + readonly scrollX: number; + readonly scrollY: number; } -export const StandardWindow: IStandardWindow = new class { +export const StandardWindow: IStandardWindow = new class implements IStandardWindow { get scrollX(): number { if (typeof window.scrollX === 'number') { // modern browsers @@ -724,14 +723,22 @@ export function isAncestor(testChild: Node, testAncestor: Node): boolean { return false; } -export function findParentWithClass(node: HTMLElement, clazz: string, stopAtClazz?: string): HTMLElement { +export function findParentWithClass(node: HTMLElement, clazz: string, stopAtClazzOrNode?: string | HTMLElement): HTMLElement { while (node) { if (hasClass(node, clazz)) { return node; } - if (stopAtClazz && hasClass(node, stopAtClazz)) { - return null; + if (stopAtClazzOrNode) { + if (typeof stopAtClazzOrNode === 'string') { + if (hasClass(node, stopAtClazzOrNode)) { + return null; + } + } else { + if (node === stopAtClazzOrNode) { + return null; + } + } } node = node.parentNode; @@ -812,6 +819,8 @@ export const EventType = { MOUSE_OVER: 'mouseover', MOUSE_MOVE: 'mousemove', MOUSE_OUT: 'mouseout', + MOUSE_ENTER: 'mouseenter', + MOUSE_LEAVE: 'mouseleave', CONTEXT_MENU: 'contextmenu', WHEEL: 'wheel', // Keyboard @@ -831,6 +840,8 @@ export const EventType = { SUBMIT: 'submit', RESET: 'reset', FOCUS: 'focus', + FOCUS_IN: 'focusin', + FOCUS_OUT: 'focusout', BLUR: 'blur', INPUT: 'input', // Local Storage @@ -979,7 +990,7 @@ export function $(description: string, attrs?: { [key: st Object.keys(attrs || {}).forEach(name => { if (/^on\w+$/.test(name)) { - result[name] = attrs[name]; + (result)[name] = attrs[name]; } else if (name === 'selected') { const value = attrs[name]; if (value) { diff --git a/src/vs/base/browser/event.ts b/src/vs/base/browser/event.ts index f8507db827..f969447dd7 100644 --- a/src/vs/base/browser/event.ts +++ b/src/vs/base/browser/event.ts @@ -2,113 +2,14 @@ * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -'use strict'; -import { Event as _Event, Emitter, mapEvent } from 'vs/base/common/event'; +import { Event, Emitter, mapEvent } from 'vs/base/common/event'; export type EventHandler = HTMLElement | HTMLDocument | Window; export interface IDomEvent { - (element: EventHandler, type: 'MSContentZoom', useCapture?: boolean): _Event; - (element: EventHandler, type: 'MSGestureChange', useCapture?: boolean): _Event; - (element: EventHandler, type: 'MSGestureDoubleTap', useCapture?: boolean): _Event; - (element: EventHandler, type: 'MSGestureEnd', useCapture?: boolean): _Event; - (element: EventHandler, type: 'MSGestureHold', useCapture?: boolean): _Event; - (element: EventHandler, type: 'MSGestureStart', useCapture?: boolean): _Event; - (element: EventHandler, type: 'MSGestureTap', useCapture?: boolean): _Event; - (element: EventHandler, type: 'MSGotPointerCapture', useCapture?: boolean): _Event; - (element: EventHandler, type: 'MSInertiaStart', useCapture?: boolean): _Event; - (element: EventHandler, type: 'MSLostPointerCapture', useCapture?: boolean): _Event; - (element: EventHandler, type: 'MSPointerCancel', useCapture?: boolean): _Event; - (element: EventHandler, type: 'MSPointerDown', useCapture?: boolean): _Event; - (element: EventHandler, type: 'MSPointerEnter', useCapture?: boolean): _Event; - (element: EventHandler, type: 'MSPointerLeave', useCapture?: boolean): _Event; - (element: EventHandler, type: 'MSPointerMove', useCapture?: boolean): _Event; - (element: EventHandler, type: 'MSPointerOut', useCapture?: boolean): _Event; - (element: EventHandler, type: 'MSPointerOver', useCapture?: boolean): _Event; - (element: EventHandler, type: 'MSPointerUp', useCapture?: boolean): _Event; - (element: EventHandler, type: 'abort', useCapture?: boolean): _Event; - (element: EventHandler, type: 'activate', useCapture?: boolean): _Event; - (element: EventHandler, type: 'beforeactivate', useCapture?: boolean): _Event; - (element: EventHandler, type: 'beforecopy', useCapture?: boolean): _Event; - (element: EventHandler, type: 'beforecut', useCapture?: boolean): _Event; - (element: EventHandler, type: 'beforedeactivate', useCapture?: boolean): _Event; - (element: EventHandler, type: 'beforepaste', useCapture?: boolean): _Event; - (element: EventHandler, type: 'blur', useCapture?: boolean): _Event; - (element: EventHandler, type: 'canplay', useCapture?: boolean): _Event; - (element: EventHandler, type: 'canplaythrough', useCapture?: boolean): _Event; - (element: EventHandler, type: 'change', useCapture?: boolean): _Event; - (element: EventHandler, type: 'click', useCapture?: boolean): _Event; - (element: EventHandler, type: 'contextmenu', useCapture?: boolean): _Event; - (element: EventHandler, type: 'copy', useCapture?: boolean): _Event; - (element: EventHandler, type: 'cuechange', useCapture?: boolean): _Event; - (element: EventHandler, type: 'cut', useCapture?: boolean): _Event; - (element: EventHandler, type: 'dblclick', useCapture?: boolean): _Event; - (element: EventHandler, type: 'deactivate', useCapture?: boolean): _Event; - (element: EventHandler, type: 'drag', useCapture?: boolean): _Event; - (element: EventHandler, type: 'dragend', useCapture?: boolean): _Event; - (element: EventHandler, type: 'dragenter', useCapture?: boolean): _Event; - (element: EventHandler, type: 'dragleave', useCapture?: boolean): _Event; - (element: EventHandler, type: 'dragover', useCapture?: boolean): _Event; - (element: EventHandler, type: 'dragstart', useCapture?: boolean): _Event; - (element: EventHandler, type: 'drop', useCapture?: boolean): _Event; - (element: EventHandler, type: 'durationchange', useCapture?: boolean): _Event; - (element: EventHandler, type: 'emptied', useCapture?: boolean): _Event; - (element: EventHandler, type: 'ended', useCapture?: boolean): _Event; - (element: EventHandler, type: 'error', useCapture?: boolean): _Event; - (element: EventHandler, type: 'focus', useCapture?: boolean): _Event; - (element: EventHandler, type: 'gotpointercapture', useCapture?: boolean): _Event; - (element: EventHandler, type: 'input', useCapture?: boolean): _Event; - (element: EventHandler, type: 'keydown', useCapture?: boolean): _Event; - (element: EventHandler, type: 'keypress', useCapture?: boolean): _Event; - (element: EventHandler, type: 'keyup', useCapture?: boolean): _Event; - (element: EventHandler, type: 'load', useCapture?: boolean): _Event; - (element: EventHandler, type: 'loadeddata', useCapture?: boolean): _Event; - (element: EventHandler, type: 'loadedmetadata', useCapture?: boolean): _Event; - (element: EventHandler, type: 'loadstart', useCapture?: boolean): _Event; - (element: EventHandler, type: 'lostpointercapture', useCapture?: boolean): _Event; - (element: EventHandler, type: 'mousedown', useCapture?: boolean): _Event; - (element: EventHandler, type: 'mouseenter', useCapture?: boolean): _Event; - (element: EventHandler, type: 'mouseleave', useCapture?: boolean): _Event; - (element: EventHandler, type: 'mousemove', useCapture?: boolean): _Event; - (element: EventHandler, type: 'mouseout', useCapture?: boolean): _Event; - (element: EventHandler, type: 'mouseover', useCapture?: boolean): _Event; - (element: EventHandler, type: 'mouseup', useCapture?: boolean): _Event; - (element: EventHandler, type: 'mousewheel', useCapture?: boolean): _Event; - (element: EventHandler, type: 'paste', useCapture?: boolean): _Event; - (element: EventHandler, type: 'pause', useCapture?: boolean): _Event; - (element: EventHandler, type: 'play', useCapture?: boolean): _Event; - (element: EventHandler, type: 'playing', useCapture?: boolean): _Event; - (element: EventHandler, type: 'pointercancel', useCapture?: boolean): _Event; - (element: EventHandler, type: 'pointerdown', useCapture?: boolean): _Event; - (element: EventHandler, type: 'pointerenter', useCapture?: boolean): _Event; - (element: EventHandler, type: 'pointerleave', useCapture?: boolean): _Event; - (element: EventHandler, type: 'pointermove', useCapture?: boolean): _Event; - (element: EventHandler, type: 'pointerout', useCapture?: boolean): _Event; - (element: EventHandler, type: 'pointerover', useCapture?: boolean): _Event; - (element: EventHandler, type: 'pointerup', useCapture?: boolean): _Event; - (element: EventHandler, type: 'progress', useCapture?: boolean): _Event; - (element: EventHandler, type: 'ratechange', useCapture?: boolean): _Event; - (element: EventHandler, type: 'reset', useCapture?: boolean): _Event; - (element: EventHandler, type: 'scroll', useCapture?: boolean): _Event; - (element: EventHandler, type: 'seeked', useCapture?: boolean): _Event; - (element: EventHandler, type: 'seeking', useCapture?: boolean): _Event; - (element: EventHandler, type: 'select', useCapture?: boolean): _Event; - (element: EventHandler, type: 'selectstart', useCapture?: boolean): _Event; - (element: EventHandler, type: 'stalled', useCapture?: boolean): _Event; - (element: EventHandler, type: 'submit', useCapture?: boolean): _Event; - (element: EventHandler, type: 'suspend', useCapture?: boolean): _Event; - (element: EventHandler, type: 'timeupdate', useCapture?: boolean): _Event; - (element: EventHandler, type: 'touchcancel', useCapture?: boolean): _Event; - (element: EventHandler, type: 'touchend', useCapture?: boolean): _Event; - (element: EventHandler, type: 'touchmove', useCapture?: boolean): _Event; - (element: EventHandler, type: 'touchstart', useCapture?: boolean): _Event; - (element: EventHandler, type: 'volumechange', useCapture?: boolean): _Event; - (element: EventHandler, type: 'waiting', useCapture?: boolean): _Event; - (element: EventHandler, type: 'webkitfullscreenchange', useCapture?: boolean): _Event; - (element: EventHandler, type: 'webkitfullscreenerror', useCapture?: boolean): _Event; - (element: EventHandler, type: 'wheel', useCapture?: boolean): _Event; - (element: EventHandler, type: string, useCapture?: boolean): _Event; + (element: EventHandler, type: K, useCapture?: boolean): Event; + (element: EventHandler, type: string, useCapture?: boolean): Event; } export const domEvent: IDomEvent = (element: EventHandler, type: string, useCapture?: boolean) => { @@ -130,7 +31,7 @@ export interface CancellableEvent { stopPropagation(); } -export function stop(event: _Event): _Event { +export function stop(event: Event): Event { return mapEvent(event, e => { e.preventDefault(); e.stopPropagation(); diff --git a/src/vs/base/browser/history.ts b/src/vs/base/browser/history.ts new file mode 100644 index 0000000000..9b2c0933d7 --- /dev/null +++ b/src/vs/base/browser/history.ts @@ -0,0 +1,12 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the Source EULA. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +export interface IHistoryNavigationWidget { + + showPreviousValue(); + + showNextValue(); + +} \ No newline at end of file diff --git a/src/vs/base/browser/ui/actionbar/actionbar.css b/src/vs/base/browser/ui/actionbar/actionbar.css index d8fd30e8f7..105837066a 100644 --- a/src/vs/base/browser/ui/actionbar/actionbar.css +++ b/src/vs/base/browser/ui/actionbar/actionbar.css @@ -53,8 +53,8 @@ } .monaco-action-bar .action-label { - font-size: 12px; - margin-right: 0.3em; + font-size: 11px; + margin-right: 4px; } .monaco-action-bar .action-label.octicon { @@ -104,5 +104,7 @@ flex: 1; max-width: 170px; min-width: 60px; - margin-right: 10px; + display: flex; + align-items: center; + justify-content: center; } \ No newline at end of file diff --git a/src/vs/base/browser/ui/actionbar/actionbar.ts b/src/vs/base/browser/ui/actionbar/actionbar.ts index fa77684556..d3f51a4ba6 100644 --- a/src/vs/base/browser/ui/actionbar/actionbar.ts +++ b/src/vs/base/browser/ui/actionbar/actionbar.ts @@ -11,7 +11,7 @@ import * as nls from 'vs/nls'; import * as lifecycle from 'vs/base/common/lifecycle'; import { TPromise } from 'vs/base/common/winjs.base'; import { Builder, $ } from 'vs/base/browser/builder'; -import { SelectBox } from 'vs/base/browser/ui/selectBox/selectBox'; +import { SelectBox, ISelectBoxOptions } from 'vs/base/browser/ui/selectBox/selectBox'; import { IAction, IActionRunner, Action, IActionChangeEvent, ActionRunner, IRunEvent } from 'vs/base/common/actions'; import * as DOM from 'vs/base/browser/dom'; import * as types from 'vs/base/common/types'; @@ -154,7 +154,7 @@ export class BaseActionItem implements IActionItem { DOM.EventHelper.stop(event, true); let context: any; - if (types.isUndefinedOrNull(this._context)) { + if (types.isUndefinedOrNull(this._context) || !types.isObject(this._context)) { context = event; } else { context = this._context; @@ -167,12 +167,14 @@ export class BaseActionItem implements IActionItem { public focus(): void { if (this.builder) { this.builder.domFocus(); + this.builder.addClass('focused'); } } public blur(): void { if (this.builder) { this.builder.domBlur(); + this.builder.removeClass('focused'); } } @@ -372,7 +374,6 @@ export class ActionBar implements IActionRunner { // Items public items: IActionItem[]; - private focusedItem: number; private focusTracker: DOM.IFocusTracker; @@ -487,7 +488,7 @@ export class ActionBar implements IActionRunner { this.actionsList = document.createElement('ul'); this.actionsList.className = 'actions-container'; if (this.options.isMenu) { - this.actionsList.setAttribute('role', 'menubar'); + this.actionsList.setAttribute('role', 'menu'); } else { this.actionsList.setAttribute('role', 'toolbar'); } @@ -495,6 +496,39 @@ export class ActionBar implements IActionRunner { this.actionsList.setAttribute('aria-label', this.options.ariaLabel); } + if (this.options.isMenu) { + this.domNode.tabIndex = 0; + + $(this.domNode).on(DOM.EventType.MOUSE_OUT, (e) => { + let relatedTarget = (e as MouseEvent).relatedTarget as HTMLElement; + if (!DOM.isAncestor(relatedTarget, this.domNode)) { + this.focusedItem = undefined; + this.updateFocus(); + e.stopPropagation(); + } + }); + + $(this.actionsList).on(DOM.EventType.MOUSE_OVER, (e) => { + let target = e.target as HTMLElement; + if (!target || !DOM.isAncestor(target, this.actionsList) || target === this.actionsList) { + return; + } + + while (target.parentElement !== this.actionsList) { + target = target.parentElement; + } + + if (DOM.hasClass(target, 'action-item')) { + const lastFocusedItem = this.focusedItem; + this.setFocusedItem(target); + + if (lastFocusedItem !== this.focusedItem) { + this.updateFocus(); + } + } + }); + } + this.domNode.appendChild(this.actionsList); container.appendChild(this.domNode); @@ -524,6 +558,16 @@ export class ActionBar implements IActionRunner { } } + private setFocusedItem(element: HTMLElement): void { + for (let i = 0; i < this.actionsList.children.length; i++) { + let elem = this.actionsList.children[i]; + if (element === elem) { + this.focusedItem = i; + break; + } + } + } + private updateFocusedItem(): void { for (let i = 0; i < this.actionsList.children.length; i++) { let elem = this.actionsList.children[i]; @@ -591,11 +635,13 @@ export class ActionBar implements IActionRunner { if (index === null || index < 0 || index >= this.actionsList.children.length) { this.actionsList.appendChild(actionItemElement); + this.items.push(item); } else { - this.actionsList.insertBefore(actionItemElement, this.actionsList.children[index++]); + this.actionsList.insertBefore(actionItemElement, this.actionsList.children[index]); + this.items.splice(index, 0, item); + index++; } - this.items.push(item); }); } @@ -637,10 +683,12 @@ export class ActionBar implements IActionRunner { public focus(selectFirst?: boolean): void { if (selectFirst && typeof this.focusedItem === 'undefined') { - this.focusedItem = 0; + // Focus the first enabled item + this.focusedItem = this.items.length - 1; + this.focusNext(); + } else { + this.updateFocus(); } - - this.updateFocus(); } private focusNext(): void { @@ -691,7 +739,6 @@ export class ActionBar implements IActionRunner { private updateFocus(fromRight?: boolean): void { if (typeof this.focusedItem === 'undefined') { this.domNode.focus(); - return; } for (let i = 0; i < this.items.length; i++) { @@ -700,8 +747,12 @@ export class ActionBar implements IActionRunner { let actionItem = item; if (i === this.focusedItem) { - if (types.isFunction(actionItem.focus)) { - actionItem.focus(fromRight); + if (types.isFunction(actionItem.isEnabled)) { + if (actionItem.isEnabled() && types.isFunction(actionItem.focus)) { + actionItem.focus(fromRight); + } else { + this.domNode.focus(); + } } } else { if (types.isFunction(actionItem.blur)) { @@ -757,10 +808,10 @@ export class SelectActionItem extends BaseActionItem { protected selectBox: SelectBox; protected toDispose: lifecycle.IDisposable[]; - constructor(ctx: any, action: IAction, options: string[], selected: number, contextViewProvider: IContextViewProvider + constructor(ctx: any, action: IAction, options: string[], selected: number, contextViewProvider: IContextViewProvider, selectBoxOptions?: ISelectBoxOptions ) { super(ctx, action); - this.selectBox = new SelectBox(options, selected, contextViewProvider); + this.selectBox = new SelectBox(options, selected, contextViewProvider, null, selectBoxOptions); this.toDispose = []; this.toDispose.push(this.selectBox); @@ -806,4 +857,4 @@ export class SelectActionItem extends BaseActionItem { super.dispose(); } -} +} \ No newline at end of file diff --git a/src/vs/base/browser/ui/aria/aria.ts b/src/vs/base/browser/ui/aria/aria.ts index b29add6b6d..db4ffd70e5 100644 --- a/src/vs/base/browser/ui/aria/aria.ts +++ b/src/vs/base/browser/ui/aria/aria.ts @@ -50,13 +50,27 @@ export function status(msg: string): void { } } +let repeatedTimes = 0; +let prevText: string | undefined = undefined; function insertMessage(target: HTMLElement, msg: string): void { if (!ariaContainer) { // console.warn('ARIA support needs a container. Call setARIAContainer() first.'); return; } - if (target.textContent === msg) { - msg = nls.localize('repeated', "{0} (occurred again)", msg); + + if (prevText === msg) { + repeatedTimes++; + } + else { + prevText = msg; + repeatedTimes = 0; + } + + + switch (repeatedTimes) { + case 0: break; + case 1: msg = nls.localize('repeated', "{0} (occurred again)", msg); break; + default: msg = nls.localize('repeatedNtimes', "{0} (occurred {1} times)", msg, repeatedTimes); break; } dom.clearNode(target); diff --git a/src/vs/base/browser/ui/breadcrumbs/breadcrumbsWidget.css b/src/vs/base/browser/ui/breadcrumbs/breadcrumbsWidget.css new file mode 100644 index 0000000000..0f03f3ef6d --- /dev/null +++ b/src/vs/base/browser/ui/breadcrumbs/breadcrumbsWidget.css @@ -0,0 +1,40 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the Source EULA. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +.monaco-breadcrumbs { + user-select: none; + display: flex; + flex-direction: row; + flex-wrap: nowrap; + justify-content: flex-start; + outline-style: none; +} + +.monaco-breadcrumbs .monaco-breadcrumb-item { + display: flex; + align-items: center; + flex: 0 1 auto; + white-space: nowrap; + cursor: pointer; + align-self: center; + height: 100%; + outline: none; +} + +.monaco-breadcrumbs .monaco-breadcrumb-item:not(:first-child)::before { + background-image: url(./collapsed.svg); + opacity: .7; + width: 16px; + height: 16px; + display: inline-block; + background-size: 16px; + background-position: 50% 50%; + content: ' '; +} + +.vs-dark .monaco-breadcrumbs .monaco-breadcrumb-item:not(:first-child)::before { + background-image: url(./collpased-dark.svg); +} + diff --git a/src/vs/base/browser/ui/breadcrumbs/breadcrumbsWidget.ts b/src/vs/base/browser/ui/breadcrumbs/breadcrumbsWidget.ts new file mode 100644 index 0000000000..af2045fae6 --- /dev/null +++ b/src/vs/base/browser/ui/breadcrumbs/breadcrumbsWidget.ts @@ -0,0 +1,304 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the Source EULA. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +'use strict'; + +import 'vs/css!./breadcrumbsWidget'; +import * as dom from 'vs/base/browser/dom'; +import { DomScrollableElement } from 'vs/base/browser/ui/scrollbar/scrollableElement'; +import { ScrollbarVisibility } from 'vs/base/common/scrollable'; +import { IDisposable, dispose } from 'vs/base/common/lifecycle'; +import { IMouseEvent } from 'vs/base/browser/mouseEvent'; +import { Event, Emitter } from 'vs/base/common/event'; +import { Color } from 'vs/base/common/color'; +import { commonPrefixLength } from 'vs/base/common/arrays'; + +export abstract class BreadcrumbsItem { + dispose(): void { } + abstract equals(other: BreadcrumbsItem): boolean; + abstract render(container: HTMLElement): void; +} + +export class SimpleBreadcrumbsItem extends BreadcrumbsItem { + + constructor( + readonly text: string, + readonly title: string = text + ) { + super(); + } + + equals(other: this) { + return other === this || other instanceof SimpleBreadcrumbsItem && other.text === this.text && other.title === this.title; + } + + render(container: HTMLElement): void { + let node = document.createElement('div'); + node.title = this.title; + node.innerText = this.text; + container.appendChild(node); + } +} + +export interface IBreadcrumbsWidgetStyles { + breadcrumbsBackground?: Color; + breadcrumbsForeground?: Color; + breadcrumbsHoverBackground?: Color; + breadcrumbsHoverForeground?: Color; + breadcrumbsFocusForeground?: Color; + breadcrumbsFocusAndSelectionBackground?: Color; + breadcrumbsFocusAndSelectionForeground?: Color; +} + +export interface IBreadcrumbsItemEvent { + type: 'select' | 'focus'; + item: BreadcrumbsItem; + node: HTMLElement; + payload: any; +} + +export class BreadcrumbsWidget { + + private readonly _disposables = new Array(); + private readonly _domNode: HTMLDivElement; + private readonly _styleElement: HTMLStyleElement; + private readonly _scrollable: DomScrollableElement; + + private readonly _onDidSelectItem = new Emitter(); + private readonly _onDidFocusItem = new Emitter(); + private readonly _onDidChangeFocus = new Emitter(); + + readonly onDidSelectItem: Event = this._onDidSelectItem.event; + readonly onDidFocusItem: Event = this._onDidFocusItem.event; + readonly onDidChangeFocus: Event = this._onDidChangeFocus.event; + + private readonly _items = new Array(); + private readonly _nodes = new Array(); + private readonly _freeNodes = new Array(); + + private _focusedItemIdx: number = -1; + private _selectedItemIdx: number = -1; + + constructor( + container: HTMLElement + ) { + this._domNode = document.createElement('div'); + this._domNode.className = 'monaco-breadcrumbs'; + this._domNode.tabIndex = 0; + this._domNode.setAttribute('role', 'list'); + this._scrollable = new DomScrollableElement(this._domNode, { + vertical: ScrollbarVisibility.Hidden, + horizontal: ScrollbarVisibility.Auto, + horizontalScrollbarSize: 3, + useShadows: false + }); + this._disposables.push(this._scrollable); + this._disposables.push(dom.addStandardDisposableListener(this._domNode, 'click', e => this._onClick(e))); + container.appendChild(this._scrollable.getDomNode()); + + this._styleElement = dom.createStyleSheet(this._domNode); + + let focusTracker = dom.trackFocus(this._domNode); + this._disposables.push(focusTracker); + this._disposables.push(focusTracker.onDidBlur(_ => this._onDidChangeFocus.fire(false))); + this._disposables.push(focusTracker.onDidFocus(_ => this._onDidChangeFocus.fire(true))); + } + + dispose(): void { + dispose(this._disposables); + this._domNode.remove(); + this._disposables.length = 0; + this._nodes.length = 0; + this._freeNodes.length = 0; + } + + layout(dim: dom.Dimension): void { + if (dim) { + this._domNode.style.width = `${dim.width}px`; + this._domNode.style.height = `${dim.height}px`; + } + this._scrollable.setRevealOnScroll(false); + this._scrollable.scanDomNode(); + this._scrollable.setRevealOnScroll(true); + } + + style(style: IBreadcrumbsWidgetStyles): void { + let content = ''; + if (style.breadcrumbsBackground) { + content += `.monaco-breadcrumbs { background-color: ${style.breadcrumbsBackground}}`; + } + if (style.breadcrumbsForeground) { + content += `.monaco-breadcrumbs .monaco-breadcrumb-item { color: ${style.breadcrumbsForeground}}\n`; + } + if (style.breadcrumbsFocusForeground) { + content += `.monaco-breadcrumbs .monaco-breadcrumb-item.focused { color: ${style.breadcrumbsFocusForeground}}\n`; + } + if (style.breadcrumbsFocusAndSelectionBackground) { + content += `.monaco-breadcrumbs .monaco-breadcrumb-item.focused.selected { background-color: ${style.breadcrumbsFocusAndSelectionBackground}}\n`; + } + if (style.breadcrumbsFocusAndSelectionForeground) { + content += `.monaco-breadcrumbs .monaco-breadcrumb-item.focused.selected { color: ${style.breadcrumbsFocusAndSelectionForeground}}\n`; + } + if (style.breadcrumbsHoverBackground) { + content += `.monaco-breadcrumbs .monaco-breadcrumb-item:hover:not(.focused):not(.selected) { background-color: ${style.breadcrumbsHoverBackground}}\n`; + } + if (style.breadcrumbsHoverForeground) { + content += `.monaco-breadcrumbs .monaco-breadcrumb-item:hover:not(.focused):not(.selected) { color: ${style.breadcrumbsHoverForeground}}\n`; + } + if (this._styleElement.innerHTML !== content) { + this._styleElement.innerHTML = content; + } + } + + domFocus(): void { + let idx = this._focusedItemIdx >= 0 ? this._focusedItemIdx : this._items.length - 1; + if (idx >= 0 && idx < this._items.length) { + this._focus(idx, undefined); + } else { + this._domNode.focus(); + } + } + + isDOMFocused(): boolean { + let candidate = document.activeElement; + while (candidate) { + if (this._domNode === candidate) { + return true; + } + candidate = candidate.parentElement; + } + return false; + } + + getFocused(): BreadcrumbsItem { + return this._items[this._focusedItemIdx]; + } + + setFocused(item: BreadcrumbsItem, payload?: any): void { + this._focus(this._items.indexOf(item), payload); + } + + focusPrev(payload?: any): any { + if (this._focusedItemIdx > 0) { + this._focus(this._focusedItemIdx - 1, payload); + } + } + + focusNext(payload?: any): any { + if (this._focusedItemIdx + 1 < this._nodes.length) { + this._focus(this._focusedItemIdx + 1, payload); + } + } + + private _focus(nth: number, payload: any): void { + this._focusedItemIdx = -1; + for (let i = 0; i < this._nodes.length; i++) { + const node = this._nodes[i]; + if (i !== nth) { + dom.removeClass(node, 'focused'); + } else { + this._focusedItemIdx = i; + dom.addClass(node, 'focused'); + node.focus(); + } + } + this._reveal(this._focusedItemIdx); + this._onDidFocusItem.fire({ type: 'focus', item: this._items[this._focusedItemIdx], node: this._nodes[this._focusedItemIdx], payload }); + } + + reveal(item: BreadcrumbsItem): void { + let idx = this._items.indexOf(item); + if (idx >= 0) { + this._reveal(idx); + } + } + + private _reveal(nth: number): void { + const node = this._nodes[nth]; + if (node) { + this._scrollable.setRevealOnScroll(false); + this._scrollable.setScrollPosition({ scrollLeft: node.offsetLeft }); + this._scrollable.setRevealOnScroll(true); + } + } + + getSelection(): BreadcrumbsItem { + return this._items[this._selectedItemIdx]; + } + + setSelection(item: BreadcrumbsItem, payload?: any): void { + this._select(this._items.indexOf(item), payload); + } + + private _select(nth: number, payload: any): void { + this._selectedItemIdx = -1; + for (let i = 0; i < this._nodes.length; i++) { + const node = this._nodes[i]; + if (i !== nth) { + dom.removeClass(node, 'selected'); + } else { + this._selectedItemIdx = i; + dom.addClass(node, 'selected'); + } + } + this._onDidSelectItem.fire({ type: 'select', item: this._items[this._selectedItemIdx], node: this._nodes[this._selectedItemIdx], payload }); + } + + getItems(): ReadonlyArray { + return this._items; + } + + setItems(items: BreadcrumbsItem[]): void { + let prefix = commonPrefixLength(this._items, items, (a, b) => a.equals(b)); + let removed = this._items.splice(prefix, this._items.length - prefix, ...items.slice(prefix)); + this._render(prefix); + dispose(removed); + this._focus(-1, undefined); + } + + private _render(start: number): void { + for (; start < this._items.length && start < this._nodes.length; start++) { + let item = this._items[start]; + let node = this._nodes[start]; + this._renderItem(item, node); + } + // case a: more nodes -> remove them + for (; start < this._nodes.length; start++) { + this._nodes[start].remove(); + this._freeNodes.push(this._nodes[start]); + } + this._nodes.length = this._items.length; + + // case b: more items -> render them + for (; start < this._items.length; start++) { + let item = this._items[start]; + let node = this._freeNodes.length > 0 ? this._freeNodes.pop() : document.createElement('div'); + this._renderItem(item, node); + this._domNode.appendChild(node); + this._nodes[start] = node; + } + this.layout(undefined); + } + + private _renderItem(item: BreadcrumbsItem, container: HTMLDivElement): void { + dom.clearNode(container); + container.className = ''; + item.render(container); + container.tabIndex = -1; + container.setAttribute('role', 'listitem'); + dom.addClass(container, 'monaco-breadcrumb-item'); + } + + private _onClick(event: IMouseEvent): void { + for (let el = event.target; el; el = el.parentElement) { + let idx = this._nodes.indexOf(el as any); + if (idx >= 0) { + this._focus(idx, event); + this._select(idx, event); + break; + } + } + } +} diff --git a/src/vs/base/browser/ui/breadcrumbs/collapsed.svg b/src/vs/base/browser/ui/breadcrumbs/collapsed.svg new file mode 100755 index 0000000000..3a63808c35 --- /dev/null +++ b/src/vs/base/browser/ui/breadcrumbs/collapsed.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/vs/base/browser/ui/breadcrumbs/collpased-dark.svg b/src/vs/base/browser/ui/breadcrumbs/collpased-dark.svg new file mode 100755 index 0000000000..cf5c3641aa --- /dev/null +++ b/src/vs/base/browser/ui/breadcrumbs/collpased-dark.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/vs/base/browser/ui/button/button.ts b/src/vs/base/browser/ui/button/button.ts index efc3018e1e..d49e6c2516 100644 --- a/src/vs/base/browser/ui/button/button.ts +++ b/src/vs/base/browser/ui/button/button.ts @@ -13,7 +13,7 @@ import { KeyCode } from 'vs/base/common/keyCodes'; import { Color } from 'vs/base/common/color'; import { mixin } from 'vs/base/common/objects'; import { Event as BaseEvent, Emitter } from 'vs/base/common/event'; -import { dispose, IDisposable } from 'vs/base/common/lifecycle'; +import { Disposable } from 'vs/base/common/lifecycle'; import { Gesture, EventType } from 'vs/base/browser/touch'; export interface IButtonOptions extends IButtonStyles { @@ -33,7 +33,7 @@ const defaultOptions: IButtonStyles = { buttonForeground: Color.white }; -export class Button { +export class Button extends Disposable { // {{SQL CARBON EDIT}} -- changed access modifier to protected protected $el: Builder; @@ -44,12 +44,14 @@ export class Button { private buttonForeground: Color; private buttonBorder: Color; - private _onDidClick = new Emitter(); - readonly onDidClick: BaseEvent = this._onDidClick.event; + private _onDidClick = this._register(new Emitter()); + get onDidClick(): BaseEvent { return this._onDidClick.event; } private focusTracker: DOM.IFocusTracker; constructor(container: HTMLElement, options?: IButtonOptions) { + super(); + this.options = options || Object.create(null); mixin(this.options, defaultOptions, false); @@ -58,10 +60,10 @@ export class Button { this.buttonForeground = this.options.buttonForeground; this.buttonBorder = this.options.buttonBorder; - this.$el = $('a.monaco-button').attr({ + this.$el = this._register($('a.monaco-button').attr({ 'tabIndex': '0', 'role': 'button' - }).appendTo(container); + }).appendTo(container)); Gesture.addTarget(this.$el.getHTMLElement()); @@ -75,7 +77,7 @@ export class Button { }); this.$el.on(DOM.EventType.KEY_DOWN, e => { - let event = new StandardKeyboardEvent(e as KeyboardEvent); + const event = new StandardKeyboardEvent(e as KeyboardEvent); let eventHandled = false; if (this.enabled && event.equals(KeyCode.Enter) || event.equals(KeyCode.Space)) { this._onDidClick.fire(e); @@ -101,9 +103,9 @@ export class Button { }); // Also set hover background when button is focused for feedback - this.focusTracker = DOM.trackFocus(this.$el.getHTMLElement()); - this.focusTracker.onDidFocus(() => this.setHoverBackground()); - this.focusTracker.onDidBlur(() => this.applyStyles()); // restore standard styles + this.focusTracker = this._register(DOM.trackFocus(this.$el.getHTMLElement())); + this._register(this.focusTracker.onDidFocus(() => this.setHoverBackground())); + this._register(this.focusTracker.onDidBlur(() => this.applyStyles())); // restore standard styles this.applyStyles(); } @@ -179,27 +181,13 @@ export class Button { focus(): void { this.$el.domFocus(); } - - dispose(): void { - if (this.$el) { - this.$el.dispose(); - this.$el = null; - - this.focusTracker.dispose(); - this.focusTracker = null; - } - - this._onDidClick.dispose(); - } } -export class ButtonGroup { - private _buttons: Button[]; - private toDispose: IDisposable[]; +export class ButtonGroup extends Disposable { + private _buttons: Button[] = []; constructor(container: HTMLElement, count: number, options?: IButtonOptions) { - this._buttons = []; - this.toDispose = []; + super(); this.create(container, count, options); } @@ -210,9 +198,8 @@ export class ButtonGroup { private create(container: HTMLElement, count: number, options?: IButtonOptions): void { for (let index = 0; index < count; index++) { - const button = new Button(container, options); + const button = this._register(new Button(container, options)); this._buttons.push(button); - this.toDispose.push(button); // Implement keyboard access in buttons if there are multiple if (count > 1) { @@ -238,8 +225,4 @@ export class ButtonGroup { } } } - - dispose(): void { - this.toDispose = dispose(this.toDispose); - } } \ No newline at end of file diff --git a/src/vs/base/browser/ui/centered/centeredViewLayout.ts b/src/vs/base/browser/ui/centered/centeredViewLayout.ts new file mode 100644 index 0000000000..fcf939ac84 --- /dev/null +++ b/src/vs/base/browser/ui/centered/centeredViewLayout.ts @@ -0,0 +1,150 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the Source EULA. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { SplitView, Orientation, ISplitViewStyles, IView as ISplitViewView } from 'vs/base/browser/ui/splitview/splitview'; +import { $ } from 'vs/base/browser/dom'; +import { Event, mapEvent } from 'vs/base/common/event'; +import { IView } from 'vs/base/browser/ui/grid/gridview'; +import { IDisposable, dispose } from 'vs/base/common/lifecycle'; +import { Color } from 'vs/base/common/color'; + +export interface CenteredViewState { + leftMarginRatio: number; + rightMarginRatio: number; +} + +const GOLDEN_RATIO = { + leftMarginRatio: 0.1909, + rightMarginRatio: 0.1909 +}; + +function createEmptyView(background: Color): ISplitViewView { + const element = $('.centered-layout-margin'); + element.style.height = '100%'; + element.style.backgroundColor = background.toString(); + + return { + element, + layout: () => undefined, + minimumSize: 60, + maximumSize: Number.POSITIVE_INFINITY, + onDidChange: Event.None + }; +} + +function toSplitViewView(view: IView, getHeight: () => number): ISplitViewView { + return { + element: view.element, + get maximumSize() { return view.maximumWidth; }, + get minimumSize() { return view.minimumWidth; }, + onDidChange: mapEvent(view.onDidChange, e => e && e.width), + layout: size => view.layout(size, getHeight()) + }; +} + +export interface ICenteredViewStyles extends ISplitViewStyles { + background: Color; +} + +export class CenteredViewLayout { + + private splitView: SplitView; + private width: number = 0; + private height: number = 0; + private style: ICenteredViewStyles; + private didLayout = false; + private emptyViews: ISplitViewView[]; + private splitViewDisposables: IDisposable[] = []; + + constructor(private container: HTMLElement, private view: IView, public readonly state: CenteredViewState = GOLDEN_RATIO) { + this.container.appendChild(this.view.element); + // Make sure to hide the split view overflow like sashes #52892 + this.container.style.overflow = 'hidden'; + } + + get minimumWidth(): number { return this.splitView ? this.splitView.minimumSize : this.view.minimumWidth; } + get maximumWidth(): number { return this.splitView ? this.splitView.maximumSize : this.view.maximumWidth; } + get minimumHeight(): number { return this.view.minimumHeight; } + get maximumHeight(): number { return this.view.maximumHeight; } + + layout(width: number, height: number): void { + this.width = width; + this.height = height; + if (this.splitView) { + this.splitView.layout(width); + if (!this.didLayout) { + this.resizeMargins(); + } + } else { + this.view.layout(width, height); + } + this.didLayout = true; + } + + private resizeMargins(): void { + this.splitView.resizeView(0, this.state.leftMarginRatio * this.width); + this.splitView.resizeView(2, this.state.rightMarginRatio * this.width); + } + + isActive(): boolean { + return !!this.splitView; + } + + styles(style: ICenteredViewStyles): void { + this.style = style; + if (this.splitView) { + this.splitView.style(this.style); + this.emptyViews[0].element.style.backgroundColor = this.style.background.toString(); + this.emptyViews[1].element.style.backgroundColor = this.style.background.toString(); + } + } + + activate(active: boolean): void { + if (active === this.isActive()) { + return; + } + + if (active) { + this.container.removeChild(this.view.element); + this.splitView = new SplitView(this.container, { + inverseAltBehavior: true, + orientation: Orientation.HORIZONTAL, + styles: this.style + }); + + this.splitViewDisposables.push(this.splitView.onDidSashChange(() => { + this.state.leftMarginRatio = this.splitView.getViewSize(0) / this.width; + this.state.rightMarginRatio = this.splitView.getViewSize(2) / this.width; + })); + this.splitViewDisposables.push(this.splitView.onDidSashReset(() => { + this.state.leftMarginRatio = GOLDEN_RATIO.leftMarginRatio; + this.state.rightMarginRatio = GOLDEN_RATIO.rightMarginRatio; + this.resizeMargins(); + })); + + this.splitView.layout(this.width); + this.splitView.addView(toSplitViewView(this.view, () => this.height), 0); + this.emptyViews = [createEmptyView(this.style.background), createEmptyView(this.style.background)]; + this.splitView.addView(this.emptyViews[0], this.state.leftMarginRatio * this.width, 0); + this.splitView.addView(this.emptyViews[1], this.state.rightMarginRatio * this.width, 2); + } else { + this.container.removeChild(this.splitView.el); + this.splitViewDisposables = dispose(this.splitViewDisposables); + this.splitView.dispose(); + this.splitView = undefined; + this.emptyViews = undefined; + this.container.appendChild(this.view.element); + } + } + + dispose(): void { + this.splitViewDisposables = dispose(this.splitViewDisposables); + + if (this.splitView) { + this.splitView.dispose(); + this.splitView = undefined; + } + } +} diff --git a/src/vs/base/browser/ui/checkbox/checkbox.ts b/src/vs/base/browser/ui/checkbox/checkbox.ts index 895633c515..61ca06000b 100644 --- a/src/vs/base/browser/ui/checkbox/checkbox.ts +++ b/src/vs/base/browser/ui/checkbox/checkbox.ts @@ -6,20 +6,18 @@ 'use strict'; import 'vs/css!./checkbox'; - import * as DOM from 'vs/base/browser/dom'; -import * as objects from 'vs/base/common/objects'; -import { KeyCode } from 'vs/base/common/keyCodes'; -import { Widget } from 'vs/base/browser/ui/widget'; import { IKeyboardEvent } from 'vs/base/browser/keyboardEvent'; +import { Widget } from 'vs/base/browser/ui/widget'; import { Color } from 'vs/base/common/color'; +import { Emitter, Event } from 'vs/base/common/event'; +import { KeyCode } from 'vs/base/common/keyCodes'; +import * as objects from 'vs/base/common/objects'; export interface ICheckboxOpts extends ICheckboxStyles { readonly actionClassName: string; readonly title: string; readonly isChecked: boolean; - readonly onChange: (viaKeyboard: boolean) => void; - readonly onKeyDown?: (e: IKeyboardEvent) => void; } export interface ICheckboxStyles { @@ -32,13 +30,20 @@ const defaultOpts = { export class Checkbox extends Widget { + private readonly _onChange = this._register(new Emitter()); + get onChange(): Event { return this._onChange.event; } + + private readonly _onKeyDown = this._register(new Emitter()); + get onKeyDown(): Event { return this._onKeyDown.event; } + private readonly _opts: ICheckboxOpts; - public readonly domNode: HTMLElement; + readonly domNode: HTMLElement; private _checked: boolean; constructor(opts: ICheckboxOpts) { super(); + this._opts = objects.deepClone(opts); objects.mixin(this._opts, defaultOpts, false); this._checked = this._opts.isChecked; @@ -55,37 +60,35 @@ export class Checkbox extends Widget { this.onclick(this.domNode, (ev) => { this.checked = !this._checked; - this._opts.onChange(false); + this._onChange.fire(false); ev.preventDefault(); }); this.onkeydown(this.domNode, (keyboardEvent) => { if (keyboardEvent.keyCode === KeyCode.Space || keyboardEvent.keyCode === KeyCode.Enter) { this.checked = !this._checked; - this._opts.onChange(true); + this._onChange.fire(true); keyboardEvent.preventDefault(); return; } - if (this._opts.onKeyDown) { - this._opts.onKeyDown(keyboardEvent); - } + this._onKeyDown.fire(keyboardEvent); }); } - public get enabled(): boolean { + get enabled(): boolean { return this.domNode.getAttribute('aria-disabled') !== 'true'; } - public focus(): void { + focus(): void { this.domNode.focus(); } - public get checked(): boolean { + get checked(): boolean { return this._checked; } - public set checked(newIsChecked: boolean) { + set checked(newIsChecked: boolean) { this._checked = newIsChecked; this.domNode.setAttribute('aria-checked', String(this._checked)); if (this._checked) { @@ -97,11 +100,11 @@ export class Checkbox extends Widget { this.applyStyles(); } - public width(): number { + width(): number { return 2 /*marginleft*/ + 2 /*border*/ + 2 /*padding*/ + 16 /* icon width */; } - public style(styles: ICheckboxStyles): void { + style(styles: ICheckboxStyles): void { if (styles.inputActiveOptionBorder) { this._opts.inputActiveOptionBorder = styles.inputActiveOptionBorder; } @@ -114,12 +117,12 @@ export class Checkbox extends Widget { } } - public enable(): void { + enable(): void { this.domNode.tabIndex = 0; this.domNode.setAttribute('aria-disabled', String(false)); } - public disable(): void { + disable(): void { DOM.removeTabIndexAndUpdateFocus(this.domNode); this.domNode.setAttribute('aria-disabled', String(true)); } diff --git a/src/vs/base/browser/ui/contextview/contextview.css b/src/vs/base/browser/ui/contextview/contextview.css index 6ef9665c91..4e60a74b52 100644 --- a/src/vs/base/browser/ui/contextview/contextview.css +++ b/src/vs/base/browser/ui/contextview/contextview.css @@ -5,5 +5,5 @@ .context-view { position: absolute; - z-index: 1000; + z-index: 2000; } \ No newline at end of file diff --git a/src/vs/base/browser/ui/contextview/contextview.ts b/src/vs/base/browser/ui/contextview/contextview.ts index 5d0738bedd..4d285e2b4f 100644 --- a/src/vs/base/browser/ui/contextview/contextview.ts +++ b/src/vs/base/browser/ui/contextview/contextview.ts @@ -8,7 +8,7 @@ import 'vs/css!./contextview'; import { Builder, $ } from 'vs/base/browser/builder'; import * as DOM from 'vs/base/browser/dom'; -import { IDisposable, dispose } from 'vs/base/common/lifecycle'; +import { IDisposable, dispose, toDisposable } from 'vs/base/common/lifecycle'; export interface IAnchor { x: number; @@ -54,51 +54,46 @@ export interface ISize { export interface IView extends IPosition, ISize { } -function layout(view: ISize, around: IView, viewport: IView, anchorPosition: AnchorPosition, anchorAlignment: AnchorAlignment): IPosition { +export enum LayoutAnchorPosition { + Before, + After +} - let chooseBiased = (a: number, aIsGood: boolean, b: number, bIsGood: boolean) => { - if (aIsGood) { - return a; +export interface ILayoutAnchor { + offset: number; + size: number; + position: LayoutAnchorPosition; +} + +/** + * Lays out a one dimensional view next to an anchor in a viewport. + * + * @returns The view offset within the viewport. + */ +export function layout(viewportSize: number, viewSize: number, anchor: ILayoutAnchor): number { + const anchorEnd = anchor.offset + anchor.size; + + if (anchor.position === LayoutAnchorPosition.Before) { + if (viewSize <= viewportSize - anchorEnd) { + return anchorEnd; // happy case, lay it out after the anchor } - if (bIsGood) { - return b; + + if (viewSize <= anchor.offset) { + return anchor.offset - viewSize; // ok case, lay it out before the anchor } - return a; - }; - let chooseOne = (a: number, aIsGood: boolean, b: number, bIsGood: boolean, aIsPreferred: boolean) => { - if (aIsPreferred) { - return chooseBiased(a, aIsGood, b, bIsGood); - } else { - return chooseBiased(b, bIsGood, a, aIsGood); + return Math.max(viewportSize - viewSize, 0); // sad case, lay it over the anchor + } else { + if (viewSize <= anchor.offset) { + return anchor.offset - viewSize; // happy case, lay it out before the anchor } - }; - let top = (() => { - // Compute both options (putting the segment above and below) - let posAbove = around.top - view.height; - let posBelow = around.top + around.height; + if (viewSize <= viewportSize - anchorEnd) { + return anchorEnd; // ok case, lay it out after the anchor + } - // Check for both options if they are good - let aboveIsGood = (posAbove >= viewport.top && posAbove + view.height <= viewport.top + viewport.height); - let belowIsGood = (posBelow >= viewport.top && posBelow + view.height <= viewport.top + viewport.height); - - return chooseOne(posAbove, aboveIsGood, posBelow, belowIsGood, anchorPosition === AnchorPosition.ABOVE); - })(); - - let left = (() => { - // Compute both options (aligning left and right) - let posLeft = around.left; - let posRight = around.left + around.width - view.width; - - // Check for both options if they are good - let leftIsGood = (posLeft >= viewport.left && posLeft + view.width <= viewport.left + viewport.width); - let rightIsGood = (posRight >= viewport.left && posRight + view.width <= viewport.left + viewport.width); - - return chooseOne(posLeft, leftIsGood, posRight, rightIsGood, anchorAlignment === AnchorAlignment.LEFT); - })(); - - return { top: top, left: left }; + return 0; // sad case, lay it over the anchor + } } export class ContextView { @@ -116,11 +111,9 @@ export class ContextView { this.$view = $('.context-view').hide(); this.setContainer(container); - this.toDispose = [{ - dispose: () => { - this.setContainer(null); - } - }]; + this.toDispose = [toDisposable(() => { + this.setContainer(null); + })]; this.toDisposeOnClean = null; } @@ -207,30 +200,28 @@ export class ContextView { }; } - let viewport = { - top: DOM.StandardWindow.scrollY, - left: DOM.StandardWindow.scrollX, - height: window.innerHeight, - width: window.innerWidth - }; + const viewSize = this.$view.getTotalSize(); + const anchorPosition = this.delegate.anchorPosition || AnchorPosition.BELOW; + const anchorAlignment = this.delegate.anchorAlignment || AnchorAlignment.LEFT; - // Get the view's size - let viewSize = this.$view.getTotalSize(); - let view = { width: viewSize.width, height: viewSize.height }; + const verticalAnchor: ILayoutAnchor = { offset: around.top, size: around.height, position: anchorPosition === AnchorPosition.BELOW ? LayoutAnchorPosition.Before : LayoutAnchorPosition.After }; - let anchorPosition = this.delegate.anchorPosition || AnchorPosition.BELOW; - let anchorAlignment = this.delegate.anchorAlignment || AnchorAlignment.LEFT; + let horizontalAnchor: ILayoutAnchor; - let result = layout(view, around, viewport, anchorPosition, anchorAlignment); + if (anchorAlignment === AnchorAlignment.LEFT) { + horizontalAnchor = { offset: around.left, size: 0, position: LayoutAnchorPosition.Before }; + } else { + horizontalAnchor = { offset: around.left + around.width, size: 0, position: LayoutAnchorPosition.After }; + } - let containerPosition = DOM.getDomNodePagePosition(this.$container.getHTMLElement()); - result.top -= containerPosition.top; - result.left -= containerPosition.left; + const containerPosition = DOM.getDomNodePagePosition(this.$container.getHTMLElement()); + const top = layout(window.innerHeight, viewSize.height, verticalAnchor) - containerPosition.top; + const left = layout(window.innerWidth, viewSize.width, horizontalAnchor) - containerPosition.left; this.$view.removeClass('top', 'bottom', 'left', 'right'); this.$view.addClass(anchorPosition === AnchorPosition.BELOW ? 'bottom' : 'top'); this.$view.addClass(anchorAlignment === AnchorAlignment.LEFT ? 'left' : 'right'); - this.$view.style({ top: result.top + 'px', left: result.left + 'px', width: 'initial' }); + this.$view.style({ top: `${top}px`, left: `${left}px`, width: 'initial' }); } public hide(data?: any): void { diff --git a/src/vs/base/browser/ui/countBadge/countBadge.css b/src/vs/base/browser/ui/countBadge/countBadge.css index f2d1ca86e8..ab7717b041 100644 --- a/src/vs/base/browser/ui/countBadge/countBadge.css +++ b/src/vs/base/browser/ui/countBadge/countBadge.css @@ -4,10 +4,13 @@ *--------------------------------------------------------------------------------------------*/ .monaco-count-badge { - padding: 0.2em 0.5em; + padding: 0.3em 0.5em; border-radius: 1em; font-size: 85%; + min-width: 1.6em; + line-height: 1em; font-weight: normal; text-align: center; - display: inline; + display: inline-block; + box-sizing: border-box; } \ No newline at end of file diff --git a/src/vs/base/browser/ui/dropdown/dropdown.ts b/src/vs/base/browser/ui/dropdown/dropdown.ts index 43bcae1049..54ed0f1162 100644 --- a/src/vs/base/browser/ui/dropdown/dropdown.ts +++ b/src/vs/base/browser/ui/dropdown/dropdown.ts @@ -28,7 +28,8 @@ export interface IBaseDropdownOptions { } export class BaseDropdown extends ActionRunner { - private _toDispose: IDisposable[]; + private _toDispose: IDisposable[] = []; + private $el: Builder; private $boxContainer: Builder; private $label: Builder; @@ -38,8 +39,6 @@ export class BaseDropdown extends ActionRunner { constructor(container: HTMLElement, options: IBaseDropdownOptions) { super(); - this._toDispose = []; - this.$el = $('.monaco-dropdown').appendTo(container); this.$label = $('.dropdown-label'); @@ -66,8 +65,7 @@ export class BaseDropdown extends ActionRunner { } }).appendTo(this.$el); - let cleanupFn = labelRenderer(this.$label.getHTMLElement()); - + const cleanupFn = labelRenderer(this.$label.getHTMLElement()); if (cleanupFn) { this._toDispose.push(cleanupFn); } @@ -75,27 +73,27 @@ export class BaseDropdown extends ActionRunner { Gesture.addTarget(this.$label.getHTMLElement()); } - public get toDispose(): IDisposable[] { + get toDispose(): IDisposable[] { return this._toDispose; } - public get element(): HTMLElement { + get element(): HTMLElement { return this.$el.getHTMLElement(); } - public get label(): HTMLElement { + get label(): HTMLElement { return this.$label.getHTMLElement(); } - public set tooltip(tooltip: string) { + set tooltip(tooltip: string) { this.$label.title(tooltip); } - public show(): void { + show(): void { this.visible = true; } - public hide(): void { + hide(): void { this.visible = false; } @@ -103,7 +101,7 @@ export class BaseDropdown extends ActionRunner { this.hide(); } - public dispose(): void { + dispose(): void { super.dispose(); this.hide(); @@ -139,7 +137,7 @@ export class Dropdown extends BaseDropdown { this.contextViewProvider = options.contextViewProvider; } - public show(): void { + show(): void { super.show(); addClass(this.element, 'active'); @@ -167,7 +165,7 @@ export class Dropdown extends BaseDropdown { removeClass(this.element, 'active'); } - public hide(): void { + hide(): void { super.hide(); if (this.contextViewProvider) { @@ -211,11 +209,11 @@ export class DropdownMenu extends BaseDropdown { this.menuClassName = options.menuClassName || ''; } - public set menuOptions(options: IMenuOptions) { + set menuOptions(options: IMenuOptions) { this._menuOptions = options; } - public get menuOptions(): IMenuOptions { + get menuOptions(): IMenuOptions { return this._menuOptions; } @@ -231,7 +229,7 @@ export class DropdownMenu extends BaseDropdown { this._actions = actions; } - public show(): void { + show(): void { super.show(); addClass(this.element, 'active'); @@ -243,14 +241,19 @@ export class DropdownMenu extends BaseDropdown { getActionItem: (action) => this.menuOptions && this.menuOptions.actionItemProvider ? this.menuOptions.actionItemProvider(action) : null, getKeyBinding: (action: IAction) => this.menuOptions && this.menuOptions.getKeyBinding ? this.menuOptions.getKeyBinding(action) : null, getMenuClassName: () => this.menuClassName, - onHide: () => removeClass(this.element, 'active'), + onHide: () => this.onHide(), actionRunner: this.menuOptions ? this.menuOptions.actionRunner : null }); } - public hide(): void { + hide(): void { super.hide(); } + + private onHide(): void { + this.hide(); + removeClass(this.element, 'active'); + } } export class DropdownMenuActionItem extends BaseActionItem { @@ -274,8 +277,8 @@ export class DropdownMenuActionItem extends BaseActionItem { this.clazz = clazz; } - public render(container: HTMLElement): void { - let labelRenderer: ILabelRenderer = (el: HTMLElement): IDisposable => { + render(container: HTMLElement): void { + const labelRenderer: ILabelRenderer = (el: HTMLElement): IDisposable => { this.builder = $('a.action-label').attr({ tabIndex: '0', role: 'button', @@ -289,7 +292,7 @@ export class DropdownMenuActionItem extends BaseActionItem { return null; }; - let options: IDropdownMenuOptions = { + const options: IDropdownMenuOptions = { contextMenuProvider: this.contextMenuProvider, labelRenderer: labelRenderer }; @@ -311,7 +314,7 @@ export class DropdownMenuActionItem extends BaseActionItem { }; } - public setActionContext(newContext: any): void { + setActionContext(newContext: any): void { super.setActionContext(newContext); if (this.dropdownMenu) { @@ -319,13 +322,13 @@ export class DropdownMenuActionItem extends BaseActionItem { } } - public show(): void { + show(): void { if (this.dropdownMenu) { this.dropdownMenu.show(); } } - public dispose(): void { + dispose(): void { this.dropdownMenu.dispose(); super.dispose(); diff --git a/src/vs/base/browser/ui/findinput/findInput.ts b/src/vs/base/browser/ui/findinput/findInput.ts index 0964818575..92c31654e3 100644 --- a/src/vs/base/browser/ui/findinput/findInput.ts +++ b/src/vs/base/browser/ui/findinput/findInput.ts @@ -8,7 +8,7 @@ import 'vs/css!./findInput'; import * as nls from 'vs/nls'; import * as dom from 'vs/base/browser/dom'; -import { IMessage as InputBoxMessage, IInputValidator, InputBox, IInputBoxStyles } from 'vs/base/browser/ui/inputbox/inputBox'; +import { IMessage as InputBoxMessage, IInputValidator, IInputBoxStyles, HistoryInputBox } from 'vs/base/browser/ui/inputbox/inputBox'; import { IContextViewProvider } from 'vs/base/browser/ui/contextview/contextview'; import { Widget } from 'vs/base/browser/ui/widget'; import { Event, Emitter } from 'vs/base/common/event'; @@ -28,6 +28,7 @@ export interface IFindInputOptions extends IFindInputStyles { readonly appendCaseSensitiveLabel?: string; readonly appendWholeWordsLabel?: string; readonly appendRegexLabel?: string; + readonly history?: string[]; } export interface IFindInputStyles extends IInputBoxStyles { @@ -62,7 +63,7 @@ export class FindInput extends Widget { private wholeWords: WholeWordsCheckbox; private caseSensitive: CaseSensitiveCheckbox; public domNode: HTMLElement; - public inputBox: InputBox; + public inputBox: HistoryInputBox; private readonly _onDidOptionChange = this._register(new Emitter()); public readonly onDidOptionChange: Event = this._onDidOptionChange.event; @@ -82,6 +83,9 @@ export class FindInput extends Widget { private _onCaseSensitiveKeyDown = this._register(new Emitter()); public readonly onCaseSensitiveKeyDown: Event = this._onCaseSensitiveKeyDown.event; + private _onRegexKeyDown = this._register(new Emitter()); + public readonly onRegexKeyDown: Event = this._onRegexKeyDown.event; + constructor(parent: HTMLElement, contextViewProvider: IContextViewProvider, options?: IFindInputOptions) { super(); this.contextViewProvider = contextViewProvider; @@ -108,7 +112,7 @@ export class FindInput extends Widget { this.domNode = null; this.inputBox = null; - this.buildDomNode(options.appendCaseSensitiveLabel || '', options.appendWholeWordsLabel || '', options.appendRegexLabel || ''); + this.buildDomNode(options.appendCaseSensitiveLabel || '', options.appendWholeWordsLabel || '', options.appendRegexLabel || '', options.history); if (Boolean(parent)) { parent.appendChild(this.domNode); @@ -247,6 +251,10 @@ export class FindInput extends Widget { this.caseSensitive.focus(); } + public focusOnRegex(): void { + this.regex.focus(); + } + private _lastHighlightFindOptions: number = 0; public highlightFindOptions(): void { dom.removeClass(this.domNode, 'highlight-' + (this._lastHighlightFindOptions)); @@ -259,12 +267,12 @@ export class FindInput extends Widget { this.inputBox.width = w; } - private buildDomNode(appendCaseSensitiveLabel: string, appendWholeWordsLabel: string, appendRegexLabel: string): void { + private buildDomNode(appendCaseSensitiveLabel: string, appendWholeWordsLabel: string, appendRegexLabel: string, history: string[]): void { this.domNode = document.createElement('div'); this.domNode.style.width = this.width + 'px'; dom.addClass(this.domNode, 'monaco-findInput'); - this.inputBox = this._register(new InputBox(this.domNode, this.contextViewProvider, { + this.inputBox = this._register(new HistoryInputBox(this.domNode, this.contextViewProvider, { placeholder: this.placeholder || '', ariaLabel: this.label || '', validationOptions: { @@ -278,51 +286,57 @@ export class FindInput extends Widget { inputValidationWarningBackground: this.inputValidationWarningBackground, inputValidationWarningBorder: this.inputValidationWarningBorder, inputValidationErrorBackground: this.inputValidationErrorBackground, - inputValidationErrorBorder: this.inputValidationErrorBorder + inputValidationErrorBorder: this.inputValidationErrorBorder, + history })); this.regex = this._register(new RegexCheckbox({ appendTitle: appendRegexLabel, isChecked: false, - onChange: (viaKeyboard) => { - this._onDidOptionChange.fire(viaKeyboard); - if (!viaKeyboard) { - this.inputBox.focus(); - } - this.setInputWidth(); - this.validate(); - }, inputActiveOptionBorder: this.inputActiveOptionBorder })); + this._register(this.regex.onChange(viaKeyboard => { + this._onDidOptionChange.fire(viaKeyboard); + if (!viaKeyboard) { + this.inputBox.focus(); + } + this.setInputWidth(); + this.validate(); + })); + this._register(this.regex.onKeyDown(e => { + this._onRegexKeyDown.fire(e); + })); + this.wholeWords = this._register(new WholeWordsCheckbox({ appendTitle: appendWholeWordsLabel, isChecked: false, - onChange: (viaKeyboard) => { - this._onDidOptionChange.fire(viaKeyboard); - if (!viaKeyboard) { - this.inputBox.focus(); - } - this.setInputWidth(); - this.validate(); - }, inputActiveOptionBorder: this.inputActiveOptionBorder })); + this._register(this.wholeWords.onChange(viaKeyboard => { + this._onDidOptionChange.fire(viaKeyboard); + if (!viaKeyboard) { + this.inputBox.focus(); + } + this.setInputWidth(); + this.validate(); + })); + this.caseSensitive = this._register(new CaseSensitiveCheckbox({ appendTitle: appendCaseSensitiveLabel, isChecked: false, - onChange: (viaKeyboard) => { - this._onDidOptionChange.fire(viaKeyboard); - if (!viaKeyboard) { - this.inputBox.focus(); - } - this.setInputWidth(); - this.validate(); - }, - onKeyDown: (e) => { - this._onCaseSensitiveKeyDown.fire(e); - }, inputActiveOptionBorder: this.inputActiveOptionBorder })); + this._register(this.caseSensitive.onChange(viaKeyboard => { + this._onDidOptionChange.fire(viaKeyboard); + if (!viaKeyboard) { + this.inputBox.focus(); + } + this.setInputWidth(); + this.validate(); + })); + this._register(this.caseSensitive.onKeyDown(e => { + this._onCaseSensitiveKeyDown.fire(e); + })); // Arrow-Key support to navigate between options let indexes = [this.caseSensitive.domNode, this.wholeWords.domNode, this.regex.domNode]; diff --git a/src/vs/base/browser/ui/findinput/findInputCheckboxes.ts b/src/vs/base/browser/ui/findinput/findInputCheckboxes.ts index a013b30f65..2f8f66550d 100644 --- a/src/vs/base/browser/ui/findinput/findInputCheckboxes.ts +++ b/src/vs/base/browser/ui/findinput/findInputCheckboxes.ts @@ -4,18 +4,14 @@ *--------------------------------------------------------------------------------------------*/ 'use strict'; -import 'vs/css!./findInputCheckboxes'; - -import * as nls from 'vs/nls'; import { Checkbox } from 'vs/base/browser/ui/checkbox/checkbox'; -import { IKeyboardEvent } from 'vs/base/browser/keyboardEvent'; import { Color } from 'vs/base/common/color'; +import 'vs/css!./findInputCheckboxes'; +import * as nls from 'vs/nls'; export interface IFindInputCheckboxOpts { readonly appendTitle: string; readonly isChecked: boolean; - readonly onChange: (viaKeyboard: boolean) => void; - readonly onKeyDown?: (e: IKeyboardEvent) => void; readonly inputActiveOptionBorder?: Color; } @@ -29,8 +25,6 @@ export class CaseSensitiveCheckbox extends Checkbox { actionClassName: 'monaco-case-sensitive', title: NLS_CASE_SENSITIVE_CHECKBOX_LABEL + opts.appendTitle, isChecked: opts.isChecked, - onChange: opts.onChange, - onKeyDown: opts.onKeyDown, inputActiveOptionBorder: opts.inputActiveOptionBorder }); } @@ -42,8 +36,6 @@ export class WholeWordsCheckbox extends Checkbox { actionClassName: 'monaco-whole-word', title: NLS_WHOLE_WORD_CHECKBOX_LABEL + opts.appendTitle, isChecked: opts.isChecked, - onChange: opts.onChange, - onKeyDown: opts.onKeyDown, inputActiveOptionBorder: opts.inputActiveOptionBorder }); } @@ -55,8 +47,6 @@ export class RegexCheckbox extends Checkbox { actionClassName: 'monaco-regex', title: NLS_REGEX_CHECKBOX_LABEL + opts.appendTitle, isChecked: opts.isChecked, - onChange: opts.onChange, - onKeyDown: opts.onKeyDown, inputActiveOptionBorder: opts.inputActiveOptionBorder }); } diff --git a/src/vs/base/browser/ui/grid/grid.ts b/src/vs/base/browser/ui/grid/grid.ts new file mode 100644 index 0000000000..e1e8bb2e5f --- /dev/null +++ b/src/vs/base/browser/ui/grid/grid.ts @@ -0,0 +1,630 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the Source EULA. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +'use strict'; + +import 'vs/css!./gridview'; +import { Orientation } from 'vs/base/browser/ui/sash/sash'; +import { IDisposable, dispose } from 'vs/base/common/lifecycle'; +import { tail2 as tail } from 'vs/base/common/arrays'; +import { orthogonal, IView, GridView, Sizing as GridViewSizing, Box, IGridViewStyles } from './gridview'; +import { Event } from 'vs/base/common/event'; + +export { Orientation } from './gridview'; + +export enum Direction { + Up, + Down, + Left, + Right +} + +function oppositeDirection(direction: Direction): Direction { + switch (direction) { + case Direction.Up: return Direction.Down; + case Direction.Down: return Direction.Up; + case Direction.Left: return Direction.Right; + case Direction.Right: return Direction.Left; + } +} + +export interface GridLeafNode { + readonly view: T; + readonly box: Box; +} + +export interface GridBranchNode { + readonly children: GridNode[]; + readonly box: Box; +} + +export type GridNode = GridLeafNode | GridBranchNode; + +export function isGridBranchNode(node: GridNode): node is GridBranchNode { + return !!(node as any).children; +} + +function getGridNode(node: GridNode, location: number[]): GridNode { + if (location.length === 0) { + return node; + } + + if (!isGridBranchNode(node)) { + throw new Error('Invalid location'); + } + + const [index, ...rest] = location; + return getGridNode(node.children[index], rest); +} + +interface Range { + readonly start: number; + readonly end: number; +} + +function intersects(one: Range, other: Range): boolean { + return !(one.start >= other.end || other.start >= one.end); +} + +interface Boundary { + readonly offset: number; + readonly range: Range; +} + +function getBoxBoundary(box: Box, direction: Direction): Boundary { + const orientation = getDirectionOrientation(direction); + const offset = direction === Direction.Up ? box.top : + direction === Direction.Right ? box.left + box.width : + direction === Direction.Down ? box.top + box.height : + box.left; + + const range = { + start: orientation === Orientation.HORIZONTAL ? box.top : box.left, + end: orientation === Orientation.HORIZONTAL ? box.top + box.height : box.left + box.width + }; + + return { offset, range }; +} + +function findAdjacentBoxLeafNodes(boxNode: GridNode, direction: Direction, boundary: Boundary): GridLeafNode[] { + const result: GridLeafNode[] = []; + + function _(boxNode: GridNode, direction: Direction, boundary: Boundary): void { + if (isGridBranchNode(boxNode)) { + for (const child of boxNode.children) { + _(child, direction, boundary); + } + } else { + const { offset, range } = getBoxBoundary(boxNode.box, direction); + + if (offset === boundary.offset && intersects(range, boundary.range)) { + result.push(boxNode); + } + } + } + + _(boxNode, direction, boundary); + return result; +} + +function getLocationOrientation(rootOrientation: Orientation, location: number[]): Orientation { + return location.length % 2 === 0 ? orthogonal(rootOrientation) : rootOrientation; +} + +function getDirectionOrientation(direction: Direction): Orientation { + return direction === Direction.Up || direction === Direction.Down ? Orientation.VERTICAL : Orientation.HORIZONTAL; +} + +function getSize(dimensions: { width: number; height: number; }, orientation: Orientation) { + return orientation === Orientation.HORIZONTAL ? dimensions.width : dimensions.height; +} + +export function getRelativeLocation(rootOrientation: Orientation, location: number[], direction: Direction): number[] { + const orientation = getLocationOrientation(rootOrientation, location); + const directionOrientation = getDirectionOrientation(direction); + + if (orientation === directionOrientation) { + let [rest, index] = tail(location); + + if (direction === Direction.Right || direction === Direction.Down) { + index += 1; + } + + return [...rest, index]; + } else { + const index = (direction === Direction.Right || direction === Direction.Down) ? 1 : 0; + return [...location, index]; + } +} + +function indexInParent(element: HTMLElement): number { + const parentElement = element.parentElement; + let el = parentElement.firstElementChild; + let index = 0; + + while (el !== element && el !== parentElement.lastElementChild) { + el = el.nextElementSibling; + index++; + } + + return index; +} + +/** + * Find the grid location of a specific DOM element by traversing the parent + * chain and finding each child index on the way. + * + * This will break as soon as DOM structures of the Splitview or Gridview change. + */ +function getGridLocation(element: HTMLElement): number[] { + if (/\bmonaco-grid-view\b/.test(element.parentElement.className)) { + return []; + } + + const index = indexInParent(element.parentElement); + const ancestor = element.parentElement.parentElement.parentElement.parentElement; + return [...getGridLocation(ancestor), index]; +} + +export enum Sizing { + Distribute = 'distribute', + Split = 'split' +} + +export interface IGridStyles extends IGridViewStyles { } + +export interface IGridOptions { + styles?: IGridStyles; +} + +export class Grid implements IDisposable { + + protected gridview: GridView; + private views = new Map(); + private disposables: IDisposable[] = []; + + get orientation(): Orientation { return this.gridview.orientation; } + set orientation(orientation: Orientation) { this.gridview.orientation = orientation; } + + get width(): number { return this.gridview.width; } + get height(): number { return this.gridview.height; } + + get minimumWidth(): number { return this.gridview.minimumWidth; } + get minimumHeight(): number { return this.gridview.minimumHeight; } + get maximumWidth(): number { return this.gridview.maximumWidth; } + get maximumHeight(): number { return this.gridview.maximumHeight; } + get onDidChange(): Event<{ width: number; height: number; }> { return this.gridview.onDidChange; } + + get element(): HTMLElement { return this.gridview.element; } + + sashResetSizing: Sizing = Sizing.Distribute; + + constructor(view: T, options: IGridOptions = {}) { + this.gridview = new GridView(options); + this.disposables.push(this.gridview); + + this.gridview.onDidSashReset(this.doResetViewSize, this, this.disposables); + + this._addView(view, 0, [0]); + } + + style(styles: IGridStyles): void { + this.gridview.style(styles); + } + + layout(width: number, height: number): void { + this.gridview.layout(width, height); + } + + addView(newView: T, size: number | Sizing, referenceView: T, direction: Direction): void { + if (this.views.has(newView)) { + throw new Error('Can\'t add same view twice'); + } + + const orientation = getDirectionOrientation(direction); + + if (this.views.size === 1 && this.orientation !== orientation) { + this.orientation = orientation; + } + + const referenceLocation = this.getViewLocation(referenceView); + const location = getRelativeLocation(this.gridview.orientation, referenceLocation, direction); + + let viewSize: number | GridViewSizing; + + if (size === Sizing.Split) { + const [, index] = tail(referenceLocation); + viewSize = GridViewSizing.Split(index); + } else if (size === Sizing.Distribute) { + viewSize = GridViewSizing.Distribute; + } else { + viewSize = size; + } + + this._addView(newView, viewSize, location); + } + + protected _addView(newView: T, size: number | GridViewSizing, location): void { + this.views.set(newView, newView.element); + this.gridview.addView(newView, size, location); + } + + removeView(view: T, sizing?: Sizing): void { + if (this.views.size === 1) { + throw new Error('Can\'t remove last view'); + } + + if (!this.views.has(view)) { + throw new Error('View not found'); + } + + const location = this.getViewLocation(view); + this.gridview.removeView(location, sizing === Sizing.Distribute ? GridViewSizing.Distribute : undefined); + this.views.delete(view); + } + + swapViews(from: T, to: T): void { + const fromLocation = this.getViewLocation(from); + const toLocation = this.getViewLocation(to); + return this.gridview.swapViews(fromLocation, toLocation); + } + + resizeView(view: T, size: number): void { + const location = this.getViewLocation(view); + return this.gridview.resizeView(location, size); + } + + getViewSize(view: T): number { + const location = this.getViewLocation(view); + const viewSize = this.gridview.getViewSize(location); + return getLocationOrientation(this.orientation, location) === Orientation.HORIZONTAL ? viewSize.width : viewSize.height; + } + + // TODO@joao cleanup + getViewSize2(view: T): { width: number; height: number; } { + const location = this.getViewLocation(view); + return this.gridview.getViewSize(location); + } + + maximizeViewSize(view: T): void { + const location = this.getViewLocation(view); + this.gridview.maximizeViewSize(location); + } + + distributeViewSizes(): void { + this.gridview.distributeViewSizes(); + } + + getViews(): GridBranchNode { + return this.gridview.getViews() as GridBranchNode; + } + + getNeighborViews(view: T, direction: Direction, wrap: boolean = false): T[] { + const location = this.getViewLocation(view); + const root = this.getViews(); + const node = getGridNode(root, location); + let boundary = getBoxBoundary(node.box, direction); + + if (wrap) { + if (direction === Direction.Up && node.box.top === 0) { + boundary = { offset: root.box.top + root.box.height, range: boundary.range }; + } else if (direction === Direction.Right && node.box.left + node.box.width === root.box.width) { + boundary = { offset: 0, range: boundary.range }; + } else if (direction === Direction.Down && node.box.top + node.box.height === root.box.height) { + boundary = { offset: 0, range: boundary.range }; + } else if (direction === Direction.Left && node.box.left === 0) { + boundary = { offset: root.box.left + root.box.width, range: boundary.range }; + } + } + + return findAdjacentBoxLeafNodes(root, oppositeDirection(direction), boundary) + .map(node => node.view); + } + + private getViewLocation(view: T): number[] { + const element = this.views.get(view); + + if (!element) { + throw new Error('View not found'); + } + + return getGridLocation(element); + } + + private doResetViewSize(location: number[]): void { + if (this.sashResetSizing === Sizing.Split) { + const orientation = getLocationOrientation(this.orientation, location); + const firstViewSize = getSize(this.gridview.getViewSize(location), orientation); + const [parentLocation, index] = tail(location); + const secondViewSize = getSize(this.gridview.getViewSize([...parentLocation, index + 1]), orientation); + const totalSize = firstViewSize + secondViewSize; + this.gridview.resizeView(location, Math.floor(totalSize / 2)); + + } else { + const [parentLocation,] = tail(location); + this.gridview.distributeViewSizes(parentLocation); + } + } + + dispose(): void { + this.disposables = dispose(this.disposables); + } +} + +export interface ISerializableView extends IView { + toJSON(): object; +} + +export interface IViewDeserializer { + fromJSON(json: object): T; +} + +interface InitialLayoutContext { + width: number; + height: number; + root: GridBranchNode; +} + +export interface ISerializedLeafNode { + type: 'leaf'; + data: object; + size: number; +} + +export interface ISerializedBranchNode { + type: 'branch'; + data: ISerializedNode[]; + size: number; +} + +export type ISerializedNode = ISerializedLeafNode | ISerializedBranchNode; + +export interface ISerializedGrid { + root: ISerializedNode; + orientation: Orientation; + width: number; + height: number; +} + +export class SerializableGrid extends Grid { + + private static serializeNode(node: GridNode, orientation: Orientation): ISerializedNode { + const size = orientation === Orientation.VERTICAL ? node.box.width : node.box.height; + + if (!isGridBranchNode(node)) { + return { type: 'leaf', data: node.view.toJSON(), size }; + } + + return { type: 'branch', data: node.children.map(c => SerializableGrid.serializeNode(c, orthogonal(orientation))), size }; + } + + private static deserializeNode(json: ISerializedNode, orientation: Orientation, box: Box, deserializer: IViewDeserializer): GridNode { + if (!json || typeof json !== 'object') { + throw new Error('Invalid JSON'); + } + + const type = json.type; + const data = json.data; + + if (type === 'branch') { + if (!Array.isArray(data)) { + throw new Error('Invalid JSON: \'data\' property of branch must be an array.'); + } + + const children: GridNode[] = []; + let offset = 0; + + for (const child of data) { + if (typeof child.size !== 'number') { + throw new Error('Invalid JSON: \'size\' property of node must be a number.'); + } + + const childBox: Box = orientation === Orientation.HORIZONTAL + ? { top: box.top, left: box.left + offset, width: child.size, height: box.height } + : { top: box.top + offset, left: box.left, width: box.width, height: child.size }; + + children.push(SerializableGrid.deserializeNode(child, orthogonal(orientation), childBox, deserializer)); + offset += child.size; + } + + return { children, box }; + + } else if (type === 'leaf') { + const view = deserializer.fromJSON(data) as T; + return { view, box }; + } + + throw new Error('Invalid JSON: \'type\' property must be either \'branch\' or \'leaf\'.'); + } + + private static getFirstLeaf(node: GridNode): GridLeafNode | undefined { + if (!isGridBranchNode(node)) { + return node; + } + + return SerializableGrid.getFirstLeaf(node.children[0]); + } + + static deserialize(json: ISerializedGrid, deserializer: IViewDeserializer, options: IGridOptions = {}): SerializableGrid { + if (typeof json.orientation !== 'number') { + throw new Error('Invalid JSON: \'orientation\' property must be a number.'); + } else if (typeof json.width !== 'number') { + throw new Error('Invalid JSON: \'width\' property must be a number.'); + } else if (typeof json.height !== 'number') { + throw new Error('Invalid JSON: \'height\' property must be a number.'); + } + + const orientation = json.orientation as Orientation; + const width = json.width as number; + const height = json.height as number; + const box: Box = { top: 0, left: 0, width, height }; + + const root = SerializableGrid.deserializeNode(json.root, orientation, box, deserializer) as GridBranchNode; + const firstLeaf = SerializableGrid.getFirstLeaf(root); + + if (!firstLeaf) { + throw new Error('Invalid serialized state, first leaf not found'); + } + + const result = new SerializableGrid(firstLeaf.view, options); + result.orientation = orientation; + result.restoreViews(firstLeaf.view, orientation, root); + result.initialLayoutContext = { width, height, root }; + + return result; + } + + /** + * Useful information in order to proportionally restore view sizes + * upon the very first layout call. + */ + private initialLayoutContext: InitialLayoutContext | undefined; + + serialize(): ISerializedGrid { + return { + root: SerializableGrid.serializeNode(this.getViews(), this.orientation), + orientation: this.orientation, + width: this.width, + height: this.height + }; + } + + layout(width: number, height: number): void { + super.layout(width, height); + + if (this.initialLayoutContext) { + const widthScale = width / this.initialLayoutContext.width; + const heightScale = height / this.initialLayoutContext.height; + + this.restoreViewsSize([], this.initialLayoutContext.root, this.orientation, widthScale, heightScale); + this.initialLayoutContext = undefined; + + this.gridview.trySet2x2(); + } + } + + /** + * Recursively restores views which were just deserialized. + */ + private restoreViews(referenceView: T, orientation: Orientation, node: GridNode): void { + if (!isGridBranchNode(node)) { + return; + } + + const direction = orientation === Orientation.VERTICAL ? Direction.Down : Direction.Right; + const firstLeaves = node.children.map(c => SerializableGrid.getFirstLeaf(c)); + + for (let i = 1; i < firstLeaves.length; i++) { + const size = orientation === Orientation.VERTICAL ? firstLeaves[i].box.height : firstLeaves[i].box.width; + this.addView(firstLeaves[i].view, size, referenceView, direction); + referenceView = firstLeaves[i].view; + } + + for (let i = 0; i < node.children.length; i++) { + this.restoreViews(firstLeaves[i].view, orthogonal(orientation), node.children[i]); + } + } + + /** + * Recursively restores view sizes. + * This should be called only after the very first layout call. + */ + private restoreViewsSize(location: number[], node: GridNode, orientation: Orientation, widthScale: number, heightScale: number): void { + if (!isGridBranchNode(node)) { + return; + } + + const scale = orientation === Orientation.VERTICAL ? heightScale : widthScale; + + for (let i = 0; i < node.children.length; i++) { + const child = node.children[i]; + const childLocation = [...location, i]; + + if (i < node.children.length - 1) { + const size = orientation === Orientation.VERTICAL ? child.box.height : child.box.width; + this.gridview.resizeView(childLocation, Math.floor(size * scale)); + } + + this.restoreViewsSize(childLocation, child, orthogonal(orientation), widthScale, heightScale); + } + } +} + +export type GridNodeDescriptor = { size?: number, groups?: GridNodeDescriptor[] }; +export type GridDescriptor = { orientation: Orientation, groups?: GridNodeDescriptor[] }; + +export function sanitizeGridNodeDescriptor(nodeDescriptor: GridNodeDescriptor): void { + if (nodeDescriptor.groups && nodeDescriptor.groups.length === 0) { + nodeDescriptor.groups = undefined; + } + + if (!nodeDescriptor.groups) { + return; + } + + let totalDefinedSize = 0; + let totalDefinedSizeCount = 0; + + for (const child of nodeDescriptor.groups) { + sanitizeGridNodeDescriptor(child); + + if (child.size) { + totalDefinedSize += child.size; + totalDefinedSizeCount++; + } + } + + const totalUndefinedSize = totalDefinedSizeCount > 0 ? totalDefinedSize : 1; + const totalUndefinedSizeCount = nodeDescriptor.groups.length - totalDefinedSizeCount; + const eachUndefinedSize = totalUndefinedSize / totalUndefinedSizeCount; + + for (const child of nodeDescriptor.groups) { + if (!child.size) { + child.size = eachUndefinedSize; + } + } +} + +function createSerializedNode(nodeDescriptor: GridNodeDescriptor): ISerializedNode { + if (nodeDescriptor.groups) { + return { type: 'branch', data: nodeDescriptor.groups.map(c => createSerializedNode(c)), size: nodeDescriptor.size! }; + } else { + return { type: 'leaf', data: null, size: nodeDescriptor.size! }; + } +} + +function getDimensions(node: ISerializedNode, orientation: Orientation): { width?: number, height?: number } { + if (node.type === 'branch') { + const childrenDimensions = node.data.map(c => getDimensions(c, orthogonal(orientation))); + + if (orientation === Orientation.VERTICAL) { + const width = node.size || (childrenDimensions.length === 0 ? undefined : Math.max(...childrenDimensions.map(d => d.width || 0))); + const height = childrenDimensions.length === 0 ? undefined : childrenDimensions.reduce((r, d) => r + d.height, 0); + return { width, height }; + } else { + const width = childrenDimensions.length === 0 ? undefined : childrenDimensions.reduce((r, d) => r + d.width, 0); + const height = node.size || (childrenDimensions.length === 0 ? undefined : Math.max(...childrenDimensions.map(d => d.height || 0))); + return { width, height }; + } + } else { + const width = orientation === Orientation.VERTICAL ? node.size : undefined; + const height = orientation === Orientation.VERTICAL ? undefined : node.size; + return { width, height }; + } +} + +export function createSerializedGrid(gridDescriptor: GridDescriptor): ISerializedGrid { + sanitizeGridNodeDescriptor(gridDescriptor); + + const root = createSerializedNode(gridDescriptor); + const { width, height } = getDimensions(root, gridDescriptor.orientation); + + return { + root, + orientation: gridDescriptor.orientation, + width: width || 1, + height: height || 1 + }; +} diff --git a/src/vs/base/browser/ui/grid/gridview.css b/src/vs/base/browser/ui/grid/gridview.css new file mode 100644 index 0000000000..5c55d8f2bd --- /dev/null +++ b/src/vs/base/browser/ui/grid/gridview.css @@ -0,0 +1,16 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the Source EULA. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +.monaco-grid-view { + position: relative; + overflow: hidden; + width: 100%; + height: 100%; +} + +.monaco-grid-branch-node { + width: 100%; + height: 100%; +} \ No newline at end of file diff --git a/src/vs/base/browser/ui/grid/gridview.ts b/src/vs/base/browser/ui/grid/gridview.ts new file mode 100644 index 0000000000..58a440b44d --- /dev/null +++ b/src/vs/base/browser/ui/grid/gridview.ts @@ -0,0 +1,809 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the Source EULA. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +'use strict'; + +import 'vs/css!./gridview'; +import { Event, anyEvent, Emitter, mapEvent, Relay } from 'vs/base/common/event'; +import { Orientation, Sash } from 'vs/base/browser/ui/sash/sash'; +import { SplitView, IView as ISplitView, Sizing, ISplitViewStyles } from 'vs/base/browser/ui/splitview/splitview'; +import { Disposable, IDisposable, toDisposable } from 'vs/base/common/lifecycle'; +import { $ } from 'vs/base/browser/dom'; +import { tail2 as tail } from 'vs/base/common/arrays'; +import { Color } from 'vs/base/common/color'; + +export { Sizing } from 'vs/base/browser/ui/splitview/splitview'; +export { Orientation } from 'vs/base/browser/ui/sash/sash'; + +export interface IView { + readonly element: HTMLElement; + readonly minimumWidth: number; + readonly maximumWidth: number; + readonly minimumHeight: number; + readonly maximumHeight: number; + readonly onDidChange: Event<{ width: number; height: number; }>; + layout(width: number, height: number): void; +} + +export function orthogonal(orientation: Orientation): Orientation { + return orientation === Orientation.VERTICAL ? Orientation.HORIZONTAL : Orientation.VERTICAL; +} + +export interface Box { + top: number; + left: number; + width: number; + height: number; +} + +export interface GridLeafNode { + readonly view: IView; + readonly box: Box; +} + +export interface GridBranchNode { + readonly children: GridNode[]; + readonly box: Box; +} + +export type GridNode = GridLeafNode | GridBranchNode; + +export function isGridBranchNode(node: GridNode): node is GridBranchNode { + return !!(node as any).children; +} + +export interface IGridViewStyles extends ISplitViewStyles { } + +const defaultStyles: IGridViewStyles = { + separatorBorder: Color.transparent +}; + +export interface IGridViewOptions { + styles?: IGridViewStyles; +} + +class BranchNode implements ISplitView, IDisposable { + + readonly element: HTMLElement; + readonly children: Node[] = []; + private splitview: SplitView; + + private _size: number; + get size(): number { return this._size; } + + private _orthogonalSize: number; + get orthogonalSize(): number { return this._orthogonalSize; } + + private _styles: IGridViewStyles; + get styles(): IGridViewStyles { return this._styles; } + + get width(): number { + return this.orientation === Orientation.HORIZONTAL ? this.size : this.orthogonalSize; + } + + get height(): number { + return this.orientation === Orientation.HORIZONTAL ? this.orthogonalSize : this.size; + } + + get minimumSize(): number { + return this.children.length === 0 ? 0 : Math.max(...this.children.map(c => c.minimumOrthogonalSize)); + } + + get maximumSize(): number { + return Math.min(...this.children.map(c => c.maximumOrthogonalSize)); + } + + get minimumOrthogonalSize(): number { + return this.splitview.minimumSize; + } + + get maximumOrthogonalSize(): number { + return this.splitview.maximumSize; + } + + get minimumWidth(): number { + return this.orientation === Orientation.HORIZONTAL ? this.minimumOrthogonalSize : this.minimumSize; + } + + get minimumHeight(): number { + return this.orientation === Orientation.HORIZONTAL ? this.minimumSize : this.minimumOrthogonalSize; + } + + get maximumWidth(): number { + return this.orientation === Orientation.HORIZONTAL ? this.maximumOrthogonalSize : this.maximumSize; + } + + get maximumHeight(): number { + return this.orientation === Orientation.HORIZONTAL ? this.maximumSize : this.maximumOrthogonalSize; + } + + private _onDidChange = new Emitter(); + readonly onDidChange: Event = this._onDidChange.event; + + private childrenChangeDisposable: IDisposable = Disposable.None; + + private _onDidSashReset = new Emitter(); + readonly onDidSashReset: Event = this._onDidSashReset.event; + private splitviewSashResetDisposable: IDisposable = Disposable.None; + private childrenSashResetDisposable: IDisposable = Disposable.None; + + get orthogonalStartSash(): Sash | undefined { return this.splitview.orthogonalStartSash; } + set orthogonalStartSash(sash: Sash | undefined) { this.splitview.orthogonalStartSash = sash; } + get orthogonalEndSash(): Sash | undefined { return this.splitview.orthogonalEndSash; } + set orthogonalEndSash(sash: Sash | undefined) { this.splitview.orthogonalEndSash = sash; } + + constructor( + readonly orientation: Orientation, + styles: IGridViewStyles, + size: number = 0, + orthogonalSize: number = 0 + ) { + this._styles = styles; + this._size = size; + this._orthogonalSize = orthogonalSize; + + this.element = $('.monaco-grid-branch-node'); + this.splitview = new SplitView(this.element, { orientation, styles }); + this.splitview.layout(size); + + const onDidSashReset = mapEvent(this.splitview.onDidSashReset, i => [i]); + this.splitviewSashResetDisposable = onDidSashReset(this._onDidSashReset.fire, this._onDidSashReset); + } + + style(styles: IGridViewStyles): void { + this._styles = styles; + this.splitview.style(styles); + + for (const child of this.children) { + if (child instanceof BranchNode) { + child.style(styles); + } + } + } + + layout(size: number): void { + this._orthogonalSize = size; + + for (const child of this.children) { + child.orthogonalLayout(size); + } + } + + orthogonalLayout(size: number): void { + this._size = size; + this.splitview.layout(size); + } + + addChild(node: Node, size: number | Sizing, index: number): void { + if (index < 0 || index > this.children.length) { + throw new Error('Invalid index'); + } + + const first = index === 0; + const last = index === this.splitview.length; + this.splitview.addView(node, size, index); + this.children.splice(index, 0, node); + node.orthogonalStartSash = this.splitview.sashes[index - 1]; + node.orthogonalEndSash = this.splitview.sashes[index]; + + if (!first) { + this.children[index - 1].orthogonalEndSash = this.splitview.sashes[index - 1]; + } + + if (!last) { + this.children[index + 1].orthogonalStartSash = this.splitview.sashes[index]; + } + + this.onDidChildrenChange(); + } + + removeChild(index: number, sizing?: Sizing): void { + if (index < 0 || index >= this.children.length) { + throw new Error('Invalid index'); + } + + const first = index === 0; + const last = index === this.splitview.length - 1; + this.splitview.removeView(index, sizing); + this.children.splice(index, 1); + + if (!first) { + this.children[index - 1].orthogonalEndSash = this.splitview.sashes[index - 1]; + } + + if (!last) { // [0,1,2,3] (2) => [0,1,3] + this.children[index].orthogonalStartSash = this.splitview.sashes[Math.max(index - 1, 0)]; + } + + this.onDidChildrenChange(); + } + + swapChildren(from: number, to: number): void { + if (from === to) { + return; + } + + if (from < 0 || from >= this.children.length) { + throw new Error('Invalid from index'); + } + + if (to < 0 || to >= this.children.length) { + throw new Error('Invalid to index'); + } + + this.splitview.swapViews(from, to); + [this.children[from].orthogonalStartSash, this.children[from].orthogonalEndSash, this.children[to].orthogonalStartSash, this.children[to].orthogonalEndSash] = [this.children[to].orthogonalStartSash, this.children[to].orthogonalEndSash, this.children[from].orthogonalStartSash, this.children[from].orthogonalEndSash]; + [this.children[from], this.children[to]] = [this.children[to], this.children[from]]; + } + + resizeChild(index: number, size: number): void { + if (index < 0 || index >= this.children.length) { + throw new Error('Invalid index'); + } + + this.splitview.resizeView(index, size); + } + + distributeViewSizes(recursive = false): void { + this.splitview.distributeViewSizes(); + + if (recursive) { + for (const child of this.children) { + if (child instanceof BranchNode) { + child.distributeViewSizes(true); + } + } + } + } + + getChildSize(index: number): number { + if (index < 0 || index >= this.children.length) { + throw new Error('Invalid index'); + } + + return this.splitview.getViewSize(index); + } + + private onDidChildrenChange(): void { + const onDidChildrenChange = anyEvent(...this.children.map(c => c.onDidChange)); + this.childrenChangeDisposable.dispose(); + this.childrenChangeDisposable = onDidChildrenChange(this._onDidChange.fire, this._onDidChange); + + const onDidChildrenSashReset = anyEvent(...this.children.map((c, i) => mapEvent(c.onDidSashReset, location => [i, ...location]))); + this.childrenSashResetDisposable.dispose(); + this.childrenSashResetDisposable = onDidChildrenSashReset(this._onDidSashReset.fire, this._onDidSashReset); + + this._onDidChange.fire(); + } + + trySet2x2(other: BranchNode): IDisposable { + if (this.children.length !== 2 || other.children.length !== 2) { + return Disposable.None; + } + + if (this.getChildSize(0) !== other.getChildSize(0)) { + return Disposable.None; + } + + const [firstChild, secondChild] = this.children; + const [otherFirstChild, otherSecondChild] = other.children; + + if (!(firstChild instanceof LeafNode) || !(secondChild instanceof LeafNode)) { + return Disposable.None; + } + + if (!(otherFirstChild instanceof LeafNode) || !(otherSecondChild instanceof LeafNode)) { + return Disposable.None; + } + + if (this.orientation === Orientation.VERTICAL) { + secondChild.linkedWidthNode = otherFirstChild.linkedHeightNode = firstChild; + firstChild.linkedWidthNode = otherSecondChild.linkedHeightNode = secondChild; + otherSecondChild.linkedWidthNode = firstChild.linkedHeightNode = otherFirstChild; + otherFirstChild.linkedWidthNode = secondChild.linkedHeightNode = otherSecondChild; + } else { + otherFirstChild.linkedWidthNode = secondChild.linkedHeightNode = firstChild; + otherSecondChild.linkedWidthNode = firstChild.linkedHeightNode = secondChild; + firstChild.linkedWidthNode = otherSecondChild.linkedHeightNode = otherFirstChild; + secondChild.linkedWidthNode = otherFirstChild.linkedHeightNode = otherSecondChild; + } + + const mySash = this.splitview.sashes[0]; + const otherSash = other.splitview.sashes[0]; + mySash.linkedSash = otherSash; + otherSash.linkedSash = mySash; + + this._onDidChange.fire(); + other._onDidChange.fire(); + + return toDisposable(() => { + mySash.linkedSash = otherSash.linkedSash = undefined; + firstChild.linkedHeightNode = firstChild.linkedWidthNode = undefined; + secondChild.linkedHeightNode = secondChild.linkedWidthNode = undefined; + otherFirstChild.linkedHeightNode = otherFirstChild.linkedWidthNode = undefined; + otherSecondChild.linkedHeightNode = otherSecondChild.linkedWidthNode = undefined; + }); + } + + dispose(): void { + for (const child of this.children) { + child.dispose(); + } + + this.splitviewSashResetDisposable.dispose(); + this.childrenSashResetDisposable.dispose(); + this.childrenChangeDisposable.dispose(); + this.splitview.dispose(); + } +} + +class LeafNode implements ISplitView, IDisposable { + + private _size: number = 0; + get size(): number { return this._size; } + + private _orthogonalSize: number; + get orthogonalSize(): number { return this._orthogonalSize; } + + readonly onDidSashReset: Event = Event.None; + + private _onDidLinkedWidthNodeChange = new Relay(); + private _linkedWidthNode: LeafNode | undefined = undefined; + get linkedWidthNode(): LeafNode | undefined { return this._linkedWidthNode; } + set linkedWidthNode(node: LeafNode | undefined) { + this._onDidLinkedWidthNodeChange.input = node ? node._onDidViewChange : Event.None; + this._linkedWidthNode = node; + this._onDidSetLinkedNode.fire(); + } + + private _onDidLinkedHeightNodeChange = new Relay(); + private _linkedHeightNode: LeafNode | undefined = undefined; + get linkedHeightNode(): LeafNode | undefined { return this._linkedHeightNode; } + set linkedHeightNode(node: LeafNode | undefined) { + this._onDidLinkedHeightNodeChange.input = node ? node._onDidViewChange : Event.None; + this._linkedHeightNode = node; + this._onDidSetLinkedNode.fire(); + } + + private _onDidSetLinkedNode = new Emitter(); + private _onDidViewChange: Event; + readonly onDidChange: Event; + + constructor( + readonly view: IView, + readonly orientation: Orientation, + orthogonalSize: number = 0 + ) { + this._orthogonalSize = orthogonalSize; + + this._onDidViewChange = mapEvent(this.view.onDidChange, this.orientation === Orientation.HORIZONTAL ? e => e && e.width : e => e && e.height); + this.onDidChange = anyEvent(this._onDidViewChange, this._onDidSetLinkedNode.event, this._onDidLinkedWidthNodeChange.event, this._onDidLinkedHeightNodeChange.event); + } + + get width(): number { + return this.orientation === Orientation.HORIZONTAL ? this.orthogonalSize : this.size; + } + + get height(): number { + return this.orientation === Orientation.HORIZONTAL ? this.size : this.orthogonalSize; + } + + get element(): HTMLElement { + return this.view.element; + } + + private get minimumWidth(): number { + return this.linkedWidthNode ? Math.max(this.linkedWidthNode.view.minimumWidth, this.view.minimumWidth) : this.view.minimumWidth; + } + + private get maximumWidth(): number { + return this.linkedWidthNode ? Math.min(this.linkedWidthNode.view.maximumWidth, this.view.maximumWidth) : this.view.maximumWidth; + } + + private get minimumHeight(): number { + return this.linkedHeightNode ? Math.max(this.linkedHeightNode.view.minimumHeight, this.view.minimumHeight) : this.view.minimumHeight; + } + + private get maximumHeight(): number { + return this.linkedHeightNode ? Math.min(this.linkedHeightNode.view.maximumHeight, this.view.maximumHeight) : this.view.maximumHeight; + } + + get minimumSize(): number { + return this.orientation === Orientation.HORIZONTAL ? this.minimumHeight : this.minimumWidth; + } + + get maximumSize(): number { + return this.orientation === Orientation.HORIZONTAL ? this.maximumHeight : this.maximumWidth; + } + + get minimumOrthogonalSize(): number { + return this.orientation === Orientation.HORIZONTAL ? this.minimumWidth : this.minimumHeight; + } + + get maximumOrthogonalSize(): number { + return this.orientation === Orientation.HORIZONTAL ? this.maximumWidth : this.maximumHeight; + } + + set orthogonalStartSash(sash: Sash) { + // noop + } + + set orthogonalEndSash(sash: Sash) { + // noop + } + + layout(size: number): void { + this._size = size; + return this.view.layout(this.width, this.height); + } + + orthogonalLayout(size: number): void { + this._orthogonalSize = size; + return this.view.layout(this.width, this.height); + } + + dispose(): void { } +} + +type Node = BranchNode | LeafNode; + +function flipNode(node: T, size: number, orthogonalSize: number): T { + if (node instanceof BranchNode) { + const result = new BranchNode(orthogonal(node.orientation), node.styles, size, orthogonalSize); + + let totalSize = 0; + + for (let i = node.children.length - 1; i >= 0; i--) { + const child = node.children[i]; + const childSize = child instanceof BranchNode ? child.orthogonalSize : child.size; + + let newSize = node.size === 0 ? 0 : Math.round((size * childSize) / node.size); + totalSize += newSize; + + // The last view to add should adjust to rounding errors + if (i === 0) { + newSize += size - totalSize; + } + + result.addChild(flipNode(child, orthogonalSize, newSize), newSize, 0); + } + + return result as T; + } else { + return new LeafNode((node as LeafNode).view, orthogonal(node.orientation), orthogonalSize) as T; + } +} + +export class GridView implements IDisposable { + + readonly element: HTMLElement; + private styles: IGridViewStyles; + + private _root: BranchNode; + private onDidSashResetRelay = new Relay(); + readonly onDidSashReset: Event = this.onDidSashResetRelay.event; + + private disposable2x2: IDisposable = Disposable.None; + + private get root(): BranchNode { + return this._root; + } + + private set root(root: BranchNode) { + const oldRoot = this._root; + + if (oldRoot) { + this.element.removeChild(oldRoot.element); + oldRoot.dispose(); + } + + this._root = root; + this.element.appendChild(root.element); + this.onDidSashResetRelay.input = root.onDidSashReset; + this._onDidChange.input = mapEvent(root.onDidChange, () => undefined); // TODO + } + + get orientation(): Orientation { + return this._root.orientation; + } + + set orientation(orientation: Orientation) { + if (this._root.orientation === orientation) { + return; + } + + const { size, orthogonalSize } = this._root; + this.root = flipNode(this._root, orthogonalSize, size); + this.root.layout(size); + this.root.orthogonalLayout(orthogonalSize); + } + + get width(): number { return this.root.width; } + get height(): number { return this.root.height; } + + get minimumWidth(): number { return this.root.minimumWidth; } + get minimumHeight(): number { return this.root.minimumHeight; } + get maximumWidth(): number { return this.root.maximumHeight; } + get maximumHeight(): number { return this.root.maximumHeight; } + + private _onDidChange = new Relay<{ width: number; height: number; }>(); + readonly onDidChange = this._onDidChange.event; + + constructor(options: IGridViewOptions = {}) { + this.element = $('.monaco-grid-view'); + this.styles = options.styles || defaultStyles; + this.root = new BranchNode(Orientation.VERTICAL, this.styles); + } + + style(styles: IGridViewStyles): void { + this.styles = styles; + this.root.style(styles); + } + + layout(width: number, height: number): void { + const [size, orthogonalSize] = this.root.orientation === Orientation.HORIZONTAL ? [height, width] : [width, height]; + this.root.layout(size); + this.root.orthogonalLayout(orthogonalSize); + } + + addView(view: IView, size: number | Sizing, location: number[]): void { + this.disposable2x2.dispose(); + this.disposable2x2 = Disposable.None; + + const [rest, index] = tail(location); + const [pathToParent, parent] = this.getNode(rest); + + if (parent instanceof BranchNode) { + const node = new LeafNode(view, orthogonal(parent.orientation), parent.orthogonalSize); + parent.addChild(node, size, index); + + } else { + const [, grandParent] = tail(pathToParent); + const [, parentIndex] = tail(rest); + grandParent.removeChild(parentIndex); + + const newParent = new BranchNode(parent.orientation, this.styles, parent.size, parent.orthogonalSize); + grandParent.addChild(newParent, parent.size, parentIndex); + newParent.orthogonalLayout(parent.orthogonalSize); + + const newSibling = new LeafNode(parent.view, grandParent.orientation, parent.size); + newParent.addChild(newSibling, 0, 0); + + if (typeof size !== 'number' && size.type === 'split') { + size = Sizing.Split(0); + } + + const node = new LeafNode(view, grandParent.orientation, parent.size); + newParent.addChild(node, size, index); + } + } + + removeView(location: number[], sizing?: Sizing): IView { + this.disposable2x2.dispose(); + this.disposable2x2 = Disposable.None; + + const [rest, index] = tail(location); + const [pathToParent, parent] = this.getNode(rest); + + if (!(parent instanceof BranchNode)) { + throw new Error('Invalid location'); + } + + const node = parent.children[index]; + + if (!(node instanceof LeafNode)) { + throw new Error('Invalid location'); + } + + parent.removeChild(index, sizing); + + if (parent.children.length === 0) { + throw new Error('Invalid grid state'); + } + + if (parent.children.length > 1) { + return node.view; + } + + if (pathToParent.length === 0) { // parent is root + const sibling = parent.children[0]; + + if (sibling instanceof LeafNode) { + return node.view; + } + + // we must promote sibling to be the new root + parent.removeChild(0); + this.root = sibling; + return node.view; + } + + const [, grandParent] = tail(pathToParent); + const [, parentIndex] = tail(rest); + + const sibling = parent.children[0]; + parent.removeChild(0); + + const sizes = grandParent.children.map((_, i) => grandParent.getChildSize(i)); + grandParent.removeChild(parentIndex, sizing); + + if (sibling instanceof BranchNode) { + sizes.splice(parentIndex, 1, ...sibling.children.map(c => c.size)); + + for (let i = 0; i < sibling.children.length; i++) { + const child = sibling.children[i]; + grandParent.addChild(child, child.size, parentIndex + i); + } + } else { + const newSibling = new LeafNode(sibling.view, orthogonal(sibling.orientation), sibling.size); + grandParent.addChild(newSibling, sibling.orthogonalSize, parentIndex); + } + + for (let i = 0; i < sizes.length; i++) { + grandParent.resizeChild(i, sizes[i]); + } + + return node.view; + } + + swapViews(from: number[], to: number[]): void { + const [fromRest, fromIndex] = tail(from); + const [, fromParent] = this.getNode(fromRest); + + if (!(fromParent instanceof BranchNode)) { + throw new Error('Invalid from location'); + } + + const fromSize = fromParent.getChildSize(fromIndex); + const fromNode = fromParent.children[fromIndex]; + + if (!(fromNode instanceof LeafNode)) { + throw new Error('Invalid from location'); + } + + const [toRest, toIndex] = tail(to); + const [, toParent] = this.getNode(toRest); + + if (!(toParent instanceof BranchNode)) { + throw new Error('Invalid to location'); + } + + const toSize = toParent.getChildSize(toIndex); + const toNode = toParent.children[toIndex]; + + if (!(toNode instanceof LeafNode)) { + throw new Error('Invalid to location'); + } + + if (fromParent === toParent) { + fromParent.swapChildren(fromIndex, toIndex); + } else { + fromParent.removeChild(fromIndex); + toParent.removeChild(toIndex); + + fromParent.addChild(toNode, fromSize, fromIndex); + toParent.addChild(fromNode, toSize, toIndex); + + fromParent.layout(fromParent.orthogonalSize); + toParent.layout(toParent.orthogonalSize); + } + } + + resizeView(location: number[], size: number): void { + const [rest, index] = tail(location); + const [, parent] = this.getNode(rest); + + if (!(parent instanceof BranchNode)) { + throw new Error('Invalid location'); + } + + parent.resizeChild(index, size); + } + + getViewSize(location: number[]): { width: number; height: number; } { + const [, node] = this.getNode(location); + return { width: node.width, height: node.height }; + } + + maximizeViewSize(location: number[]): void { + const [ancestors, node] = this.getNode(location); + + if (!(node instanceof LeafNode)) { + throw new Error('Invalid location'); + } + + for (let i = 0; i < ancestors.length; i++) { + ancestors[i].resizeChild(location[i], Number.POSITIVE_INFINITY); + } + } + + distributeViewSizes(location?: number[]): void { + if (!location) { + this.root.distributeViewSizes(true); + return; + } + + const [, node] = this.getNode(location); + + if (!(node instanceof BranchNode)) { + throw new Error('Invalid location'); + } + + node.distributeViewSizes(); + } + + getViews(): GridBranchNode { + return this._getViews(this.root, this.orientation, { top: 0, left: 0, width: this.width, height: this.height }) as GridBranchNode; + } + + private _getViews(node: Node, orientation: Orientation, box: Box): GridNode { + if (node instanceof LeafNode) { + return { view: node.view, box }; + } + + const children: GridNode[] = []; + let offset = 0; + + for (let i = 0; i < node.children.length; i++) { + const child = node.children[i]; + const childOrientation = orthogonal(orientation); + const childBox: Box = orientation === Orientation.HORIZONTAL + ? { top: box.top, left: box.left + offset, width: child.width, height: box.height } + : { top: box.top + offset, left: box.left, width: box.width, height: child.height }; + + children.push(this._getViews(child, childOrientation, childBox)); + offset += orientation === Orientation.HORIZONTAL ? child.width : child.height; + } + + return { children, box }; + } + + private getNode(location: number[], node: Node = this.root, path: BranchNode[] = []): [BranchNode[], Node] { + if (location.length === 0) { + return [path, node]; + } + + if (!(node instanceof BranchNode)) { + throw new Error('Invalid location'); + } + + const [index, ...rest] = location; + + if (index < 0 || index >= node.children.length) { + throw new Error('Invalid location'); + } + + const child = node.children[index]; + path.push(node); + + return this.getNode(rest, child, path); + } + + trySet2x2(): void { + this.disposable2x2.dispose(); + this.disposable2x2 = Disposable.None; + + if (this.root.children.length !== 2) { + return; + } + + const [first, second] = this.root.children; + + if (!(first instanceof BranchNode) || !(second instanceof BranchNode)) { + return; + } + + this.disposable2x2 = first.trySet2x2(second); + } + + dispose(): void { + this.onDidSashResetRelay.dispose(); + this.root.dispose(); + + if (this.element && this.element.parentElement) { + this.element.parentElement.removeChild(this.element); + } + } +} diff --git a/src/vs/base/browser/ui/highlightedlabel/highlightedLabel.ts b/src/vs/base/browser/ui/highlightedlabel/highlightedLabel.ts index efd36556c3..3e5cc3f18c 100644 --- a/src/vs/base/browser/ui/highlightedlabel/highlightedLabel.ts +++ b/src/vs/base/browser/ui/highlightedlabel/highlightedLabel.ts @@ -18,6 +18,7 @@ export class HighlightedLabel implements IDisposable { private domNode: HTMLElement; private text: string; + private title: string; private highlights: IHighlight[]; private didEverRender: boolean; @@ -32,11 +33,15 @@ export class HighlightedLabel implements IDisposable { return this.domNode; } - set(text: string, highlights: IHighlight[] = []) { + set(text: string, highlights: IHighlight[] = [], title: string = '', escapeNewLines?: boolean) { if (!text) { text = ''; } - if (this.didEverRender && this.text === text && objects.equals(this.highlights, highlights)) { + if (escapeNewLines) { + // adjusts highlights inplace + text = HighlightedLabel.escapeNewLines(text, highlights); + } + if (this.didEverRender && this.text === text && this.title === title && objects.equals(this.highlights, highlights)) { return; } @@ -45,6 +50,7 @@ export class HighlightedLabel implements IDisposable { } this.text = text; + this.title = title; this.highlights = highlights; this.render(); } @@ -80,6 +86,7 @@ export class HighlightedLabel implements IDisposable { } this.domNode.innerHTML = htmlContent.join(''); + this.domNode.title = this.title; this.didEverRender = true; } @@ -87,4 +94,30 @@ export class HighlightedLabel implements IDisposable { this.text = null; this.highlights = null; } + + static escapeNewLines(text: string, highlights: IHighlight[]): string { + + let total = 0; + let extra = 0; + + return text.replace(/\r\n|\r|\n/, (match, offset) => { + extra = match === '\r\n' ? -1 : 0; + offset += total; + + for (const highlight of highlights) { + if (highlight.end <= offset) { + continue; + } + if (highlight.start >= offset) { + highlight.start += extra; + } + if (highlight.end >= offset) { + highlight.end += extra; + } + } + + total += extra; + return '\u23CE'; + }); + } } diff --git a/src/vs/base/browser/ui/iconLabel/iconLabel.ts b/src/vs/base/browser/ui/iconLabel/iconLabel.ts index f391edfea3..60fd4bcd92 100644 --- a/src/vs/base/browser/ui/iconLabel/iconLabel.ts +++ b/src/vs/base/browser/ui/iconLabel/iconLabel.ts @@ -12,7 +12,7 @@ import { IMatch } from 'vs/base/common/filters'; import uri from 'vs/base/common/uri'; import * as paths from 'vs/base/common/paths'; import { IWorkspaceFolderProvider, getPathLabel, IUserHomeProvider, getBaseLabel } from 'vs/base/common/labels'; -import { IDisposable, combinedDisposable } from 'vs/base/common/lifecycle'; +import { IDisposable, combinedDisposable, Disposable } from 'vs/base/common/lifecycle'; export interface IIconLabelCreationOptions { supportHighlights?: boolean; @@ -22,6 +22,7 @@ export interface IIconLabelCreationOptions { export interface IIconLabelValueOptions { title?: string; descriptionTitle?: string; + hideIcon?: boolean; extraClasses?: string[]; italic?: boolean; matches?: IMatch[]; @@ -38,11 +39,11 @@ class FastLabelNode { constructor(private _element: HTMLElement) { } - public get element(): HTMLElement { + get element(): HTMLElement { return this._element; } - public set textContent(content: string) { + set textContent(content: string) { if (this.disposed || content === this._textContent) { return; } @@ -51,7 +52,7 @@ class FastLabelNode { this._element.textContent = content; } - public set className(className: string) { + set className(className: string) { if (this.disposed || className === this._className) { return; } @@ -60,7 +61,7 @@ class FastLabelNode { this._element.className = className; } - public set title(title: string) { + set title(title: string) { if (this.disposed || title === this._title) { return; } @@ -73,7 +74,7 @@ class FastLabelNode { } } - public set empty(empty: boolean) { + set empty(empty: boolean) { if (this.disposed || empty === this._empty) { return; } @@ -82,12 +83,12 @@ class FastLabelNode { this._element.style.marginLeft = empty ? '0' : null; } - public dispose(): void { + dispose(): void { this.disposed = true; } } -export class IconLabel { +export class IconLabel extends Disposable { private domNode: FastLabelNode; private labelDescriptionContainer: FastLabelNode; private labelNode: FastLabelNode | HighlightedLabel; @@ -95,34 +96,36 @@ export class IconLabel { private descriptionNodeFactory: () => FastLabelNode | HighlightedLabel; constructor(container: HTMLElement, options?: IIconLabelCreationOptions) { - this.domNode = new FastLabelNode(dom.append(container, dom.$('.monaco-icon-label'))); + super(); - this.labelDescriptionContainer = new FastLabelNode(dom.append(this.domNode.element, dom.$('.monaco-icon-label-description-container'))); + this.domNode = this._register(new FastLabelNode(dom.append(container, dom.$('.monaco-icon-label')))); + + this.labelDescriptionContainer = this._register(new FastLabelNode(dom.append(this.domNode.element, dom.$('.monaco-icon-label-description-container')))); if (options && options.supportHighlights) { - this.labelNode = new HighlightedLabel(dom.append(this.labelDescriptionContainer.element, dom.$('a.label-name'))); + this.labelNode = this._register(new HighlightedLabel(dom.append(this.labelDescriptionContainer.element, dom.$('a.label-name')))); } else { - this.labelNode = new FastLabelNode(dom.append(this.labelDescriptionContainer.element, dom.$('a.label-name'))); + this.labelNode = this._register(new FastLabelNode(dom.append(this.labelDescriptionContainer.element, dom.$('a.label-name')))); } if (options && options.supportDescriptionHighlights) { - this.descriptionNodeFactory = () => new HighlightedLabel(dom.append(this.labelDescriptionContainer.element, dom.$('span.label-description'))); + this.descriptionNodeFactory = () => this._register(new HighlightedLabel(dom.append(this.labelDescriptionContainer.element, dom.$('span.label-description')))); } else { - this.descriptionNodeFactory = () => new FastLabelNode(dom.append(this.labelDescriptionContainer.element, dom.$('span.label-description'))); + this.descriptionNodeFactory = () => this._register(new FastLabelNode(dom.append(this.labelDescriptionContainer.element, dom.$('span.label-description')))); } } - public get element(): HTMLElement { + get element(): HTMLElement { return this.domNode.element; } - public onClick(callback: (event: MouseEvent) => void): IDisposable { + onClick(callback: (event: MouseEvent) => void): IDisposable { return combinedDisposable([ dom.addDisposableListener(this.labelDescriptionContainer.element, dom.EventType.CLICK, (e: MouseEvent) => callback(e)), ]); } - public setValue(label?: string, description?: string, options?: IIconLabelValueOptions): void { + setValue(label?: string, description?: string, options?: IIconLabelValueOptions): void { const classes = ['monaco-icon-label']; if (options) { if (options.extraClasses) { @@ -162,15 +165,6 @@ export class IconLabel { } } } - - public dispose(): void { - this.domNode.dispose(); - this.labelNode.dispose(); - - if (this.descriptionNode) { - this.descriptionNode.dispose(); - } - } } export class FileLabel extends IconLabel { @@ -181,9 +175,9 @@ export class FileLabel extends IconLabel { this.setFile(file, provider, userHome); } - public setFile(file: uri, provider: IWorkspaceFolderProvider, userHome: IUserHomeProvider): void { + setFile(file: uri, provider: IWorkspaceFolderProvider, userHome: IUserHomeProvider): void { const parent = paths.dirname(file.fsPath); - this.setValue(getBaseLabel(file), parent && parent !== '.' ? getPathLabel(parent, provider, userHome) : '', { title: file.fsPath }); + this.setValue(getBaseLabel(file), parent && parent !== '.' ? getPathLabel(parent, userHome, provider) : '', { title: file.fsPath }); } } diff --git a/src/vs/base/browser/ui/iconLabel/iconlabel.css b/src/vs/base/browser/ui/iconLabel/iconlabel.css index 2b456ee676..f1d2e2b730 100644 --- a/src/vs/base/browser/ui/iconLabel/iconlabel.css +++ b/src/vs/base/browser/ui/iconLabel/iconlabel.css @@ -40,7 +40,6 @@ } .monaco-icon-label > .monaco-icon-label-description-container > .label-description { - opacity: 0.7; margin-left: 0.5em; font-size: 0.9em; white-space: pre; /* enable to show labels that include multiple whitespaces */ diff --git a/src/vs/base/browser/ui/inputbox/inputBox.ts b/src/vs/base/browser/ui/inputbox/inputBox.ts index 89b313cba8..713df08df8 100644 --- a/src/vs/base/browser/ui/inputbox/inputBox.ts +++ b/src/vs/base/browser/ui/inputbox/inputBox.ts @@ -18,6 +18,8 @@ import { Event, Emitter } from 'vs/base/common/event'; import { Widget } from 'vs/base/browser/ui/widget'; import { Color } from 'vs/base/common/color'; import { mixin } from 'vs/base/common/objects'; +import { HistoryNavigator } from 'vs/base/common/history'; +import { IHistoryNavigationWidget } from 'vs/base/browser/history'; const $ = dom.$; @@ -86,7 +88,7 @@ export const defaultOpts = { export class InputBox extends Widget { private contextViewProvider: IContextViewProvider; - private element: HTMLElement; + element: HTMLElement; private input: HTMLInputElement; private mirror: HTMLElement; private actionbar: ActionBar; @@ -528,4 +530,81 @@ export class InputBox extends Widget { super.dispose(); } -} \ No newline at end of file +} + +export interface IHistoryInputOptions extends IInputOptions { + history: string[]; +} + +export class HistoryInputBox extends InputBox implements IHistoryNavigationWidget { + + private readonly history: HistoryNavigator; + + constructor(container: HTMLElement, contextViewProvider: IContextViewProvider, options: IHistoryInputOptions) { + super(container, contextViewProvider, options); + this.history = new HistoryNavigator(options.history, 100); + } + + public addToHistory(): void { + if (this.value && this.value !== this.getCurrentValue()) { + this.history.add(this.value); + } + } + + public getHistory(): string[] { + return this.history.getHistory(); + } + + public showNextValue(): void { + if (!this.history.has(this.value)) { + this.addToHistory(); + } + + let next = this.getNextValue(); + if (next) { + next = next === this.value ? this.getNextValue() : next; + } + + if (next) { + this.value = next; + aria.status(this.value); + } + } + + public showPreviousValue(): void { + if (!this.history.has(this.value)) { + this.addToHistory(); + } + + let previous = this.getPreviousValue(); + if (previous) { + previous = previous === this.value ? this.getPreviousValue() : previous; + } + + if (previous) { + this.value = previous; + aria.status(this.value); + } + } + + public clearHistory(): void { + this.history.clear(); + } + + private getCurrentValue(): string { + let currentValue = this.history.current(); + if (!currentValue) { + currentValue = this.history.last(); + this.history.next(); + } + return currentValue; + } + + private getPreviousValue(): string { + return this.history.previous() || this.history.first(); + } + + private getNextValue(): string { + return this.history.next() || this.history.last(); + } +} diff --git a/src/vs/base/browser/ui/list/list.ts b/src/vs/base/browser/ui/list/list.ts index 830b700e78..1efe3aad58 100644 --- a/src/vs/base/browser/ui/list/list.ts +++ b/src/vs/base/browser/ui/list/list.ts @@ -5,7 +5,7 @@ import { GestureEvent } from 'vs/base/browser/touch'; -export interface IDelegate { +export interface IVirtualDelegate { getHeight(element: T): number; getTemplateId(element: T): string; } @@ -14,6 +14,7 @@ export interface IRenderer { templateId: string; renderTemplate(container: HTMLElement): TTemplateData; renderElement(element: TElement, index: number, templateData: TTemplateData): void; + disposeElement(element: TElement, index: number, templateData: TTemplateData): void; disposeTemplate(templateData: TTemplateData): void; } diff --git a/src/vs/base/browser/ui/list/listPaging.ts b/src/vs/base/browser/ui/list/listPaging.ts index ed71573ef5..91bbe38311 100644 --- a/src/vs/base/browser/ui/list/listPaging.ts +++ b/src/vs/base/browser/ui/list/listPaging.ts @@ -6,7 +6,7 @@ import 'vs/css!./list'; import { IDisposable } from 'vs/base/common/lifecycle'; import { range } from 'vs/base/common/arrays'; -import { IDelegate, IRenderer, IListEvent, IListOpenEvent } from './list'; +import { IVirtualDelegate, IRenderer, IListEvent, IListOpenEvent } from './list'; import { List, IListStyles, IListOptions } from './listWidget'; import { IPagedModel } from 'vs/base/common/paging'; import { Event, mapEvent } from 'vs/base/common/event'; @@ -50,6 +50,10 @@ class PagedRenderer implements IRenderer this.renderer.renderElement(entry, index, data.data)); } + disposeElement(): void { + // noop + } + disposeTemplate(data: ITemplateData): void { data.disposable.dispose(); data.disposable = null; @@ -65,12 +69,12 @@ export class PagedList implements IDisposable { constructor( container: HTMLElement, - delegate: IDelegate, + virtualDelegate: IVirtualDelegate, renderers: IPagedRenderer[], options: IListOptions = {} ) { const pagedRenderers = renderers.map(r => new PagedRenderer>(r, () => this.model)); - this.list = new List(container, delegate, pagedRenderers, options); + this.list = new List(container, virtualDelegate, pagedRenderers, options); } getHTMLElement(): HTMLElement { diff --git a/src/vs/base/browser/ui/list/listView.ts b/src/vs/base/browser/ui/list/listView.ts index 2c185f5c8f..be8879d863 100644 --- a/src/vs/base/browser/ui/list/listView.ts +++ b/src/vs/base/browser/ui/list/listView.ts @@ -12,7 +12,7 @@ import { domEvent } from 'vs/base/browser/event'; import { ScrollableElement } from 'vs/base/browser/ui/scrollbar/scrollableElement'; import { ScrollEvent, ScrollbarVisibility } from 'vs/base/common/scrollable'; import { RangeMap, IRange, relativeComplement, intersect, shift } from './rangeMap'; -import { IDelegate, IRenderer, IListMouseEvent, IListTouchEvent, IListGestureEvent } from './list'; +import { IVirtualDelegate, IRenderer, IListMouseEvent, IListTouchEvent, IListGestureEvent } from './list'; import { RowCache, IRow } from './rowCache'; import { isWindows } from 'vs/base/common/platform'; import * as browser from 'vs/base/browser/browser'; @@ -29,15 +29,6 @@ function canUseTranslate3d(): boolean { return false; } - // see https://github.com/Microsoft/vscode/issues/24483 - if (browser.isChromev56) { - const pixelRatio = browser.getPixelRatio(); - if (Math.floor(pixelRatio) !== pixelRatio) { - // Not an integer - return false; - } - } - return true; } @@ -81,7 +72,7 @@ export class ListView implements ISpliceable, IDisposable { constructor( container: HTMLElement, - private delegate: IDelegate, + private virtualDelegate: IVirtualDelegate, renderers: IRenderer[], options: IListViewOptions = DefaultOptions ) { @@ -165,8 +156,8 @@ export class ListView implements ISpliceable, IDisposable { const inserted = elements.map>(element => ({ id: String(this.itemId++), element, - size: this.delegate.getHeight(element), - templateId: this.delegate.getTemplateId(element), + size: this.virtualDelegate.getHeight(element), + templateId: this.virtualDelegate.getTemplateId(element), row: null })); @@ -320,6 +311,12 @@ export class ListView implements ISpliceable, IDisposable { private removeItemFromDOM(index: number): void { const item = this.items[index]; + const renderer = this.renderers.get(item.templateId); + + if (renderer.disposeElement) { + renderer.disposeElement(item.element, index, item.row.templateData); + } + this.cache.release(item.row); item.row = null; } @@ -380,7 +377,12 @@ export class ListView implements ISpliceable, IDisposable { } private onScroll(e: ScrollEvent): void { - this.render(e.scrollTop, e.height); + try { + this.render(e.scrollTop, e.height); + } catch (err) { + console.log('Got bad scroll event:', e); + throw err; + } } private onTouchChange(event: GestureEvent): void { @@ -493,7 +495,17 @@ export class ListView implements ISpliceable, IDisposable { // Dispose dispose() { - this.items = null; + if (this.items) { + for (const item of this.items) { + if (item.row) { + const renderer = this.renderers.get(item.row.templateId); + renderer.disposeTemplate(item.row.templateData); + item.row = null; + } + } + + this.items = null; + } if (this._domNode && this._domNode.parentElement) { this._domNode.parentNode.removeChild(this._domNode); diff --git a/src/vs/base/browser/ui/list/listWidget.ts b/src/vs/base/browser/ui/list/listWidget.ts index 797215350f..cef55568ae 100644 --- a/src/vs/base/browser/ui/list/listWidget.ts +++ b/src/vs/base/browser/ui/list/listWidget.ts @@ -4,6 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import 'vs/css!./list'; +import { localize } from 'vs/nls'; import { IDisposable, dispose } from 'vs/base/common/lifecycle'; import { isNumber } from 'vs/base/common/types'; import { range, firstIndex } from 'vs/base/common/arrays'; @@ -15,29 +16,19 @@ import { KeyCode } from 'vs/base/common/keyCodes'; import { StandardKeyboardEvent } from 'vs/base/browser/keyboardEvent'; import { Event, Emitter, EventBufferer, chain, mapEvent, anyEvent } from 'vs/base/common/event'; import { domEvent } from 'vs/base/browser/event'; -import { IDelegate, IRenderer, IListEvent, IListContextMenuEvent, IListMouseEvent, IListTouchEvent, IListGestureEvent, IListOpenEvent } from './list'; +import { IVirtualDelegate, IRenderer, IListEvent, IListContextMenuEvent, IListMouseEvent, IListTouchEvent, IListGestureEvent, IListOpenEvent } from './list'; import { ListView, IListViewOptions } from './listView'; import { Color } from 'vs/base/common/color'; import { mixin } from 'vs/base/common/objects'; import { ScrollbarVisibility } from 'vs/base/common/scrollable'; import { ISpliceable } from 'vs/base/common/sequence'; +import { CombinedSpliceable } from 'vs/base/browser/ui/list/splice'; import { clamp } from 'vs/base/common/numbers'; export interface IIdentityProvider { (element: T): string; } -class CombinedSpliceable implements ISpliceable { - - constructor(private spliceables: ISpliceable[]) { } - - splice(start: number, deleteCount: number, elements: T[]): void { - for (const spliceable of this.spliceables) { - spliceable.splice(start, deleteCount, elements); - } - } -} - interface ITraitChangeEvent { indexes: number[]; } @@ -78,6 +69,10 @@ class TraitRenderer implements IRenderer this.trait.renderIndex(index, templateData); } + disposeElement(): void { + // noop + } + splice(start: number, deleteCount: number, insertCount: number): void { const rendered: IRenderedContainer[] = []; @@ -361,6 +356,11 @@ class DOMFocusController implements IDisposable { return; } + const style = window.getComputedStyle(tabIndexElement); + if (style.visibility === 'hidden' || style.display === 'none') { + return; + } + e.preventDefault(); e.stopPropagation(); tabIndexElement.focus(); @@ -817,6 +817,14 @@ class PipelineRenderer implements IRenderer { } } + disposeElement(element: T, index: number, templateData: any[]): void { + let i = 0; + + for (const renderer of this.renderers) { + renderer.disposeElement(element, index, templateData[i++]); + } + } + disposeTemplate(templateData: any[]): void { let i = 0; @@ -881,7 +889,7 @@ export class List implements ISpliceable, IDisposable { constructor( container: HTMLElement, - delegate: IDelegate, + virtualDelegate: IVirtualDelegate, renderers: IRenderer[], options: IListOptions = DefaultOptions ) { @@ -892,7 +900,7 @@ export class List implements ISpliceable, IDisposable { renderers = renderers.map(r => new PipelineRenderer(r.templateId, [this.focus.renderer, this.selection.renderer, r])); - this.view = new ListView(container, delegate, renderers, options); + this.view = new ListView(container, virtualDelegate, renderers, options); this.view.domNode.setAttribute('role', 'tree'); DOM.addClass(this.view.domNode, this.idPrefix); this.view.domNode.tabIndex = 0; @@ -932,13 +940,21 @@ export class List implements ISpliceable, IDisposable { this.onSelectionChange(this._onSelectionChange, this, this.disposables); if (options.ariaLabel) { - this.view.domNode.setAttribute('aria-label', options.ariaLabel); + this.view.domNode.setAttribute('aria-label', localize('aria list', "{0}. Use the navigation keys to navigate.", options.ariaLabel)); } this.style(options); } splice(start: number, deleteCount: number, elements: T[] = []): void { + if (start < 0 || start > this.view.length) { + throw new Error(`Invalid start index: ${start}`); + } + + if (deleteCount < 0) { + throw new Error(`Invalid delete count: ${deleteCount}`); + } + if (deleteCount === 0 && elements.length === 0) { return; } diff --git a/src/vs/base/browser/ui/list/splice.ts b/src/vs/base/browser/ui/list/splice.ts new file mode 100644 index 0000000000..f58aa5d5c6 --- /dev/null +++ b/src/vs/base/browser/ui/list/splice.ts @@ -0,0 +1,21 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the Source EULA. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +'use strict'; + +import { ISpliceable } from 'vs/base/common/sequence'; + +export interface ISpreadSpliceable { + splice(start: number, deleteCount: number, ...elements: T[]): void; +} + +export class CombinedSpliceable implements ISpliceable { + + constructor(private spliceables: ISpliceable[]) { } + + splice(start: number, deleteCount: number, elements: T[]): void { + this.spliceables.forEach(s => s.splice(start, deleteCount, elements)); + } +} \ No newline at end of file diff --git a/src/vs/base/browser/ui/menu/menu.css b/src/vs/base/browser/ui/menu/menu.css index 0e58199c25..f5eb790484 100644 --- a/src/vs/base/browser/ui/menu/menu.css +++ b/src/vs/base/browser/ui/menu/menu.css @@ -5,6 +5,7 @@ .monaco-menu .monaco-action-bar.vertical { margin-left: 0; + overflow: visible; } .monaco-menu .monaco-action-bar.vertical .actions-container { @@ -34,30 +35,39 @@ background-color: #E4E4E4; } -.monaco-menu .monaco-action-bar.vertical .action-item:hover:not(.disabled) { - background-color: #EEE; +.monaco-menu .monaco-action-bar.vertical .action-menu-item { + -ms-flex: 1 1 auto; + flex: 1 1 auto; + display: -ms-flexbox; + display: flex; + height: 2.6em; + align-items: center; } .monaco-menu .monaco-action-bar.vertical .action-label { -ms-flex: 1 1 auto; flex: 1 1 auto; text-decoration: none; - padding: 0.8em 1em; - line-height: 1.1em; + padding: 0 1em; background: none; + font-size: inherit; + line-height: 1; } -.monaco-menu .monaco-action-bar.vertical .keybinding { +.monaco-menu .monaco-action-bar.vertical .keybinding, +.monaco-menu .monaco-action-bar.vertical .submenu-indicator { display: inline-block; -ms-flex: 2 1 auto; flex: 2 1 auto; - padding: 0.8em 1em; - line-height: 1.1em; - font-size: 12px; + padding: 0 1em; text-align: right; + font-size: inherit; + line-height: 1; } -.monaco-menu .monaco-action-bar.vertical .action-item.disabled .keybinding { + +.monaco-menu .monaco-action-bar.vertical .action-item.disabled .keybinding, +.monaco-menu .monaco-action-bar.vertical .action-item.disabled .submenu-indicator { opacity: 0.4; } @@ -87,6 +97,10 @@ color: inherit; } +.monaco-menu .monaco-action-bar.vertical .action-label.checked:after { + content: ' \2713'; +} + /* Context Menu */ .context-view.monaco-menu-container { @@ -103,19 +117,21 @@ animation: fadeIn 0.083s linear; } -.context-view.monaco-menu-container :focus { +.context-view.monaco-menu-container :focus, +.context-view.monaco-menu-container .monaco-action-bar.vertical:focus, +.context-view.monaco-menu-container .monaco-action-bar.vertical :focus { outline: 0; } +.monaco-menu .monaco-action-bar.vertical .action-item { + border: 1px solid transparent; /* prevents jumping behaviour on hover or focus */ +} + /* Dark theme */ .vs-dark .monaco-menu .monaco-action-bar.vertical .action-item.focused { background-color: #4B4C4D; } -.vs-dark .monaco-menu .monaco-action-bar.vertical .action-item:hover:not(.disabled) { - background-color: #3A3A3A; -} - .vs-dark .context-view.monaco-menu-container { box-shadow: 0 2px 8px #000; color: #BBB; @@ -133,9 +149,4 @@ .hc-black .monaco-menu .monaco-action-bar.vertical .action-item.focused { background: none; border: 1px dotted #f38518; -} - -.hc-black .monaco-menu .monaco-action-bar.vertical .action-item:hover:not(.disabled) { - background: none; - border: 1px dashed #f38518; } \ No newline at end of file diff --git a/src/vs/base/browser/ui/menu/menu.ts b/src/vs/base/browser/ui/menu/menu.ts index 09d9c6f14b..ee91903b33 100644 --- a/src/vs/base/browser/ui/menu/menu.ts +++ b/src/vs/base/browser/ui/menu/menu.ts @@ -6,18 +6,35 @@ 'use strict'; import 'vs/css!./menu'; +import * as nls from 'vs/nls'; import { IDisposable } from 'vs/base/common/lifecycle'; -import { IActionRunner, IAction } from 'vs/base/common/actions'; -import { ActionBar, IActionItemProvider, ActionsOrientation } from 'vs/base/browser/ui/actionbar/actionbar'; -import { ResolvedKeybinding } from 'vs/base/common/keyCodes'; +import { IActionRunner, IAction, Action } from 'vs/base/common/actions'; +import { ActionBar, IActionItemProvider, ActionsOrientation, Separator, ActionItem, IActionItemOptions, BaseActionItem } from 'vs/base/browser/ui/actionbar/actionbar'; +import { ResolvedKeybinding, KeyCode } from 'vs/base/common/keyCodes'; import { Event } from 'vs/base/common/event'; -import { addClass } from 'vs/base/browser/dom'; +import { addClass, EventType, EventHelper, EventLike, removeTabIndexAndUpdateFocus, isAncestor } from 'vs/base/browser/dom'; +import { StandardKeyboardEvent } from 'vs/base/browser/keyboardEvent'; +import { $, Builder } from 'vs/base/browser/builder'; +import { RunOnceScheduler } from 'vs/base/common/async'; export interface IMenuOptions { context?: any; actionItemProvider?: IActionItemProvider; actionRunner?: IActionRunner; getKeyBinding?: (action: IAction) => ResolvedKeybinding; + ariaLabel?: string; +} + + +export class SubmenuAction extends Action { + constructor(label: string, public entries: (SubmenuAction | IAction)[], cssClass?: string) { + super(!!cssClass ? cssClass : 'submenu', label, '', true); + } +} + +interface ISubMenuData { + parent: Menu; + submenu?: Menu; } export class Menu { @@ -27,20 +44,45 @@ export class Menu { constructor(container: HTMLElement, actions: IAction[], options: IMenuOptions = {}) { addClass(container, 'monaco-menu-container'); + container.setAttribute('role', 'presentation'); let menuContainer = document.createElement('div'); addClass(menuContainer, 'monaco-menu'); + menuContainer.setAttribute('role', 'presentation'); container.appendChild(menuContainer); + let parentData: ISubMenuData = { + parent: this + }; + this.actionBar = new ActionBar(menuContainer, { orientation: ActionsOrientation.VERTICAL, - actionItemProvider: options.actionItemProvider, + actionItemProvider: action => this.doGetActionItem(action, options, parentData), context: options.context, actionRunner: options.actionRunner, - isMenu: true + isMenu: true, + ariaLabel: options.ariaLabel }); - this.actionBar.push(actions, { icon: true, label: true }); + this.actionBar.push(actions, { icon: true, label: true, isMenu: true }); + } + + private doGetActionItem(action: IAction, options: IMenuOptions, parentData: ISubMenuData): BaseActionItem { + if (action instanceof Separator) { + return new ActionItem(options.context, action, { icon: true }); + } else if (action instanceof SubmenuAction) { + return new SubmenuActionItem(action, action.entries, parentData, options); + } else { + const menuItemOptions: IActionItemOptions = {}; + if (options.getKeyBinding) { + const keybinding = options.getKeyBinding(action); + if (keybinding) { + menuItemOptions.keybinding = keybinding.getLabel(); + } + } + + return new MenuActionItem(options.context, action, menuItemOptions); + } } public get onDidCancel(): Event { @@ -51,8 +93,10 @@ export class Menu { return this.actionBar.onDidBlur; } - public focus() { - this.actionBar.focus(true); + public focus(selectFirst = true) { + if (this.actionBar) { + this.actionBar.focus(selectFirst); + } } public dispose() { @@ -66,4 +110,277 @@ export class Menu { this.listener = null; } } +} + +class MenuActionItem extends BaseActionItem { + static MNEMONIC_REGEX: RegExp = /&&(.)/g; + + protected $e: Builder; + protected $label: Builder; + protected options: IActionItemOptions; + private cssClass: string; + + constructor(ctx: any, action: IAction, options: IActionItemOptions = {}) { + options.isMenu = true; + super(action, action, options); + + this.options = options; + this.options.icon = options.icon !== undefined ? options.icon : false; + this.options.label = options.label !== undefined ? options.label : true; + this.cssClass = ''; + } + + public render(container: HTMLElement): void { + super.render(container); + + this.$e = $('a.action-menu-item').appendTo(this.builder); + if (this._action.id === Separator.ID) { + // A separator is a presentation item + this.$e.attr({ role: 'presentation' }); + } else { + this.$e.attr({ role: 'menuitem' }); + } + + this.$label = $('span.action-label').appendTo(this.$e); + + if (this.options.label && this.options.keybinding) { + $('span.keybinding').text(this.options.keybinding).appendTo(this.$e); + } + + this._updateClass(); + this._updateLabel(); + this._updateTooltip(); + this._updateEnabled(); + this._updateChecked(); + } + + public focus(): void { + super.focus(); + this.$e.domFocus(); + } + + public _updateLabel(): void { + if (this.options.label) { + let label = this.getAction().label; + if (label) { + let matches = MenuActionItem.MNEMONIC_REGEX.exec(label); + if (matches && matches.length === 2) { + let mnemonic = matches[1]; + + let ariaLabel = label.replace(MenuActionItem.MNEMONIC_REGEX, mnemonic); + + this.$e.getHTMLElement().accessKey = mnemonic.toLocaleLowerCase(); + this.$label.attr('aria-label', ariaLabel); + } else { + this.$label.attr('aria-label', label); + } + + label = label.replace(MenuActionItem.MNEMONIC_REGEX, '$1\u0332'); + } + + this.$label.text(label); + } + } + + public _updateTooltip(): void { + let title: string = null; + + if (this.getAction().tooltip) { + title = this.getAction().tooltip; + + } else if (!this.options.label && this.getAction().label && this.options.icon) { + title = this.getAction().label; + + if (this.options.keybinding) { + title = nls.localize({ key: 'titleLabel', comment: ['action title', 'action keybinding'] }, "{0} ({1})", title, this.options.keybinding); + } + } + + if (title) { + this.$e.attr({ title: title }); + } + } + + public _updateClass(): void { + if (this.cssClass) { + this.$e.removeClass(this.cssClass); + } + if (this.options.icon) { + this.cssClass = this.getAction().class; + this.$label.addClass('icon'); + if (this.cssClass) { + this.$label.addClass(this.cssClass); + } + this._updateEnabled(); + } else { + this.$label.removeClass('icon'); + } + } + + public _updateEnabled(): void { + if (this.getAction().enabled) { + this.builder.removeClass('disabled'); + this.$e.removeClass('disabled'); + this.$e.attr({ tabindex: 0 }); + } else { + this.builder.addClass('disabled'); + this.$e.addClass('disabled'); + removeTabIndexAndUpdateFocus(this.$e.getHTMLElement()); + } + } + + public _updateChecked(): void { + if (this.getAction().checked) { + this.$label.addClass('checked'); + } else { + this.$label.removeClass('checked'); + } + } +} + +class SubmenuActionItem extends MenuActionItem { + private mysubmenu: Menu; + private submenuContainer: Builder; + private mouseOver: boolean; + private showScheduler: RunOnceScheduler; + private hideScheduler: RunOnceScheduler; + + constructor( + action: IAction, + private submenuActions: IAction[], + private parentData: ISubMenuData, + private submenuOptions?: IMenuOptions + ) { + super(action, action, { label: true, isMenu: true }); + + this.showScheduler = new RunOnceScheduler(() => { + if (this.mouseOver) { + this.cleanupExistingSubmenu(false); + this.createSubmenu(false); + } + }, 250); + + this.hideScheduler = new RunOnceScheduler(() => { + if ((!isAncestor(document.activeElement, this.builder.getHTMLElement()) && this.parentData.submenu === this.mysubmenu)) { + this.parentData.parent.focus(false); + this.cleanupExistingSubmenu(true); + } + }, 750); + } + + public render(container: HTMLElement): void { + super.render(container); + + this.$e.addClass('monaco-submenu-item'); + this.$e.attr('aria-haspopup', 'true'); + $('span.submenu-indicator').text('\u25B6').appendTo(this.$e); + + $(this.builder).on(EventType.KEY_UP, (e) => { + let event = new StandardKeyboardEvent(e as KeyboardEvent); + if (event.equals(KeyCode.RightArrow)) { + EventHelper.stop(e, true); + + this.createSubmenu(true); + } + }); + + $(this.builder).on(EventType.KEY_DOWN, (e) => { + let event = new StandardKeyboardEvent(e as KeyboardEvent); + if (event.equals(KeyCode.RightArrow)) { + EventHelper.stop(e, true); + } + }); + + $(this.builder).on(EventType.MOUSE_OVER, (e) => { + if (!this.mouseOver) { + this.mouseOver = true; + + this.showScheduler.schedule(); + } + }); + + $(this.builder).on(EventType.MOUSE_LEAVE, (e) => { + this.mouseOver = false; + }); + + $(this.builder).on(EventType.FOCUS_OUT, (e) => { + if (!isAncestor(document.activeElement, this.builder.getHTMLElement())) { + this.hideScheduler.schedule(); + } + }); + } + + public onClick(e: EventLike) { + // stop clicking from trying to run an action + EventHelper.stop(e, true); + + this.createSubmenu(false); + } + + private cleanupExistingSubmenu(force: boolean) { + if (this.parentData.submenu && (force || (this.parentData.submenu !== this.mysubmenu))) { + this.parentData.submenu.dispose(); + this.parentData.submenu = null; + + if (this.submenuContainer) { + this.submenuContainer.dispose(); + this.submenuContainer = null; + } + } + } + + private createSubmenu(selectFirstItem = true) { + if (!this.parentData.submenu) { + this.submenuContainer = $(this.builder).div({ class: 'monaco-submenu menubar-menu-items-holder context-view' }); + + $(this.submenuContainer).style({ + 'left': `${$(this.builder).getClientArea().width}px` + }); + + $(this.submenuContainer).on(EventType.KEY_UP, (e) => { + let event = new StandardKeyboardEvent(e as KeyboardEvent); + if (event.equals(KeyCode.LeftArrow)) { + EventHelper.stop(e, true); + + this.parentData.parent.focus(); + this.parentData.submenu.dispose(); + this.parentData.submenu = null; + + this.submenuContainer.dispose(); + this.submenuContainer = null; + } + }); + + $(this.submenuContainer).on(EventType.KEY_DOWN, (e) => { + let event = new StandardKeyboardEvent(e as KeyboardEvent); + if (event.equals(KeyCode.LeftArrow)) { + EventHelper.stop(e, true); + } + }); + + + this.parentData.submenu = new Menu(this.submenuContainer.getHTMLElement(), this.submenuActions, this.submenuOptions); + this.parentData.submenu.focus(selectFirstItem); + + this.mysubmenu = this.parentData.submenu; + } else { + this.parentData.submenu.focus(false); + } + } + + public dispose() { + super.dispose(); + + this.hideScheduler.dispose(); + + if (this.mysubmenu) { + this.mysubmenu.dispose(); + this.mysubmenu = null; + } + + if (this.submenuContainer) { + this.submenuContainer.dispose(); + this.submenuContainer = null; + } + } } \ No newline at end of file diff --git a/src/vs/base/browser/ui/octiconLabel/octiconLabel.ts b/src/vs/base/browser/ui/octiconLabel/octiconLabel.ts index 5faca97140..0332245db3 100644 --- a/src/vs/base/browser/ui/octiconLabel/octiconLabel.ts +++ b/src/vs/base/browser/ui/octiconLabel/octiconLabel.ts @@ -2,14 +2,13 @@ * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -'use strict'; import 'vs/css!./octicons/octicons'; import 'vs/css!./octicons/octicons-animations'; import { escape } from 'vs/base/common/strings'; function expand(text: string): string { - return text.replace(/\$\(((.+?)(~(.*?))?)\)/g, (match, g1, name, g3, animation) => { + return text.replace(/\$\(((.+?)(~(.*?))?)\)/g, (_match, _g1, name, _g3, animation) => { return ``; }); } @@ -20,11 +19,9 @@ export function renderOcticons(label: string): string { export class OcticonLabel { - private readonly _container: HTMLElement; - - constructor(container: HTMLElement) { - this._container = container; - } + constructor( + private readonly _container: HTMLElement + ) { } set text(text: string) { this._container.innerHTML = renderOcticons(text || ''); diff --git a/src/vs/base/browser/ui/octiconLabel/octicons/OSSREADME.json b/src/vs/base/browser/ui/octiconLabel/octicons/OSSREADME.json index 1fa5c4ad52..83493f39a4 100644 --- a/src/vs/base/browser/ui/octiconLabel/octicons/OSSREADME.json +++ b/src/vs/base/browser/ui/octiconLabel/octicons/OSSREADME.json @@ -6,7 +6,7 @@ "version": "3.1.0", "license": "MIT", "licenseDetail": [ - "The Source EULA", + "The MIT License (MIT)", "", "(c) 2012-2015 GitHub", "", diff --git a/src/vs/base/browser/ui/progressbar/progressbar.ts b/src/vs/base/browser/ui/progressbar/progressbar.ts index 1e87c908d0..38ff725b3d 100644 --- a/src/vs/base/browser/ui/progressbar/progressbar.ts +++ b/src/vs/base/browser/ui/progressbar/progressbar.ts @@ -10,7 +10,7 @@ import { TPromise, ValueCallback } from 'vs/base/common/winjs.base'; import * as assert from 'vs/base/common/assert'; import { Builder, $ } from 'vs/base/browser/builder'; import * as DOM from 'vs/base/browser/dom'; -import { IDisposable, dispose } from 'vs/base/common/lifecycle'; +import { Disposable } from 'vs/base/common/lifecycle'; import { Color } from 'vs/base/common/color'; import { mixin } from 'vs/base/common/objects'; @@ -35,9 +35,8 @@ const defaultOpts = { /** * A progress bar with support for infinite or discrete progress. */ -export class ProgressBar { +export class ProgressBar extends Disposable { private options: IProgressBarOptions; - private toUnbind: IDisposable[]; private workedVal: number; private element: Builder; private bit: HTMLElement; @@ -46,10 +45,11 @@ export class ProgressBar { private progressBarBackground: Color; constructor(container: HTMLElement, options?: IProgressBarOptions) { + super(); + this.options = options || Object.create(null); mixin(this.options, defaultOpts, false); - this.toUnbind = []; this.workedVal = 0; this.progressBarBackground = this.options.progressBarBackground; @@ -70,7 +70,7 @@ export class ProgressBar { break; } - }, this.toUnbind); + }, this.toDispose); this.bit = builder.getHTMLElement(); }); @@ -92,14 +92,14 @@ export class ProgressBar { /** * Indicates to the progress bar that all work is done. */ - public done(): ProgressBar { + done(): ProgressBar { return this.doDone(true); } /** * Stops the progressbar from showing any progress instantly without fading out. */ - public stop(): ProgressBar { + stop(): ProgressBar { return this.doDone(false); } @@ -133,7 +133,7 @@ export class ProgressBar { /** * Use this mode to indicate progress that has no total number of work units. */ - public infinite(): ProgressBar { + infinite(): ProgressBar { this.bit.style.width = '2%'; this.bit.style.opacity = '1'; @@ -149,7 +149,7 @@ export class ProgressBar { * Tells the progress bar the total number of work. Use in combination with workedVal() to let * the progress bar show the actual progress based on the work that is done. */ - public total(value: number): ProgressBar { + total(value: number): ProgressBar { this.workedVal = 0; this.totalWork = value; @@ -159,21 +159,36 @@ export class ProgressBar { /** * Finds out if this progress bar is configured with total work */ - public hasTotal(): boolean { + hasTotal(): boolean { return !isNaN(this.totalWork); } /** - * Tells the progress bar that an amount of work has been completed. + * Tells the progress bar that an increment of work has been completed. */ - public worked(value: number): ProgressBar { - assert.ok(!isNaN(this.totalWork), 'Total work not set'); - + worked(value: number): ProgressBar { value = Number(value); assert.ok(!isNaN(value), 'Value is not a number'); value = Math.max(1, value); - this.workedVal += value; + return this.doSetWorked(this.workedVal + value); + } + + /** + * Tells the progress bar the total amount of work that has been completed. + */ + setWorked(value: number): ProgressBar { + value = Number(value); + assert.ok(!isNaN(value), 'Value is not a number'); + value = Math.max(1, value); + + return this.doSetWorked(value); + } + + private doSetWorked(value: number): ProgressBar { + assert.ok(!isNaN(this.totalWork), 'Total work not set'); + + this.workedVal = value; this.workedVal = Math.min(this.totalWork, this.workedVal); if (this.element.hasClass(css_infinite)) { @@ -197,11 +212,11 @@ export class ProgressBar { return this; } - public getContainer(): HTMLElement { + getContainer(): HTMLElement { return this.element.getHTMLElement(); } - public show(delay?: number): void { + show(delay?: number): void { if (typeof delay === 'number') { this.element.showDelayed(delay); } else { @@ -209,11 +224,11 @@ export class ProgressBar { } } - public hide(): void { + hide(): void { this.element.hide(); } - public style(styles: IProgressBarStyles): void { + style(styles: IProgressBarStyles): void { this.progressBarBackground = styles.progressBarBackground; this.applyStyles(); @@ -226,8 +241,4 @@ export class ProgressBar { this.bit.style.backgroundColor = background; } } - - public dispose(): void { - this.toUnbind = dispose(this.toUnbind); - } } \ No newline at end of file diff --git a/src/vs/base/browser/ui/sash/sash.css b/src/vs/base/browser/ui/sash/sash.css index 287fea64c1..f140739567 100644 --- a/src/vs/base/browser/ui/sash/sash.css +++ b/src/vs/base/browser/ui/sash/sash.css @@ -9,28 +9,100 @@ touch-action: none; } +.monaco-sash.disabled { + pointer-events: none; +} + .monaco-sash.vertical { cursor: ew-resize; - height: 100%; top: 0; + width: 4px; + height: 100%; +} + +.monaco-sash.mac.vertical { + cursor: col-resize; +} + +.monaco-sash.vertical.minimum { + cursor: e-resize; +} + +.monaco-sash.vertical.maximum { + cursor: w-resize; } .monaco-sash.horizontal { cursor: ns-resize; - width: 100%; left: 0; + width: 100%; + height: 4px; +} + +.monaco-sash.mac.horizontal { + cursor: row-resize; +} + +.monaco-sash.horizontal.minimum { + cursor: s-resize; +} + +.monaco-sash.horizontal.maximum { + cursor: n-resize; +} + +.monaco-sash:not(.disabled).orthogonal-start::before, +.monaco-sash:not(.disabled).orthogonal-end::after { + content: ' '; + height: 8px; + width: 8px; + z-index: 100; + display: block; + cursor: all-scroll; + position: absolute; +} + +.monaco-sash.orthogonal-start.vertical::before { + left: -2px; + top: -4px; +} + +.monaco-sash.orthogonal-end.vertical::after { + left: -2px; + bottom: -4px; +} + +.monaco-sash.orthogonal-start.horizontal::before { + top: -2px; + left: -4px; +} + +.monaco-sash.orthogonal-end.horizontal::after { + top: -2px; + right: -4px; } .monaco-sash.disabled { cursor: default !important; } -/** Custom Mac Cursor */ +/** Touch **/ -.monaco-sash.mac.vertical { - cursor: col-resize; +.monaco-sash.touch.vertical { + width: 20px; } -.monaco-sash.mac.horizontal { - cursor: row-resize; +.monaco-sash.touch.horizontal { + height: 20px; +} + +/** Debug **/ + +.monaco-sash.debug:not(.disabled) { + background: cyan; +} + +.monaco-sash.debug:not(.disabled).orthogonal-start::before, +.monaco-sash.debug:not(.disabled).orthogonal-end::after { + background: red; } \ No newline at end of file diff --git a/src/vs/base/browser/ui/sash/sash.ts b/src/vs/base/browser/ui/sash/sash.ts index 94c7d4530b..129323ca37 100644 --- a/src/vs/base/browser/ui/sash/sash.ts +++ b/src/vs/base/browser/ui/sash/sash.ts @@ -6,15 +6,17 @@ 'use strict'; import 'vs/css!./sash'; -import { IDisposable, Disposable, dispose } from 'vs/base/common/lifecycle'; -import { Builder, $ } from 'vs/base/browser/builder'; +import { IDisposable, dispose } from 'vs/base/common/lifecycle'; import { isIPad } from 'vs/base/browser/browser'; import { isMacintosh } from 'vs/base/common/platform'; import * as types from 'vs/base/common/types'; import { EventType, GestureEvent, Gesture } from 'vs/base/browser/touch'; import { StandardMouseEvent } from 'vs/base/browser/mouseEvent'; import { Event, Emitter } from 'vs/base/common/event'; -import { getElementsByTagName, EventHelper, EventType as DOMEventType, createStyleSheet, addDisposableListener, Dimension } from 'vs/base/browser/dom'; +import { getElementsByTagName, EventHelper, createStyleSheet, addDisposableListener, append, $, addClass, removeClass, toggleClass } from 'vs/base/browser/dom'; +import { domEvent } from 'vs/base/browser/event'; + +const DEBUG = false; export interface ISashLayoutProvider { } @@ -39,8 +41,9 @@ export interface ISashEvent { } export interface ISashOptions { - baseSize?: number; orientation?: Orientation; + orthogonalStartSash?: Sash; + orthogonalEndSash?: Sash; } export enum Orientation { @@ -48,72 +51,123 @@ export enum Orientation { HORIZONTAL } +export enum SashState { + Disabled, + Minimum, + Maximum, + Enabled +} + export class Sash { - private $e: Builder; + private el: HTMLElement; private layoutProvider: ISashLayoutProvider; - private isDisabled: boolean; private hidden: boolean; private orientation: Orientation; - private size: number; + private disposables: IDisposable[] = []; - private _onDidStart = new Emitter(); - private _onDidChange = new Emitter(); - private _onDidReset = new Emitter(); - private _onDidEnd = new Emitter(); - - constructor(container: HTMLElement, layoutProvider: ISashLayoutProvider, options: ISashOptions = {}) { - this.$e = $('.monaco-sash').appendTo(container); - - if (isMacintosh) { - this.$e.addClass('mac'); + private _state: SashState = SashState.Enabled; + get state(): SashState { return this._state; } + set state(state: SashState) { + if (this._state === state) { + return; } - this.$e.on(DOMEventType.MOUSE_DOWN, (e) => { this.onMouseDown(e as MouseEvent); }); - this.$e.on(DOMEventType.DBLCLICK, (e) => this._onDidReset.fire()); - Gesture.addTarget(this.$e.getHTMLElement()); - this.$e.on(EventType.Start, (e) => { this.onTouchStart(e as GestureEvent); }); + toggleClass(this.el, 'disabled', state === SashState.Disabled); + toggleClass(this.el, 'minimum', state === SashState.Minimum); + toggleClass(this.el, 'maximum', state === SashState.Maximum); - this.size = options.baseSize || 5; + this._state = state; + this._onDidEnablementChange.fire(state); + } + + private readonly _onDidEnablementChange = new Emitter(); + readonly onDidEnablementChange: Event = this._onDidEnablementChange.event; + + private readonly _onDidStart = new Emitter(); + readonly onDidStart: Event = this._onDidStart.event; + + private readonly _onDidChange = new Emitter(); + readonly onDidChange: Event = this._onDidChange.event; + + private readonly _onDidReset = new Emitter(); + readonly onDidReset: Event = this._onDidReset.event; + + private readonly _onDidEnd = new Emitter(); + readonly onDidEnd: Event = this._onDidEnd.event; + + linkedSash: Sash | undefined = undefined; + + private orthogonalStartSashDisposables: IDisposable[] = []; + private _orthogonalStartSash: Sash | undefined; + get orthogonalStartSash(): Sash | undefined { return this._orthogonalStartSash; } + set orthogonalStartSash(sash: Sash | undefined) { + this.orthogonalStartSashDisposables = dispose(this.orthogonalStartSashDisposables); + + if (sash) { + sash.onDidEnablementChange(this.onOrthogonalStartSashEnablementChange, this, this.orthogonalStartSashDisposables); + this.onOrthogonalStartSashEnablementChange(sash.state); + } else { + this.onOrthogonalStartSashEnablementChange(SashState.Disabled); + } + + this._orthogonalStartSash = sash; + } + + private orthogonalEndSashDisposables: IDisposable[] = []; + private _orthogonalEndSash: Sash | undefined; + get orthogonalEndSash(): Sash | undefined { return this._orthogonalEndSash; } + set orthogonalEndSash(sash: Sash | undefined) { + this.orthogonalEndSashDisposables = dispose(this.orthogonalEndSashDisposables); + + if (sash) { + sash.onDidEnablementChange(this.onOrthogonalEndSashEnablementChange, this, this.orthogonalEndSashDisposables); + this.onOrthogonalEndSashEnablementChange(sash.state); + } else { + this.onOrthogonalEndSashEnablementChange(SashState.Disabled); + } + + this._orthogonalEndSash = sash; + } + + constructor(container: HTMLElement, layoutProvider: ISashLayoutProvider, options: ISashOptions = {}) { + this.el = append(container, $('.monaco-sash')); + + if (isMacintosh) { + addClass(this.el, 'mac'); + } + + domEvent(this.el, 'mousedown')(this.onMouseDown, this, this.disposables); + domEvent(this.el, 'dblclick')(this.onMouseDoubleClick, this, this.disposables); + + Gesture.addTarget(this.el); + domEvent(this.el, EventType.Start)(this.onTouchStart, this, this.disposables); if (isIPad) { - this.size *= 4; // see also http://ux.stackexchange.com/questions/39023/what-is-the-optimum-button-size-of-touch-screen-applications - this.$e.addClass('touch'); + // see also http://ux.stackexchange.com/questions/39023/what-is-the-optimum-button-size-of-touch-screen-applications + addClass(this.el, 'touch'); } this.setOrientation(options.orientation || Orientation.VERTICAL); - this.isDisabled = false; this.hidden = false; this.layoutProvider = layoutProvider; + + this.orthogonalStartSash = options.orthogonalStartSash; + this.orthogonalEndSash = options.orthogonalEndSash; + + toggleClass(this.el, 'debug', DEBUG); } - public get onDidStart(): Event { - return this._onDidStart.event; - } - - public get onDidChange(): Event { - return this._onDidChange.event; - } - - public get onDidReset(): Event { - return this._onDidReset.event; - } - - public get onDidEnd(): Event { - return this._onDidEnd.event; - } - - public setOrientation(orientation: Orientation): void { + setOrientation(orientation: Orientation): void { this.orientation = orientation; - this.$e.removeClass('horizontal', 'vertical'); - this.$e.addClass(this.getOrientation()); - if (this.orientation === Orientation.HORIZONTAL) { - this.$e.size(null, this.size); + addClass(this.el, 'horizontal'); + removeClass(this.el, 'vertical'); } else { - this.$e.size(this.size); + removeClass(this.el, 'horizontal'); + addClass(this.el, 'vertical'); } if (this.layoutProvider) { @@ -121,76 +175,124 @@ export class Sash { } } - private getOrientation(): 'horizontal' | 'vertical' { - return this.orientation === Orientation.HORIZONTAL ? 'horizontal' : 'vertical'; - } - private onMouseDown(e: MouseEvent): void { EventHelper.stop(e, false); - if (this.isDisabled) { + let isMultisashResize = false; + + if (this.linkedSash && !(e as any).__linkedSashEvent) { + (e as any).__linkedSashEvent = true; + this.linkedSash.onMouseDown(e); + } + + if (!(e as any).__orthogonalSashEvent) { + let orthogonalSash: Sash | undefined; + + if (this.orientation === Orientation.VERTICAL) { + if (e.offsetY <= 4) { + orthogonalSash = this.orthogonalStartSash; + } else if (e.offsetY >= this.el.clientHeight - 4) { + orthogonalSash = this.orthogonalEndSash; + } + } else { + if (e.offsetX <= 4) { + orthogonalSash = this.orthogonalStartSash; + } else if (e.offsetX >= this.el.clientWidth - 4) { + orthogonalSash = this.orthogonalEndSash; + } + } + + if (orthogonalSash) { + isMultisashResize = true; + (e as any).__orthogonalSashEvent = true; + orthogonalSash.onMouseDown(e); + } + } + + if (!this.state) { return; } - const iframes = $(getElementsByTagName('iframe')); - if (iframes) { - iframes.style('pointer-events', 'none'); // disable mouse events on iframes as long as we drag the sash + const iframes = getElementsByTagName('iframe'); + for (const iframe of iframes) { + iframe.style.pointerEvents = 'none'; // disable mouse events on iframes as long as we drag the sash } const mouseDownEvent = new StandardMouseEvent(e); const startX = mouseDownEvent.posx; const startY = mouseDownEvent.posy; const altKey = mouseDownEvent.altKey; + const startEvent: ISashEvent = { startX, currentX: startX, startY, currentY: startY, altKey }; - const startEvent: ISashEvent = { - startX: startX, - currentX: startX, - startY: startY, - currentY: startY, - altKey - }; - - this.$e.addClass('active'); + addClass(this.el, 'active'); this._onDidStart.fire(startEvent); - const $window = $(window); - // fix https://github.com/Microsoft/vscode/issues/21675 - const globalStyle = createStyleSheet(this.$e.getHTMLElement()); - if (this.orientation === Orientation.HORIZONTAL) { - globalStyle.innerHTML = `* { cursor: ${isMacintosh ? 'row-resize' : 'ns-resize'}; }`; - } else { - globalStyle.innerHTML = `* { cursor: ${isMacintosh ? 'col-resize' : 'ew-resize'}; }`; + const style = createStyleSheet(this.el); + const updateStyle = () => { + let cursor = ''; + + if (isMultisashResize) { + cursor = 'all-scroll'; + } else if (this.orientation === Orientation.HORIZONTAL) { + if (this.state === SashState.Minimum) { + cursor = 's-resize'; + } else if (this.state === SashState.Maximum) { + cursor = 'n-resize'; + } else { + cursor = isMacintosh ? 'row-resize' : 'ns-resize'; + } + } else { + if (this.state === SashState.Minimum) { + cursor = 'e-resize'; + } else if (this.state === SashState.Maximum) { + cursor = 'w-resize'; + } else { + cursor = isMacintosh ? 'col-resize' : 'ew-resize'; + } + } + + style.innerHTML = `* { cursor: ${cursor} !important; }`; + }; + + const disposables: IDisposable[] = []; + + updateStyle(); + + if (!isMultisashResize) { + this.onDidEnablementChange(updateStyle, null, disposables); } - $window.on('mousemove', (e) => { + const onMouseMove = (e: MouseEvent) => { EventHelper.stop(e, false); const mouseMoveEvent = new StandardMouseEvent(e as MouseEvent); - - const event: ISashEvent = { - startX: startX, - currentX: mouseMoveEvent.posx, - startY: startY, - currentY: mouseMoveEvent.posy, - altKey - }; + const event: ISashEvent = { startX, currentX: mouseMoveEvent.posx, startY, currentY: mouseMoveEvent.posy, altKey }; this._onDidChange.fire(event); - }).once('mouseup', (e) => { + }; + + const onMouseUp = (e: MouseEvent) => { EventHelper.stop(e, false); - this.$e.getHTMLElement().removeChild(globalStyle); + this.el.removeChild(style); - this.$e.removeClass('active'); + removeClass(this.el, 'active'); this._onDidEnd.fire(); - $window.off('mousemove'); + dispose(disposables); - const iframes = $(getElementsByTagName('iframe')); - if (iframes) { - iframes.style('pointer-events', 'auto'); + const iframes = getElementsByTagName('iframe'); + for (const iframe of iframes) { + iframe.style.pointerEvents = 'auto'; } - }); + }; + + domEvent(window, 'mousemove')(onMouseMove, null, disposables); + domEvent(window, 'mouseup')(onMouseUp, null, disposables); + } + + private onMouseDoubleClick(event: MouseEvent): void { + this._onDidReset.fire(); } private onTouchStart(event: GestureEvent): void { @@ -202,7 +304,6 @@ export class Sash { const startY = event.pageY; const altKey = event.altKey; - this._onDidStart.fire({ startX: startX, currentX: startX, @@ -211,7 +312,7 @@ export class Sash { altKey }); - listeners.push(addDisposableListener(this.$e.getHTMLElement(), EventType.Change, (event: GestureEvent) => { + listeners.push(addDisposableListener(this.el, EventType.Change, (event: GestureEvent) => { if (types.isNumber(event.pageX) && types.isNumber(event.pageY)) { this._onDidChange.fire({ startX: startX, @@ -223,163 +324,73 @@ export class Sash { } })); - listeners.push(addDisposableListener(this.$e.getHTMLElement(), EventType.End, (event: GestureEvent) => { + listeners.push(addDisposableListener(this.el, EventType.End, (event: GestureEvent) => { this._onDidEnd.fire(); dispose(listeners); })); } - public layout(): void { - let style: { top?: string; left?: string; height?: string; width?: string; }; + layout(): void { + const size = isIPad ? 20 : 4; if (this.orientation === Orientation.VERTICAL) { const verticalProvider = (this.layoutProvider); - style = { left: verticalProvider.getVerticalSashLeft(this) - (this.size / 2) + 'px' }; + this.el.style.left = verticalProvider.getVerticalSashLeft(this) - (size / 2) + 'px'; if (verticalProvider.getVerticalSashTop) { - style.top = verticalProvider.getVerticalSashTop(this) + 'px'; + this.el.style.top = verticalProvider.getVerticalSashTop(this) + 'px'; } if (verticalProvider.getVerticalSashHeight) { - style.height = verticalProvider.getVerticalSashHeight(this) + 'px'; + this.el.style.height = verticalProvider.getVerticalSashHeight(this) + 'px'; } } else { const horizontalProvider = (this.layoutProvider); - style = { top: horizontalProvider.getHorizontalSashTop(this) - (this.size / 2) + 'px' }; + this.el.style.top = horizontalProvider.getHorizontalSashTop(this) - (size / 2) + 'px'; if (horizontalProvider.getHorizontalSashLeft) { - style.left = horizontalProvider.getHorizontalSashLeft(this) + 'px'; + this.el.style.left = horizontalProvider.getHorizontalSashLeft(this) + 'px'; } if (horizontalProvider.getHorizontalSashWidth) { - style.width = horizontalProvider.getHorizontalSashWidth(this) + 'px'; + this.el.style.width = horizontalProvider.getHorizontalSashWidth(this) + 'px'; } } - - this.$e.style(style); } - public show(): void { + show(): void { this.hidden = false; - this.$e.show(); + this.el.style.removeProperty('display'); + this.el.setAttribute('aria-hidden', 'false'); } - public hide(): void { + hide(): void { this.hidden = true; - this.$e.hide(); + this.el.style.display = 'none'; + this.el.setAttribute('aria-hidden', 'true'); } - public isHidden(): boolean { + isHidden(): boolean { return this.hidden; } - public enable(): void { - this.$e.removeClass('disabled'); - this.isDisabled = false; + private onOrthogonalStartSashEnablementChange(state: SashState): void { + toggleClass(this.el, 'orthogonal-start', state !== SashState.Disabled); } - public disable(): void { - this.$e.addClass('disabled'); - this.isDisabled = true; + private onOrthogonalEndSashEnablementChange(state: SashState): void { + toggleClass(this.el, 'orthogonal-end', state !== SashState.Disabled); } - get enabled(): boolean { - return !this.isDisabled; - } + dispose(): void { + this.orthogonalStartSashDisposables = dispose(this.orthogonalStartSashDisposables); + this.orthogonalEndSashDisposables = dispose(this.orthogonalEndSashDisposables); - public dispose(): void { - if (this.$e) { - this.$e.destroy(); - this.$e = null; - } - } -} - -/** - * A simple Vertical Sash that computes the position of the sash when it is moved between the given dimension. - * Triggers onPositionChange event when the position is changed - */ -export class VSash extends Disposable implements IVerticalSashLayoutProvider { - private sash: Sash; - private ratio: number; - private startPosition: number; - private position: number; - private dimension: Dimension; - - private readonly _onPositionChange: Emitter = new Emitter(); - public get onPositionChange(): Event { return this._onPositionChange.event; } - - constructor(container: HTMLElement, private minWidth: number) { - super(); - - this.ratio = 0.5; - this.sash = new Sash(container, this); - - this._register(this.sash.onDidStart(() => this.onSashDragStart())); - this._register(this.sash.onDidChange((e: ISashEvent) => this.onSashDrag(e))); - this._register(this.sash.onDidEnd(() => this.onSashDragEnd())); - this._register(this.sash.onDidReset(() => this.onSashReset())); - } - - public getVerticalSashTop(): number { - return 0; - } - - public getVerticalSashLeft(): number { - return this.position; - } - - public getVerticalSashHeight(): number { - return this.dimension.height; - } - - public setDimenesion(dimension: Dimension) { - this.dimension = dimension; - this.compute(this.ratio); - } - - private onSashDragStart(): void { - this.startPosition = this.position; - } - - private onSashDrag(e: ISashEvent): void { - this.compute((this.startPosition + (e.currentX - e.startX)) / this.dimension.width); - } - - private compute(ratio: number) { - this.computeSashPosition(ratio); - this.ratio = this.position / this.dimension.width; - this._onPositionChange.fire(this.position); - } - - private onSashDragEnd(): void { - this.sash.layout(); - } - - private onSashReset(): void { - this.compute(0.5); - this._onPositionChange.fire(this.position); - this.sash.layout(); - } - - private computeSashPosition(sashRatio: number = this.ratio) { - const contentWidth = this.dimension.width; - let sashPosition = Math.floor((sashRatio || 0.5) * contentWidth); - const midPoint = Math.floor(0.5 * contentWidth); - - if (contentWidth > this.minWidth * 2) { - if (sashPosition < this.minWidth) { - sashPosition = this.minWidth; - } - if (sashPosition > contentWidth - this.minWidth) { - sashPosition = contentWidth - this.minWidth; - } - } else { - sashPosition = midPoint; - } - if (this.position !== sashPosition) { - this.position = sashPosition; - this.sash.layout(); + if (this.el && this.el.parentElement) { + this.el.parentElement.removeChild(this.el); } + + this.el = null; + this.disposables = dispose(this.disposables); } } diff --git a/src/vs/base/browser/ui/scrollbar/scrollableElement.ts b/src/vs/base/browser/ui/scrollbar/scrollableElement.ts index d48b29cee7..e8a80c9cd1 100644 --- a/src/vs/base/browser/ui/scrollbar/scrollableElement.ts +++ b/src/vs/base/browser/ui/scrollbar/scrollableElement.ts @@ -163,6 +163,8 @@ export abstract class AbstractScrollableElement extends Widget { private readonly _hideTimeout: TimeoutTimer; private _shouldRender: boolean; + private _revealOnScroll: boolean; + private readonly _onScroll = this._register(new Emitter()); public readonly onScroll: Event = this._onScroll.event; @@ -221,6 +223,8 @@ export abstract class AbstractScrollableElement extends Widget { this._mouseIsOver = false; this._shouldRender = true; + + this._revealOnScroll = true; } public dispose(): void { @@ -286,6 +290,10 @@ export abstract class AbstractScrollableElement extends Widget { } } + public setRevealOnScroll(value: boolean) { + this._revealOnScroll = value; + } + // -------------------- mouse wheel scrolling -------------------- private _setListeningToMouseWheel(shouldListen: boolean): void { @@ -382,7 +390,9 @@ export abstract class AbstractScrollableElement extends Widget { this._shouldRender = true; } - this._reveal(); + if (this._revealOnScroll) { + this._reveal(); + } if (!this._options.lazyRender) { this._render(); diff --git a/src/vs/base/browser/ui/selectBox/selectBox.ts b/src/vs/base/browser/ui/selectBox/selectBox.ts index b03c030a6f..16d5fa5036 100644 --- a/src/vs/base/browser/ui/selectBox/selectBox.ts +++ b/src/vs/base/browser/ui/selectBox/selectBox.ts @@ -5,7 +5,6 @@ import 'vs/css!./selectBox'; -import { IDisposable, dispose } from 'vs/base/common/lifecycle'; import { Event } from 'vs/base/common/event'; import { Widget } from 'vs/base/browser/ui/widget'; import { Color } from 'vs/base/common/color'; @@ -24,6 +23,7 @@ export interface ISelectBoxDelegate { readonly onDidSelect: Event; setOptions(options: string[], selected?: number, disabled?: number): void; select(index: number): void; + setAriaLabel(label: string); focus(): void; blur(): void; dispose(): void; @@ -35,7 +35,6 @@ export interface ISelectBoxDelegate { } export interface ISelectBoxOptions { - // {{SQL CARBON EDIT}} ariaLabel?: string; minBottomMargin?: number; } @@ -65,15 +64,12 @@ export class SelectBox extends Widget implements ISelectBoxDelegate { protected selectBackground: Color; protected selectForeground: Color; protected selectBorder: Color; - private toDispose: IDisposable[]; private styles: ISelectBoxStyles; private selectBoxDelegate: ISelectBoxDelegate; constructor(options: string[], selected: number, contextViewProvider: IContextViewProvider, styles: ISelectBoxStyles = deepClone(defaultStyles), selectBoxOptions?: ISelectBoxOptions) { super(); - this.toDispose = []; - mixin(this.styles, defaultStyles, false); // Instantiate select implementation based on platform @@ -87,7 +83,7 @@ export class SelectBox extends Widget implements ISelectBoxDelegate { // {{SQL CARBON EDIT}} this.selectElement = (this.selectBoxDelegate).selectElement; - this.toDispose.push(this.selectBoxDelegate); + this._register(this.selectBoxDelegate); } // Public SelectBox Methods - routed through delegate interface @@ -104,6 +100,10 @@ export class SelectBox extends Widget implements ISelectBoxDelegate { this.selectBoxDelegate.select(index); } + public setAriaLabel(label: string): void { + this.selectBoxDelegate.setAriaLabel(label); + } + public focus(): void { this.selectBoxDelegate.focus(); } @@ -125,7 +125,6 @@ export class SelectBox extends Widget implements ISelectBoxDelegate { public applyStyles(): void { this.selectBoxDelegate.applyStyles(); } - // {{SQL CARBON EDIT}} protected createOption(value: string, disabled?: boolean): HTMLOptionElement { let option = document.createElement('option'); @@ -136,8 +135,4 @@ export class SelectBox extends Widget implements ISelectBoxDelegate { return option; } - public dispose(): void { - this.toDispose = dispose(this.toDispose); - super.dispose(); - } } \ No newline at end of file diff --git a/src/vs/base/browser/ui/selectBox/selectBoxCustom.css b/src/vs/base/browser/ui/selectBox/selectBoxCustom.css index e9e8010616..cd07925675 100644 --- a/src/vs/base/browser/ui/selectBox/selectBoxCustom.css +++ b/src/vs/base/browser/ui/selectBox/selectBoxCustom.css @@ -3,6 +3,17 @@ * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ +/* Use custom CSS vars to expose padding into parent select for padding calculation */ +.monaco-select-box-dropdown-padding { + --dropdown-padding-top: 1px; + --dropdown-padding-bottom: 1px; +} + +.hc-black .monaco-select-box-dropdown-padding { + --dropdown-padding-top: 3px; + --dropdown-padding-bottom: 4px; +} + .monaco-select-box-dropdown-container { display: none; } @@ -18,8 +29,8 @@ .monaco-select-box-dropdown-container > .select-box-dropdown-list-container { flex: 0 0 auto; align-self: flex-start; - padding-bottom: 1px; - padding-top: 1px; + padding-top: var(--dropdown-padding-top); + padding-bottom: var(--dropdown-padding-bottom); padding-left: 1px; padding-right: 1px; width: 100%; @@ -32,8 +43,8 @@ } .hc-black .monaco-select-box-dropdown-container > .select-box-dropdown-list-container { - padding-bottom: 4px; - padding-top: 3px; + padding-top: var(--dropdown-padding-top); + padding-bottom: var(--dropdown-padding-bottom); } .monaco-select-box-dropdown-container > .select-box-dropdown-list-container .monaco-list .monaco-list-row > .option-text { diff --git a/src/vs/base/browser/ui/selectBox/selectBoxCustom.ts b/src/vs/base/browser/ui/selectBox/selectBoxCustom.ts index 671bcd3f04..8901ec4bd6 100644 --- a/src/vs/base/browser/ui/selectBox/selectBoxCustom.ts +++ b/src/vs/base/browser/ui/selectBox/selectBoxCustom.ts @@ -12,9 +12,9 @@ import { KeyCode, KeyCodeUtils } from 'vs/base/common/keyCodes'; import { StandardKeyboardEvent } from 'vs/base/browser/keyboardEvent'; import * as dom from 'vs/base/browser/dom'; import * as arrays from 'vs/base/common/arrays'; -import { IContextViewProvider } from 'vs/base/browser/ui/contextview/contextview'; +import { IContextViewProvider, AnchorPosition } from 'vs/base/browser/ui/contextview/contextview'; import { List } from 'vs/base/browser/ui/list/listWidget'; -import { IDelegate, IRenderer } from 'vs/base/browser/ui/list/list'; +import { IVirtualDelegate, IRenderer } from 'vs/base/browser/ui/list/list'; import { domEvent } from 'vs/base/browser/event'; import { ScrollbarVisibility } from 'vs/base/common/scrollable'; import { ISelectBoxDelegate, ISelectBoxOptions, ISelectBoxStyles, ISelectData } from 'vs/base/browser/ui/selectBox/selectBox'; @@ -58,6 +58,9 @@ class SelectListRenderer implements IRendererdata.root), 'option-disabled'); @@ -67,14 +70,20 @@ class SelectListRenderer implements IRenderer { +export class SelectBoxList implements ISelectBoxDelegate, IVirtualDelegate { private static readonly DEFAULT_DROPDOWN_MINIMUM_BOTTOM_MARGIN = 32; + private static readonly DEFAULT_DROPDOWN_MINIMUM_TOP_MARGIN = 42; + private static readonly DEFAULT_MINIMUM_VISIBLE_OPTIONS = 3; private _isVisible: boolean; private selectBoxOptions: ISelectBoxOptions; @@ -94,6 +103,7 @@ export class SelectBoxList implements ISelectBoxDelegate, IDelegate(); + this.styles = styles; this.registerListeners(); @@ -139,7 +150,8 @@ export class SelectBoxList implements ISelectBoxDelegate, IDelegate this.selectElement, render: (container: HTMLElement) => this.renderSelectDropDown(container), @@ -388,8 +414,11 @@ export class SelectBoxList implements ISelectBoxDelegate, IDelegate { dom.toggleClass(this.selectDropDownContainer, 'visible', false); dom.toggleClass(this.selectElement, 'synthetic-focus', false); - } + }, + anchorPosition: this._dropDownPosition }); + + // Track initial selection the case user escape, blur this._currentSelection = this.selected; } @@ -414,60 +443,91 @@ export class SelectBoxList implements ISelectBoxDelegate, IDelegate { + // contextView will dispose itself if moving from one View to another try { container.removeChild(this.selectDropDownContainer); // remove to take out the CSS rules we add - } catch(e) { - // if this fails it means it is already removed + } + catch (error) { + // Ignore, removed already by change of focus } } }; } - private layoutSelectDropDown() { + private layoutSelectDropDown(preLayoutPosition?: boolean) { // Layout ContextView drop down select list and container - // Have to manage our vertical overflow, sizing - // Need to be visible to measure + // Have to manage our vertical overflow, sizing, position below or above + // Position has to be determined and set prior to contextView instantiation - dom.toggleClass(this.selectDropDownContainer, 'visible', true); - - const selectWidth = dom.getTotalWidth(this.selectElement); - const selectPosition = dom.getDomNodePagePosition(this.selectElement); - - // Set container height to max from select bottom to margin (default/minBottomMargin) - let maxSelectDropDownHeight = (window.innerHeight - selectPosition.top - selectPosition.height - this.selectBoxOptions.minBottomMargin); - - if (maxSelectDropDownHeight < 0) { - maxSelectDropDownHeight = 0; - } - - // SetUp list dimensions and layout - account for container padding if (this.selectList) { + + const selectPosition = dom.getDomNodePagePosition(this.selectElement); + const styles = getComputedStyle(this.selectElement); + const verticalPadding = parseFloat(styles.getPropertyValue('--dropdown-padding-top')) + parseFloat(styles.getPropertyValue('--dropdown-padding-bottom')); + let maxSelectDropDownHeight = 0; + maxSelectDropDownHeight = (window.innerHeight - selectPosition.top - selectPosition.height - this.selectBoxOptions.minBottomMargin); + this.selectList.layout(); let listHeight = this.selectList.contentHeight; - const listContainerHeight = dom.getTotalHeight(this.selectDropDownListContainer); - const totalVerticalListPadding = listContainerHeight - listHeight; - // Always show complete list items - never more than Max available vertical height - if (listContainerHeight > maxSelectDropDownHeight) { - listHeight = ((Math.floor((maxSelectDropDownHeight - totalVerticalListPadding) / this.getHeight())) * this.getHeight()); + // If we are only doing pre-layout check/adjust position only + // Calculate vertical space available, flip up if insufficient + // Use reflected padding on parent select, ContextView style properties not available before DOM attachment + if (preLayoutPosition) { + + // Always show complete list items - never more than Max available vertical height + if (listHeight + verticalPadding > maxSelectDropDownHeight) { + const maxVisibleOptions = ((Math.floor((maxSelectDropDownHeight - verticalPadding) / this.getHeight()))); + + // Check if we can at least show min items otherwise flip above + if (maxVisibleOptions < SelectBoxList.DEFAULT_MINIMUM_VISIBLE_OPTIONS) { + this._dropDownPosition = AnchorPosition.ABOVE; + } else { + this._dropDownPosition = AnchorPosition.BELOW; + } + } + // Do full layout on showSelectDropDown only + return; } + // Make visible to enable measurements + dom.toggleClass(this.selectDropDownContainer, 'visible', true); + + // SetUp list dimensions and layout - account for container padding + // Use position to check above or below available space + if (this._dropDownPosition === AnchorPosition.BELOW) { + // Set container height to max from select bottom to margin (default/minBottomMargin) + if (listHeight + verticalPadding > maxSelectDropDownHeight) { + listHeight = ((Math.floor((maxSelectDropDownHeight - verticalPadding) / this.getHeight())) * this.getHeight()); + } + } else { + // Set container height to max from select top to margin (default/minTopMargin) + maxSelectDropDownHeight = (selectPosition.top - SelectBoxList.DEFAULT_DROPDOWN_MINIMUM_TOP_MARGIN); + if (listHeight + verticalPadding > maxSelectDropDownHeight) { + listHeight = ((Math.floor((maxSelectDropDownHeight - SelectBoxList.DEFAULT_DROPDOWN_MINIMUM_TOP_MARGIN) / this.getHeight())) * this.getHeight()); + } + } + + // Set adjusted list height and relayout this.selectList.layout(listHeight); this.selectList.domFocus(); // Finally set focus on selected item - this.selectList.setFocus([this.selected]); - this.selectList.reveal(this.selectList.getFocus()[0]); + if (this.selectList.length > 0) { + this.selectList.setFocus([this.selected || 0]); + this.selectList.reveal(this.selectList.getFocus()[0] || 0); + } // Set final container height after adjustments - this.selectDropDownContainer.style.height = (listHeight + totalVerticalListPadding) + 'px'; + this.selectDropDownContainer.style.height = (listHeight + verticalPadding) + 'px'; - // Determine optimal width - min(longest option), opt(parent select), max(ContextView controlled) + // Determine optimal width - min(longest option), opt(parent select, excluding margins), max(ContextView controlled) + const selectWidth = this.selectElement.offsetWidth; const selectMinWidth = this.setWidthControlElement(this.widthControlElement); const selectOptimalWidth = Math.max(selectMinWidth, Math.round(selectWidth)).toString() + 'px'; - this.selectDropDownContainer.style.minWidth = selectOptimalWidth; + this.selectDropDownContainer.style.width = selectOptimalWidth; // Maintain focus outline on parent select as well as list container - tabindex for focus this.selectDropDownListContainer.setAttribute('tabindex', '0'); @@ -510,6 +570,7 @@ export class SelectBoxList implements ISelectBoxDelegate, IDelegate this.onMouseUp(e), this, this.toDispose); this.toDispose.push(this.selectList.onDidBlur(e => this.onListBlur())); + + this.selectList.getHTMLElement().setAttribute('aria-expanded', 'true'); } // List methods - // List mouse controller - active exit, select option, fire onDidSelect, return focus to parent select + // List mouse controller - active exit, select option, fire onDidSelect if change, return focus to parent select private onMouseUp(e: MouseEvent): void { + dom.EventHelper.stop(e); + // Check our mouse event is on an option (not scrollbar) if (!e.toElement.classList.contains('option-text')) { return; @@ -563,59 +628,58 @@ export class SelectBoxList implements ISelectBoxDelegate, IDelegate= 0) { + + if (this.selected !== this._currentSelection) { + // Reset selected to current if no change this.select(this._currentSelection); } - this._onDidSelect.fire({ - index: this.selectElement.selectedIndex, - selected: this.selectElement.title - }); - this.hideSelectDropDown(false); } // List keyboard controller - // List exit - active - hide ContextView dropdown, return focus to parent select, fire onDidSelect + + // List exit - active - hide ContextView dropdown, reset selection, return focus to parent select private onEscape(e: StandardKeyboardEvent): void { dom.EventHelper.stop(e); + + // Reset selection to value when opened this.select(this._currentSelection); - this.hideSelectDropDown(true); - - this._onDidSelect.fire({ - index: this.selectElement.selectedIndex, - selected: this.selectElement.title - }); } - // List exit - active - hide ContextView dropdown, return focus to parent select, fire onDidSelect + // List exit - active - hide ContextView dropdown, return focus to parent select, fire onDidSelect if change private onEnter(e: StandardKeyboardEvent): void { dom.EventHelper.stop(e); - // Reset current selection - this._currentSelection = -1; + // Only fire if selection change + if (this.selected !== this._currentSelection) { + this._currentSelection = this.selected; + this._onDidSelect.fire({ + index: this.selectElement.selectedIndex, + selected: this.selectElement.title + }); + } this.hideSelectDropDown(true); - this._onDidSelect.fire({ - index: this.selectElement.selectedIndex, - selected: this.selectElement.title - }); } // List navigation - have to handle a disabled option (jump over) diff --git a/src/vs/base/browser/ui/selectBox/selectBoxNative.ts b/src/vs/base/browser/ui/selectBox/selectBoxNative.ts index 7c4527606a..81820e1e4b 100644 --- a/src/vs/base/browser/ui/selectBox/selectBoxNative.ts +++ b/src/vs/base/browser/ui/selectBox/selectBoxNative.ts @@ -8,30 +8,30 @@ import { Event, Emitter } from 'vs/base/common/event'; import { KeyCode } from 'vs/base/common/keyCodes'; import * as dom from 'vs/base/browser/dom'; import * as arrays from 'vs/base/common/arrays'; -import { ISelectBoxDelegate, ISelectBoxStyles, ISelectData, ISelectBoxOptions } from 'vs/base/browser/ui/selectBox/selectBox'; +import { ISelectBoxDelegate, ISelectBoxOptions, ISelectBoxStyles, ISelectData } from 'vs/base/browser/ui/selectBox/selectBox'; import { isMacintosh } from 'vs/base/common/platform'; export class SelectBoxNative implements ISelectBoxDelegate { // {{SQL CARBON EDIT}} public selectElement: HTMLSelectElement; + private selectBoxOptions: ISelectBoxOptions; private options: string[]; private selected: number; private readonly _onDidSelect: Emitter; private toDispose: IDisposable[]; private styles: ISelectBoxStyles; - // {{SQL CARBON EDIT}} constructor(options: string[], selected: number, styles: ISelectBoxStyles, selectBoxOptions?: ISelectBoxOptions) { this.toDispose = []; + this.selectBoxOptions = selectBoxOptions || Object.create(null); this.selectElement = document.createElement('select'); this.selectElement.className = 'monaco-select-box'; - // {{SQL CARBON EDIT}} - if (selectBoxOptions && selectBoxOptions.ariaLabel) { - this.selectElement.setAttribute('aria-label', selectBoxOptions.ariaLabel); + if (typeof this.selectBoxOptions.ariaLabel === 'string') { + this.selectElement.setAttribute('aria-label', this.selectBoxOptions.ariaLabel); } this._onDidSelect = new Emitter(); @@ -39,7 +39,6 @@ export class SelectBoxNative implements ISelectBoxDelegate { this.styles = styles; this.registerListeners(); - this.setOptions(options, selected); } @@ -110,6 +109,11 @@ export class SelectBoxNative implements ISelectBoxDelegate { this.selectElement.title = this.options[this.selected]; } + public setAriaLabel(label: string): void { + this.selectBoxOptions.ariaLabel = label; + this.selectElement.setAttribute('aria-label', label); + } + public focus(): void { if (this.selectElement) { this.selectElement.focus(); diff --git a/src/vs/base/browser/ui/splitview/grid.ts b/src/vs/base/browser/ui/splitview/grid.ts deleted file mode 100644 index 2502285804..0000000000 --- a/src/vs/base/browser/ui/splitview/grid.ts +++ /dev/null @@ -1,149 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the Source EULA. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -'use strict'; - -import { Event, anyEvent } from 'vs/base/common/event'; -import { Orientation } from 'vs/base/browser/ui/sash/sash'; -import { append, $ } from 'vs/base/browser/dom'; -import { SplitView, IView } from 'vs/base/browser/ui/splitview/splitview'; -export { Orientation } from 'vs/base/browser/ui/sash/sash'; - -export class GridNode implements IView { - - get minimumSize(): number { - let result = 0; - - for (const child of this.children) { - for (const grandchild of child.children) { - result += grandchild.minimumSize; - } - } - - return result === 0 ? 50 : result; - } - - readonly maximumSize = Number.MAX_VALUE; - - private _onDidChange: Event = Event.None; - get onDidChange(): Event { - return this._onDidChange; - } - - protected orientation: Orientation | undefined; - protected size: number | undefined; - protected orthogonalSize: number | undefined; - private splitview: SplitView | undefined; - private children: GridNode[] = []; - private color: string | undefined; - - constructor(private parent?: GridNode, orthogonalSize?: number, color?: string) { - this.orthogonalSize = orthogonalSize; - this.color = color || `hsl(${Math.round(Math.random() * 360)}, 72%, 72%)`; - } - - render(container: HTMLElement): void { - container = append(container, $('.node')); - container.style.backgroundColor = this.color; - - append(container, $('.action', { onclick: () => this.split(container, Orientation.HORIZONTAL) }, '⬌')); - append(container, $('.action', { onclick: () => this.split(container, Orientation.VERTICAL) }, '⬍')); - } - - protected split(container: HTMLElement, orientation: Orientation): void { - if (this.parent && this.parent.orientation === orientation) { - const index = this.parent.children.indexOf(this); - this.parent.addChild(this.size / 2, this.orthogonalSize, index + 1); - } else { - this.branch(container, orientation); - } - } - - protected branch(container: HTMLElement, orientation: Orientation): void { - this.orientation = orientation; - container.innerHTML = ''; - - this.splitview = new SplitView(container, { orientation }); - this.layout(this.size); - this.orthogonalLayout(this.orthogonalSize); - - this.addChild(this.orthogonalSize / 2, this.size, 0, this.color); - this.addChild(this.orthogonalSize / 2, this.size); - } - - layout(size: number): void { - this.size = size; - - for (const child of this.children) { - child.orthogonalLayout(size); - } - } - - orthogonalLayout(size: number): void { - this.orthogonalSize = size; - - if (this.splitview) { - this.splitview.layout(size); - } - } - - private addChild(size: number, orthogonalSize: number, index?: number, color?: string): void { - const child = new GridNode(this, orthogonalSize, color); - this.splitview.addView(child, size, index); - - if (typeof index === 'number') { - this.children.splice(index, 0, child); - } else { - this.children.push(child); - } - - this._onDidChange = anyEvent(...this.children.map(c => c.onDidChange)); - } -} - -export class RootGridNode extends GridNode { - - private width: number; - private height: number; - - protected branch(container: HTMLElement, orientation: Orientation): void { - if (orientation === Orientation.VERTICAL) { - this.size = this.width; - this.orthogonalSize = this.height; - } else { - this.size = this.height; - this.orthogonalSize = this.width; - } - - super.branch(container, orientation); - } - - layoutBox(width: number, height: number): void { - if (this.orientation === Orientation.VERTICAL) { - this.layout(width); - this.orthogonalLayout(height); - } else if (this.orientation === Orientation.HORIZONTAL) { - this.layout(height); - this.orthogonalLayout(width); - } else { - this.width = width; - this.height = height; - } - } -} - -export class Grid { - - private root: RootGridNode; - - constructor(container: HTMLElement) { - this.root = new RootGridNode(); - this.root.render(container); - } - - layout(width: number, height: number): void { - this.root.layoutBox(width, height); - } -} diff --git a/src/vs/base/browser/ui/splitview/panelview.ts b/src/vs/base/browser/ui/splitview/panelview.ts index e6de8ed798..05516ba8ad 100644 --- a/src/vs/base/browser/ui/splitview/panelview.ts +++ b/src/vs/base/browser/ui/splitview/panelview.ts @@ -30,6 +30,15 @@ export interface IPanelStyles { headerHighContrastBorder?: Color; } +/** + * A Panel is a structured SplitView view. + * + * WARNING: You must call `render()` after you contruct it. + * It can't be done automatically at the end of the ctor + * because of the order of property initialization in TypeScript. + * Subclasses wouldn't be able to set own properties + * before the `render()` call, thus forbiding their use. + */ export abstract class Panel implements IView { private static readonly HEADER_SIZE = 22; @@ -40,25 +49,21 @@ export abstract class Panel implements IView { private _minimumBodySize: number; private _maximumBodySize: number; private ariaHeaderLabel: string; - private styles: IPanelStyles | undefined = undefined; + private styles: IPanelStyles = {}; - private el: HTMLElement; + readonly element: HTMLElement; private header: HTMLElement; protected disposables: IDisposable[] = []; private _onDidChange = new Emitter(); readonly onDidChange: Event = this._onDidChange.event; - get element(): HTMLElement { - return this.el; - } - get draggableElement(): HTMLElement { return this.header; } get dropTargetElement(): HTMLElement { - return this.el; + return this.element; } private _dropBackground: Color | undefined; @@ -109,6 +114,8 @@ export abstract class Panel implements IView { this.ariaHeaderLabel = options.ariaHeaderLabel || ''; this._minimumBodySize = typeof options.minimumBodySize === 'number' ? options.minimumBodySize : 120; this._maximumBodySize = typeof options.maximumBodySize === 'number' ? options.maximumBodySize : Number.POSITIVE_INFINITY; + + this.element = $('.panel'); } isExpanded(): boolean { @@ -139,11 +146,9 @@ export abstract class Panel implements IView { this._onDidChange.fire(); } - render(container: HTMLElement): void { - this.el = append(container, $('.panel')); - + render(): void { this.header = $('.panel-header'); - append(this.el, this.header); + append(this.element, this.header); this.header.setAttribute('tabindex', '0'); this.header.setAttribute('role', 'toolbar'); this.header.setAttribute('aria-label', this.ariaHeaderLabel); @@ -177,7 +182,7 @@ export abstract class Panel implements IView { // onHeaderKeyDown.filter(e => e.keyCode === KeyCode.DownArrow) // .event(focusNext, this, this.disposables); - const body = append(this.el, $('.panel-body')); + const body = append(this.element, $('.panel-body')); this.renderBody(body); } @@ -370,7 +375,7 @@ export class PanelView implements IDisposable { private _onDidDrop = new Emitter<{ from: Panel, to: Panel }>(); readonly onDidDrop: Event<{ from: Panel, to: Panel }> = this._onDidDrop.event; - readonly onDidSashChange: Event; + readonly onDidSashChange: Event; constructor(container: HTMLElement, options: IPanelViewOptions = {}) { this.dnd = options.dnd; diff --git a/src/vs/base/browser/ui/splitview/splitview.css b/src/vs/base/browser/ui/splitview/splitview.css index 6d068b0de7..a88dfb1411 100644 --- a/src/vs/base/browser/ui/splitview/splitview.css +++ b/src/vs/base/browser/ui/splitview/splitview.css @@ -5,18 +5,39 @@ .monaco-split-view2 { position: relative; - overflow: hidden; width: 100%; height: 100%; } +.monaco-split-view2 > .sash-container { + position: absolute; + width: 100%; + height: 100%; + pointer-events: none; +} + +.monaco-split-view2 > .sash-container > .monaco-sash { + pointer-events: initial; +} + .monaco-split-view2 > .split-view-container { + display: flex; width: 100%; height: 100%; + white-space: nowrap; +} + +.monaco-split-view2.vertical > .split-view-container { + flex-direction: column; +} + +.monaco-split-view2.horizontal > .split-view-container { + flex-direction: row; } .monaco-split-view2 > .split-view-container > .split-view-view { - overflow: hidden; + white-space: initial; + flex: none; } .monaco-split-view2.vertical > .split-view-container > .split-view-view { @@ -27,3 +48,27 @@ height: 100%; display: inline-block; } + +.monaco-split-view2.separator-border > .split-view-container > .split-view-view { + position: relative; +} + +.monaco-split-view2.separator-border > .split-view-container > .split-view-view:not(:first-child)::before { + content: ' '; + position: absolute; + top: 0; + left: 0; + z-index: 5; + pointer-events: none; + background-color: var(--separator-border); +} + +.monaco-split-view2.separator-border.horizontal > .split-view-container > .split-view-view:not(:first-child)::before { + height: 100%; + width: 1px; +} + +.monaco-split-view2.separator-border.vertical > .split-view-container > .split-view-view:not(:first-child)::before { + height: 1px; + width: 100%; +} \ No newline at end of file diff --git a/src/vs/base/browser/ui/splitview/splitview.ts b/src/vs/base/browser/ui/splitview/splitview.ts index 4153b0aa2a..0a19b74ab4 100644 --- a/src/vs/base/browser/ui/splitview/splitview.ts +++ b/src/vs/base/browser/ui/splitview/splitview.ts @@ -11,19 +11,33 @@ import { Event, mapEvent, Emitter } from 'vs/base/common/event'; import * as types from 'vs/base/common/types'; import * as dom from 'vs/base/browser/dom'; import { clamp } from 'vs/base/common/numbers'; -import { range, firstIndex } from 'vs/base/common/arrays'; -import { Sash, Orientation, ISashEvent as IBaseSashEvent } from 'vs/base/browser/ui/sash/sash'; +import { range, firstIndex, pushToStart, pushToEnd } from 'vs/base/common/arrays'; +import { Sash, Orientation, ISashEvent as IBaseSashEvent, SashState } from 'vs/base/browser/ui/sash/sash'; +import { Color } from 'vs/base/common/color'; +import { domEvent } from 'vs/base/browser/event'; export { Orientation } from 'vs/base/browser/ui/sash/sash'; +export interface ISplitViewStyles { + separatorBorder: Color; +} + +const defaultStyles: ISplitViewStyles = { + separatorBorder: Color.transparent +}; + export interface ISplitViewOptions { orientation?: Orientation; // default Orientation.VERTICAL + styles?: ISplitViewStyles; + orthogonalStartSash?: Sash; + orthogonalEndSash?: Sash; + inverseAltBehavior?: boolean; } export interface IView { + readonly element: HTMLElement; readonly minimumSize: number; readonly maximumSize: number; readonly onDidChange: Event; - render(container: HTMLElement, orientation: Orientation): void; layout(size: number, orientation: Orientation): void; } @@ -31,6 +45,7 @@ interface ISashEvent { sash: Sash; start: number; current: number; + alt: boolean; } interface IViewItem { @@ -49,9 +64,12 @@ interface ISashItem { interface ISashDragState { index: number; start: number; + current: number; sizes: number[]; minDelta: number; maxDelta: number; + alt: boolean; + disposable: IDisposable; } enum State { @@ -59,60 +77,98 @@ enum State { Busy } -function pushToEnd(arr: T[], value: T): T[] { - let didFindValue = false; +export type DistributeSizing = { type: 'distribute' }; +export type SplitSizing = { type: 'split', index: number }; +export type Sizing = DistributeSizing | SplitSizing; - const result = arr.filter(v => { - if (v === value) { - didFindValue = true; - return false; - } - - return true; - }); - - if (didFindValue) { - result.push(value); - } - - return result; +export namespace Sizing { + export const Distribute: DistributeSizing = { type: 'distribute' }; + export function Split(index: number): SplitSizing { return { type: 'split', index }; } } export class SplitView implements IDisposable { - private orientation: Orientation; - private el: HTMLElement; + readonly orientation: Orientation; + // TODO@Joao have the same pattern as grid here + readonly el: HTMLElement; + private sashContainer: HTMLElement; private viewContainer: HTMLElement; private size = 0; private contentSize = 0; + private proportions: undefined | number[] = undefined; private viewItems: IViewItem[] = []; private sashItems: ISashItem[] = []; private sashDragState: ISashDragState; private state: State = State.Idle; + private inverseAltBehavior: boolean; - private _onDidSashChange = new Emitter(); + private _onDidSashChange = new Emitter(); readonly onDidSashChange = this._onDidSashChange.event; - private _onDidSashReset = new Emitter(); + private _onDidSashReset = new Emitter(); readonly onDidSashReset = this._onDidSashReset.event; get length(): number { return this.viewItems.length; } + get minimumSize(): number { + return this.viewItems.reduce((r, item) => r + item.view.minimumSize, 0); + } + + get maximumSize(): number { + return this.length === 0 ? Number.POSITIVE_INFINITY : this.viewItems.reduce((r, item) => r + item.view.maximumSize, 0); + } + + private _orthogonalStartSash: Sash | undefined; + get orthogonalStartSash(): Sash | undefined { return this._orthogonalStartSash; } + set orthogonalStartSash(sash: Sash | undefined) { + for (const sashItem of this.sashItems) { + sashItem.sash.orthogonalStartSash = sash; + } + + this._orthogonalStartSash = sash; + } + + private _orthogonalEndSash: Sash | undefined; + get orthogonalEndSash(): Sash | undefined { return this._orthogonalEndSash; } + set orthogonalEndSash(sash: Sash | undefined) { + for (const sashItem of this.sashItems) { + sashItem.sash.orthogonalEndSash = sash; + } + + this._orthogonalEndSash = sash; + } + + get sashes(): Sash[] { + return this.sashItems.map(s => s.sash); + } + constructor(container: HTMLElement, options: ISplitViewOptions = {}) { this.orientation = types.isUndefined(options.orientation) ? Orientation.VERTICAL : options.orientation; + this.inverseAltBehavior = !!options.inverseAltBehavior; this.el = document.createElement('div'); dom.addClass(this.el, 'monaco-split-view2'); dom.addClass(this.el, this.orientation === Orientation.VERTICAL ? 'vertical' : 'horizontal'); container.appendChild(this.el); - this.viewContainer = document.createElement('div'); - dom.addClass(this.viewContainer, 'split-view-container'); - this.el.appendChild(this.viewContainer); + this.sashContainer = dom.append(this.el, dom.$('.sash-container')); + this.viewContainer = dom.append(this.el, dom.$('.split-view-container')); + + this.style(options.styles || defaultStyles); } - addView(view: IView, size: number, index = this.viewItems.length): void { + style(styles: ISplitViewStyles): void { + if (styles.separatorBorder.isTransparent()) { + dom.removeClass(this.el, 'separator-border'); + this.el.style.removeProperty('--separator-border'); + } else { + dom.addClass(this.el, 'separator-border'); + this.el.style.setProperty('--separator-border', styles.separatorBorder.toString()); + } + } + + addView(view: IView, size: number | Sizing, index = this.viewItems.length): void { if (this.state !== State.Idle) { throw new Error('Cant modify splitview'); } @@ -133,48 +189,72 @@ export class SplitView implements IDisposable { const disposable = combinedDisposable([onChangeDisposable, containerDisposable]); const layoutContainer = this.orientation === Orientation.VERTICAL - ? size => item.container.style.height = `${item.size}px` - : size => item.container.style.width = `${item.size}px`; + ? () => item.container.style.height = `${item.size}px` + : () => item.container.style.width = `${item.size}px`; const layout = () => { - layoutContainer(item.size); + layoutContainer(); item.view.layout(item.size, this.orientation); }; - size = Math.round(size); - const item: IViewItem = { view, container, size, layout, disposable }; + let viewSize: number; + + if (typeof size === 'number') { + viewSize = size; + } else if (size.type === 'split') { + viewSize = this.getViewSize(size.index) / 2; + } else { + viewSize = view.minimumSize; + } + + const item: IViewItem = { view, container, size: viewSize, layout, disposable }; this.viewItems.splice(index, 0, item); // Add sash if (this.viewItems.length > 1) { const orientation = this.orientation === Orientation.VERTICAL ? Orientation.HORIZONTAL : Orientation.VERTICAL; const layoutProvider = this.orientation === Orientation.VERTICAL ? { getHorizontalSashTop: sash => this.getSashPosition(sash) } : { getVerticalSashLeft: sash => this.getSashPosition(sash) }; - const sash = new Sash(this.el, layoutProvider, { orientation }); + const sash = new Sash(this.sashContainer, layoutProvider, { + orientation, + orthogonalStartSash: this.orthogonalStartSash, + orthogonalEndSash: this.orthogonalEndSash + }); + const sashEventMapper = this.orientation === Orientation.VERTICAL - ? (e: IBaseSashEvent) => ({ sash, start: e.startY, current: e.currentY }) - : (e: IBaseSashEvent) => ({ sash, start: e.startX, current: e.currentX }); + ? (e: IBaseSashEvent) => ({ sash, start: e.startY, current: e.currentY, alt: e.altKey } as ISashEvent) + : (e: IBaseSashEvent) => ({ sash, start: e.startX, current: e.currentX, alt: e.altKey } as ISashEvent); const onStart = mapEvent(sash.onDidStart, sashEventMapper); const onStartDisposable = onStart(this.onSashStart, this); const onChange = mapEvent(sash.onDidChange, sashEventMapper); - const onSashChangeDisposable = onChange(this.onSashChange, this); - const onEnd = mapEvent(sash.onDidEnd, () => null); - const onEndDisposable = onEnd(() => this._onDidSashChange.fire()); - const onDidReset = mapEvent(sash.onDidReset, () => null); - const onDidResetDisposable = onDidReset(() => this._onDidSashReset.fire()); + const onChangeDisposable = onChange(this.onSashChange, this); + const onEnd = mapEvent(sash.onDidEnd, () => firstIndex(this.sashItems, item => item.sash === sash)); + const onEndDisposable = onEnd(this.onSashEnd, this); + const onDidResetDisposable = sash.onDidReset(() => this._onDidSashReset.fire(firstIndex(this.sashItems, item => item.sash === sash))); - const disposable = combinedDisposable([onStartDisposable, onSashChangeDisposable, onEndDisposable, onDidResetDisposable, sash]); + const disposable = combinedDisposable([onStartDisposable, onChangeDisposable, onEndDisposable, onDidResetDisposable, sash]); const sashItem: ISashItem = { sash, disposable }; this.sashItems.splice(index - 1, 0, sashItem); } - view.render(container, this.orientation); - this.relayout(index); + container.appendChild(view.element); + + let highPriorityIndex: number | undefined; + + if (typeof size !== 'number' && size.type === 'split') { + highPriorityIndex = size.index; + } + + this.relayout(index, highPriorityIndex); this.state = State.Idle; + + if (typeof size !== 'number' && size.type === 'distribute') { + this.distributeViewSizes(); + } } - removeView(index: number): void { + removeView(index: number, sizing?: Sizing): IView { if (this.state !== State.Idle) { throw new Error('Cant modify splitview'); } @@ -182,7 +262,7 @@ export class SplitView implements IDisposable { this.state = State.Busy; if (index < 0 || index >= this.viewItems.length) { - return; + throw new Error('Index out of bounds'); } // Remove view @@ -198,6 +278,12 @@ export class SplitView implements IDisposable { this.relayout(); this.state = State.Idle; + + if (sizing && sizing.type === 'distribute') { + this.distributeViewSizes(); + } + + return viewItem.view; } moveView(from: number, to: number): void { @@ -205,67 +291,129 @@ export class SplitView implements IDisposable { throw new Error('Cant modify splitview'); } - this.state = State.Busy; - - if (from < 0 || from >= this.viewItems.length) { - return; - } - - if (to < 0 || to >= this.viewItems.length) { - return; - } - - if (from === to) { - return; - } - - const viewItem = this.viewItems.splice(from, 1)[0]; - this.viewItems.splice(to, 0, viewItem); - - if (to + 1 < this.viewItems.length) { - this.viewContainer.insertBefore(viewItem.container, this.viewItems[to + 1].container); - } else { - this.viewContainer.appendChild(viewItem.container); - } - - this.layoutViews(); - this.state = State.Idle; + const size = this.getViewSize(from); + const view = this.removeView(from); + this.addView(view, size, to); } - private relayout(lowPriorityIndex?: number): void { + swapViews(from: number, to: number): void { + if (this.state !== State.Idle) { + throw new Error('Cant modify splitview'); + } + + if (from > to) { + return this.swapViews(to, from); + } + + const fromSize = this.getViewSize(from); + const toSize = this.getViewSize(to); + const toView = this.removeView(to); + const fromView = this.removeView(from); + + this.addView(toView, fromSize, from); + this.addView(fromView, toSize, to); + } + + private relayout(lowPriorityIndex?: number, highPriorityIndex?: number): void { const contentSize = this.viewItems.reduce((r, i) => r + i.size, 0); - this.resize(this.viewItems.length - 1, this.size - contentSize, undefined, lowPriorityIndex); + + this.resize(this.viewItems.length - 1, this.size - contentSize, undefined, lowPriorityIndex, highPriorityIndex); + this.distributeEmptySpace(); + this.layoutViews(); + this.saveProportions(); } layout(size: number): void { const previousSize = Math.max(this.size, this.contentSize); this.size = size; - this.resize(this.viewItems.length - 1, size - previousSize); + + if (!this.proportions) { + this.resize(this.viewItems.length - 1, size - previousSize); + } else { + for (let i = 0; i < this.viewItems.length; i++) { + const item = this.viewItems[i]; + item.size = clamp(Math.round(this.proportions[i] * size), item.view.minimumSize, item.view.maximumSize); + } + } + + this.distributeEmptySpace(); + this.layoutViews(); } - private onSashStart({ sash, start }: ISashEvent): void { + private saveProportions(): void { + if (this.contentSize > 0) { + this.proportions = this.viewItems.map(i => i.size / this.contentSize); + } + } + + private onSashStart({ sash, start, alt }: ISashEvent): void { const index = firstIndex(this.sashItems, item => item.sash === sash); - const sizes = this.viewItems.map(i => i.size); - const upIndexes = range(index, -1); - const collapseUp = upIndexes.reduce((r, i) => r + (sizes[i] - this.viewItems[i].view.minimumSize), 0); - const expandUp = upIndexes.reduce((r, i) => r + (this.viewItems[i].view.maximumSize - sizes[i]), 0); + // This way, we can press Alt while we resize a sash, macOS style! + const disposable = combinedDisposable([ + domEvent(document.body, 'keydown')(e => resetSashDragState(this.sashDragState.current, e.altKey)), + domEvent(document.body, 'keyup')(() => resetSashDragState(this.sashDragState.current, false)) + ]); - const downIndexes = range(index + 1, this.viewItems.length); - const collapseDown = downIndexes.reduce((r, i) => r + (sizes[i] - this.viewItems[i].view.minimumSize), 0); - const expandDown = downIndexes.reduce((r, i) => r + (this.viewItems[i].view.maximumSize - sizes[i]), 0); + const resetSashDragState = (start: number, alt: boolean) => { + const sizes = this.viewItems.map(i => i.size); + let minDelta = Number.NEGATIVE_INFINITY; + let maxDelta = Number.POSITIVE_INFINITY; - const minDelta = -Math.min(collapseUp, expandDown); - const maxDelta = Math.min(collapseDown, expandUp); + if (this.inverseAltBehavior) { + alt = !alt; + } - this.sashDragState = { start, index, sizes, minDelta, maxDelta }; + if (alt) { + // When we're using the last sash with Alt, we're resizing + // the view to the left/up, instead of right/down as usual + // Thus, we must do the inverse of the usual + const isLastSash = index === this.sashItems.length - 1; + + if (isLastSash) { + const viewItem = this.viewItems[index]; + minDelta = (viewItem.view.minimumSize - viewItem.size) / 2; + maxDelta = (viewItem.view.maximumSize - viewItem.size) / 2; + } else { + const viewItem = this.viewItems[index + 1]; + minDelta = (viewItem.size - viewItem.view.maximumSize) / 2; + maxDelta = (viewItem.size - viewItem.view.minimumSize) / 2; + } + } + + this.sashDragState = { start, current: start, index, sizes, minDelta, maxDelta, alt, disposable }; + }; + + resetSashDragState(start, alt); } - private onSashChange({ sash, current }: ISashEvent): void { - const { index, start, sizes, minDelta, maxDelta } = this.sashDragState; - const delta = clamp(current - start, minDelta, maxDelta); + private onSashChange({ current }: ISashEvent): void { + const { index, start, sizes, alt, minDelta, maxDelta } = this.sashDragState; + this.sashDragState.current = current; - this.resize(index, delta, sizes); + const delta = current - start; + const newDelta = this.resize(index, delta, sizes, undefined, undefined, minDelta, maxDelta); + + if (alt) { + const isLastSash = index === this.sashItems.length - 1; + const newSizes = this.viewItems.map(i => i.size); + const viewItemIndex = isLastSash ? index : index + 1; + const viewItem = this.viewItems[viewItemIndex]; + const newMinDelta = viewItem.size - viewItem.view.maximumSize; + const newMaxDelta = viewItem.size - viewItem.view.minimumSize; + const resizeIndex = isLastSash ? index - 1 : index + 1; + + this.resize(resizeIndex, -newDelta, newSizes, undefined, undefined, newMinDelta, newMaxDelta); + } + + this.distributeEmptySpace(); + this.layoutViews(); + } + + private onSashEnd(index: number): void { + this._onDidSashChange.fire(index); + this.sashDragState.disposable.dispose(); + this.saveProportions(); } private onViewChange(item: IViewItem, size: number | undefined): void { @@ -277,8 +425,17 @@ export class SplitView implements IDisposable { size = typeof size === 'number' ? size : item.size; size = clamp(size, item.view.minimumSize, item.view.maximumSize); - item.size = size; - this.relayout(index); + + if (this.inverseAltBehavior && index > 0) { + // In this case, we want the view to grow or shrink both sides equally + // so we just resize the "left" side by half and let `resize` do the clamping magic + this.resize(index - 1, Math.floor((item.size - size) / 2)); + this.distributeEmptySpace(); + this.layoutViews(); + } else { + item.size = size; + this.relayout(index, undefined); + } } resizeView(index: number, size: number): void { @@ -316,9 +473,20 @@ export class SplitView implements IDisposable { this.resize(index - 1, deltaUp); } + this.distributeEmptySpace(); + this.layoutViews(); + this.saveProportions(); this.state = State.Idle; } + distributeViewSizes(): void { + const size = Math.floor(this.size / this.viewItems.length); + + for (let i = 0; i < this.viewItems.length - 1; i++) { + this.resizeView(i, size); + } + } + getViewSize(index: number): number { if (index < 0 || index >= this.viewItems.length) { return -1; @@ -327,49 +495,73 @@ export class SplitView implements IDisposable { return this.viewItems[index].size; } - private resize(index: number, delta: number, sizes = this.viewItems.map(i => i.size), lowPriorityIndex?: number): void { + private resize( + index: number, + delta: number, + sizes = this.viewItems.map(i => i.size), + lowPriorityIndex?: number, + highPriorityIndex?: number, + overloadMinDelta: number = Number.NEGATIVE_INFINITY, + overloadMaxDelta: number = Number.POSITIVE_INFINITY + ): number { if (index < 0 || index >= this.viewItems.length) { - return; + return 0; } - if (delta !== 0) { - let upIndexes = range(index, -1); - let downIndexes = range(index + 1, this.viewItems.length); + const upIndexes = range(index, -1); + const downIndexes = range(index + 1, this.viewItems.length); - if (typeof lowPriorityIndex === 'number') { - upIndexes = pushToEnd(upIndexes, lowPriorityIndex); - downIndexes = pushToEnd(downIndexes, lowPriorityIndex); - } - - const upItems = upIndexes.map(i => this.viewItems[i]); - const upSizes = upIndexes.map(i => sizes[i]); - - const downItems = downIndexes.map(i => this.viewItems[i]); - const downSizes = downIndexes.map(i => sizes[i]); - - for (let i = 0, deltaUp = delta; deltaUp !== 0 && i < upItems.length; i++) { - const item = upItems[i]; - const size = clamp(upSizes[i] + deltaUp, item.view.minimumSize, item.view.maximumSize); - const viewDelta = size - upSizes[i]; - - deltaUp -= viewDelta; - item.size = size; - } - - for (let i = 0, deltaDown = delta; deltaDown !== 0 && i < downItems.length; i++) { - const item = downItems[i]; - const size = clamp(downSizes[i] - deltaDown, item.view.minimumSize, item.view.maximumSize); - const viewDelta = size - downSizes[i]; - - deltaDown += viewDelta; - item.size = size; - } + if (typeof highPriorityIndex === 'number') { + pushToStart(upIndexes, highPriorityIndex); + pushToStart(downIndexes, highPriorityIndex); } + if (typeof lowPriorityIndex === 'number') { + pushToEnd(upIndexes, lowPriorityIndex); + pushToEnd(downIndexes, lowPriorityIndex); + } + + const upItems = upIndexes.map(i => this.viewItems[i]); + const upSizes = upIndexes.map(i => sizes[i]); + + const downItems = downIndexes.map(i => this.viewItems[i]); + const downSizes = downIndexes.map(i => sizes[i]); + + const minDeltaUp = upIndexes.reduce((r, i) => r + (this.viewItems[i].view.minimumSize - sizes[i]), 0); + const maxDeltaUp = upIndexes.reduce((r, i) => r + (this.viewItems[i].view.maximumSize - sizes[i]), 0); + const maxDeltaDown = downIndexes.length === 0 ? Number.POSITIVE_INFINITY : downIndexes.reduce((r, i) => r + (sizes[i] - this.viewItems[i].view.minimumSize), 0); + const minDeltaDown = downIndexes.length === 0 ? Number.NEGATIVE_INFINITY : downIndexes.reduce((r, i) => r + (sizes[i] - this.viewItems[i].view.maximumSize), 0); + const minDelta = Math.max(minDeltaUp, minDeltaDown, overloadMinDelta); + const maxDelta = Math.min(maxDeltaDown, maxDeltaUp, overloadMaxDelta); + + delta = clamp(delta, minDelta, maxDelta); + + for (let i = 0, deltaUp = delta; i < upItems.length; i++) { + const item = upItems[i]; + const size = clamp(upSizes[i] + deltaUp, item.view.minimumSize, item.view.maximumSize); + const viewDelta = size - upSizes[i]; + + deltaUp -= viewDelta; + item.size = size; + } + + for (let i = 0, deltaDown = delta; i < downItems.length; i++) { + const item = downItems[i]; + const size = clamp(downSizes[i] - deltaDown, item.view.minimumSize, item.view.maximumSize); + const viewDelta = size - downSizes[i]; + + deltaDown += viewDelta; + item.size = size; + } + + return delta; + } + + private distributeEmptySpace(): void { let contentSize = this.viewItems.reduce((r, i) => r + i.size, 0); let emptyDelta = this.size - contentSize; - for (let i = this.viewItems.length - 1; emptyDelta > 0 && i >= 0; i--) { + for (let i = this.viewItems.length - 1; emptyDelta !== 0 && i >= 0; i--) { const item = this.viewItems[i]; const size = clamp(item.size + emptyDelta, item.view.minimumSize, item.view.maximumSize); const viewDelta = size - item.size; @@ -377,14 +569,16 @@ export class SplitView implements IDisposable { emptyDelta -= viewDelta; item.size = size; } - - this.contentSize = this.viewItems.reduce((r, i) => r + i.size, 0); - - this.layoutViews(); } private layoutViews(): void { + // Save new content size + this.contentSize = this.viewItems.reduce((r, i) => r + i.size, 0); + + // Layout views this.viewItems.forEach(item => item.layout()); + + // Layout sashes this.sashItems.forEach(item => item.sash.layout()); // Update sashes enablement @@ -402,10 +596,17 @@ export class SplitView implements IDisposable { const expandsUp = reverseViews.map(i => previous = (i.view.maximumSize - i.size > 0) || previous).reverse(); this.sashItems.forEach((s, i) => { - if ((collapsesDown[i] && expandsUp[i + 1]) || (expandsDown[i] && collapsesUp[i + 1])) { - s.sash.enable(); + const min = !(collapsesDown[i] && expandsUp[i + 1]); + const max = !(expandsDown[i] && collapsesUp[i + 1]); + + if (min && max) { + s.sash.state = SashState.Disabled; + } else if (min && !max) { + s.sash.state = SashState.Minimum; + } else if (!min && max) { + s.sash.state = SashState.Maximum; } else { - s.sash.disable(); + s.sash.state = SashState.Enabled; } }); } diff --git a/src/vs/base/browser/ui/toolbar/ellipsis-inverse.svg b/src/vs/base/browser/ui/toolbar/ellipsis-inverse.svg index 1140c11ecc..e3337557a2 100644 --- a/src/vs/base/browser/ui/toolbar/ellipsis-inverse.svg +++ b/src/vs/base/browser/ui/toolbar/ellipsis-inverse.svg @@ -1 +1 @@ - \ No newline at end of file +Ellipsis_bold_16x \ No newline at end of file diff --git a/src/vs/base/browser/ui/toolbar/ellipsis.svg b/src/vs/base/browser/ui/toolbar/ellipsis.svg index b61e2d0c75..e3f8562335 100644 --- a/src/vs/base/browser/ui/toolbar/ellipsis.svg +++ b/src/vs/base/browser/ui/toolbar/ellipsis.svg @@ -1 +1 @@ - \ No newline at end of file +Ellipsis_bold_16x \ No newline at end of file diff --git a/src/vs/base/browser/ui/toolbar/toolbar.ts b/src/vs/base/browser/ui/toolbar/toolbar.ts index addb80e3b0..6efb3f3d08 100644 --- a/src/vs/base/browser/ui/toolbar/toolbar.ts +++ b/src/vs/base/browser/ui/toolbar/toolbar.ts @@ -12,6 +12,7 @@ import { Action, IActionRunner, IAction } from 'vs/base/common/actions'; import { ActionBar, ActionsOrientation, IActionItemProvider } from 'vs/base/browser/ui/actionbar/actionbar'; import { IContextMenuProvider, DropdownMenuActionItem } from 'vs/base/browser/ui/dropdown/dropdown'; import { ResolvedKeybinding } from 'vs/base/common/keyCodes'; +import { Disposable } from 'vs/base/common/lifecycle'; export const CONTEXT = 'context.toolbar'; @@ -26,7 +27,7 @@ export interface IToolBarOptions { /** * A widget that combines an action bar for primary actions and a dropdown for secondary actions. */ -export class ToolBar { +export class ToolBar extends Disposable { private options: IToolBarOptions; private actionBar: ActionBar; private toggleMenuAction: ToggleMenuAction; @@ -35,16 +36,18 @@ export class ToolBar { private lookupKeybindings: boolean; constructor(container: HTMLElement, contextMenuProvider: IContextMenuProvider, options: IToolBarOptions = { orientation: ActionsOrientation.HORIZONTAL }) { + super(); + this.options = options; this.lookupKeybindings = typeof this.options.getKeyBinding === 'function'; - this.toggleMenuAction = new ToggleMenuAction(() => this.toggleMenuActionItem && this.toggleMenuActionItem.show()); + this.toggleMenuAction = this._register(new ToggleMenuAction(() => this.toggleMenuActionItem && this.toggleMenuActionItem.show())); let element = document.createElement('div'); element.className = 'monaco-toolbar'; container.appendChild(element); - this.actionBar = new ActionBar(element, { + this.actionBar = this._register(new ActionBar(element, { orientation: options.orientation, ariaLabel: options.ariaLabel, actionRunner: options.actionRunner, @@ -75,29 +78,29 @@ export class ToolBar { return options.actionItemProvider ? options.actionItemProvider(action) : null; } - }); + })); } - public set actionRunner(actionRunner: IActionRunner) { + set actionRunner(actionRunner: IActionRunner) { this.actionBar.actionRunner = actionRunner; } - public get actionRunner(): IActionRunner { + get actionRunner(): IActionRunner { return this.actionBar.actionRunner; } - public set context(context: any) { + set context(context: any) { this.actionBar.context = context; if (this.toggleMenuActionItem) { this.toggleMenuActionItem.setActionContext(context); } } - public getContainer(): HTMLElement { + getContainer(): HTMLElement { return this.actionBar.getContainer(); } - public getItemsWidth(): number { + getItemsWidth(): number { let itemsWidth = 0; for (let i = 0; i < this.actionBar.length(); i++) { itemsWidth += this.actionBar.getWidth(i); @@ -105,11 +108,11 @@ export class ToolBar { return itemsWidth; } - public setAriaLabel(label: string): void { + setAriaLabel(label: string): void { this.actionBar.setAriaLabel(label); } - public setActions(primaryActions: IAction[], secondaryActions?: IAction[]): () => void { + setActions(primaryActions: IAction[], secondaryActions?: IAction[]): () => void { return () => { let primaryActionsToSet = primaryActions ? primaryActions.slice(0) : []; @@ -134,7 +137,7 @@ export class ToolBar { return key ? key.getLabel() : void 0; } - public addPrimaryAction(primaryAction: IAction): () => void { + addPrimaryAction(primaryAction: IAction): () => void { return () => { // Add after the "..." action if we have secondary actions @@ -150,40 +153,40 @@ export class ToolBar { }; } - public dispose(): void { - this.actionBar.dispose(); - this.toggleMenuAction.dispose(); - + dispose(): void { if (this.toggleMenuActionItem) { this.toggleMenuActionItem.dispose(); + this.toggleMenuActionItem = void 0; } + + super.dispose(); } } class ToggleMenuAction extends Action { - public static readonly ID = 'toolbar.toggle.more'; + static readonly ID = 'toolbar.toggle.more'; private _menuActions: IAction[]; private toggleDropdownMenu: () => void; constructor(toggleDropdownMenu: () => void) { - super(ToggleMenuAction.ID, nls.localize('more', "More"), null, true); + super(ToggleMenuAction.ID, nls.localize('moreActions', "More Actions..."), null, true); this.toggleDropdownMenu = toggleDropdownMenu; } - public run(): TPromise { + run(): TPromise { this.toggleDropdownMenu(); return TPromise.as(true); } - public get menuActions() { + get menuActions() { return this._menuActions; } - public set menuActions(actions: IAction[]) { + set menuActions(actions: IAction[]) { this._menuActions = actions; } } \ No newline at end of file diff --git a/src/vs/base/browser/ui/tree/tree.css b/src/vs/base/browser/ui/tree/tree.css new file mode 100644 index 0000000000..127f5bcc8c --- /dev/null +++ b/src/vs/base/browser/ui/tree/tree.css @@ -0,0 +1,16 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the Source EULA. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +.monaco-tl-row { + display: flex; + height: 100%; + align-items: center; +} + +.monaco-tl-row > .tl-twistie { + font-size: 10px; + text-align: right; + padding-right: 10px; +} \ No newline at end of file diff --git a/src/vs/base/browser/ui/tree/tree.ts b/src/vs/base/browser/ui/tree/tree.ts new file mode 100644 index 0000000000..0f3d28d395 --- /dev/null +++ b/src/vs/base/browser/ui/tree/tree.ts @@ -0,0 +1,252 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the Source EULA. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import 'vs/css!./tree'; +import { IDisposable, dispose } from 'vs/base/common/lifecycle'; +import { IListOptions, List, IIdentityProvider, IMultipleSelectionController } from 'vs/base/browser/ui/list/listWidget'; +import { TreeModel, ITreeNode, ITreeElement, getNodeLocation } from 'vs/base/browser/ui/tree/treeModel'; +import { Iterator, ISequence } from 'vs/base/common/iterator'; +import { IVirtualDelegate, IRenderer, IListMouseEvent } from 'vs/base/browser/ui/list/list'; +import { append, $ } from 'vs/base/browser/dom'; +import { Event, Relay, chain } from 'vs/base/common/event'; +import { StandardKeyboardEvent } from 'vs/base/browser/keyboardEvent'; +import { KeyCode } from 'vs/base/common/keyCodes'; +import { tail2 } from 'vs/base/common/arrays'; + +function toTreeListOptions(options?: IListOptions): IListOptions> { + if (!options) { + return undefined; + } + + let identityProvider: IIdentityProvider> | undefined = undefined; + let multipleSelectionController: IMultipleSelectionController> | undefined = undefined; + + if (options.identityProvider) { + identityProvider = el => options.identityProvider(el.element); + } + + if (options.multipleSelectionController) { + multipleSelectionController = { + isSelectionSingleChangeEvent(e) { + return options.multipleSelectionController.isSelectionSingleChangeEvent({ ...e, element: e.element } as any); + }, + isSelectionRangeChangeEvent(e) { + return options.multipleSelectionController.isSelectionRangeChangeEvent({ ...e, element: e.element } as any); + } + }; + } + + return { + ...options, + identityProvider, + multipleSelectionController + }; +} + +class TreeDelegate implements IVirtualDelegate> { + + constructor(private delegate: IVirtualDelegate) { } + + getHeight(element: ITreeNode): number { + return this.delegate.getHeight(element.element); + } + + getTemplateId(element: ITreeNode): string { + return this.delegate.getTemplateId(element.element); + } +} + +interface ITreeListTemplateData { + twistie: HTMLElement; + templateData: T; +} + +function renderTwistie(node: ITreeNode, twistie: HTMLElement): void { + if (node.children.length === 0 && !node.collapsible) { + twistie.innerText = ''; + } else { + twistie.innerText = node.collapsed ? '▹' : '◢'; + } +} + +class TreeRenderer implements IRenderer, ITreeListTemplateData> { + + readonly templateId: string; + private renderedNodes = new Map, ITreeListTemplateData>(); + private disposables: IDisposable[] = []; + + constructor( + private renderer: IRenderer, + onDidChangeCollapseState: Event> + ) { + this.templateId = renderer.templateId; + onDidChangeCollapseState(this.onDidChangeCollapseState, this, this.disposables); + } + + renderTemplate(container: HTMLElement): ITreeListTemplateData { + const el = append(container, $('.monaco-tl-row')); + const twistie = append(el, $('.tl-twistie')); + const contents = append(el, $('.tl-contents')); + const templateData = this.renderer.renderTemplate(contents); + + return { twistie, templateData }; + } + + renderElement(node: ITreeNode, index: number, templateData: ITreeListTemplateData): void { + this.renderedNodes.set(node, templateData); + + templateData.twistie.style.width = `${10 + node.depth * 10}px`; + renderTwistie(node, templateData.twistie); + + this.renderer.renderElement(node.element, index, templateData.templateData); + } + + disposeElement(node: ITreeNode): void { + this.renderedNodes.delete(node); + } + + disposeTemplate(templateData: ITreeListTemplateData): void { + this.renderer.disposeTemplate(templateData.templateData); + } + + private onDidChangeCollapseState(node: ITreeNode): void { + const templateData = this.renderedNodes.get(node); + + if (!templateData) { + return; + } + + renderTwistie(node, templateData.twistie); + } + + dispose(): void { + this.renderedNodes.clear(); + this.disposables = dispose(this.disposables); + } +} + +function isInputElement(e: HTMLElement): boolean { + return e.tagName === 'INPUT' || e.tagName === 'TEXTAREA'; +} + +export interface ITreeOptions extends IListOptions { } + +export class Tree implements IDisposable { + + private view: List>; + private model: TreeModel; + private disposables: IDisposable[] = []; + + constructor( + container: HTMLElement, + delegate: IVirtualDelegate, + renderers: IRenderer[], + options?: ITreeOptions + ) { + const treeDelegate = new TreeDelegate(delegate); + + const onDidChangeCollapseStateRelay = new Relay>(); + const treeRenderers = renderers.map(r => new TreeRenderer(r, onDidChangeCollapseStateRelay.event)); + this.disposables.push(...treeRenderers); + + const treeOptions = toTreeListOptions(options); + + this.view = new List(container, treeDelegate, treeRenderers, treeOptions); + this.model = new TreeModel(this.view); + onDidChangeCollapseStateRelay.input = this.model.onDidChangeCollapseState; + + this.view.onMouseClick(this.onMouseClick, this, this.disposables); + + const onKeyDown = chain(this.view.onKeyDown) + .filter(e => !isInputElement(e.target as HTMLElement)) + .map(e => new StandardKeyboardEvent(e)); + + onKeyDown.filter(e => e.keyCode === KeyCode.LeftArrow).on(this.onLeftArrow, this, this.disposables); + onKeyDown.filter(e => e.keyCode === KeyCode.RightArrow).on(this.onRightArrow, this, this.disposables); + onKeyDown.filter(e => e.keyCode === KeyCode.Space).on(this.onSpace, this, this.disposables); + } + + splice(location: number[], deleteCount: number, toInsert: ISequence> = Iterator.empty()): Iterator> { + return this.model.splice(location, deleteCount, toInsert); + } + + private onMouseClick(e: IListMouseEvent>): void { + const node = e.element; + const location = getNodeLocation(node); + + this.model.toggleCollapsed(location); + } + + private onLeftArrow(e: StandardKeyboardEvent): void { + e.preventDefault(); + e.stopPropagation(); + + const nodes = this.view.getFocusedElements(); + + if (nodes.length === 0) { + return; + } + + const node = nodes[0]; + const location = getNodeLocation(node); + const didChange = this.model.setCollapsed(location, true); + + if (!didChange) { + if (location.length === 1) { + return; + } + + const [parentLocation] = tail2(location); + const parentListIndex = this.model.getListIndex(parentLocation); + this.view.setFocus([parentListIndex]); + } + } + + private onRightArrow(e: StandardKeyboardEvent): void { + e.preventDefault(); + e.stopPropagation(); + + const nodes = this.view.getFocusedElements(); + + if (nodes.length === 0) { + return; + } + + const node = nodes[0]; + const location = getNodeLocation(node); + const didChange = this.model.setCollapsed(location, false); + + if (!didChange) { + if (node.children.length === 0) { + return; + } + + const [focusedIndex] = this.view.getFocus(); + this.view.setFocus([focusedIndex + 1]); + } + } + + private onSpace(e: StandardKeyboardEvent): void { + e.preventDefault(); + e.stopPropagation(); + + const nodes = this.view.getFocusedElements(); + + if (nodes.length === 0) { + return; + } + + const node = nodes[0]; + const location = getNodeLocation(node); + this.model.toggleCollapsed(location); + } + + dispose(): void { + this.disposables = dispose(this.disposables); + this.view.dispose(); + this.view = null; + this.model = null; + } +} \ No newline at end of file diff --git a/src/vs/base/browser/ui/tree/treeModel.ts b/src/vs/base/browser/ui/tree/treeModel.ts new file mode 100644 index 0000000000..10899987cf --- /dev/null +++ b/src/vs/base/browser/ui/tree/treeModel.ts @@ -0,0 +1,232 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the Source EULA. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +'use strict'; + +import { ISpliceable } from 'vs/base/common/sequence'; +import { Iterator, ISequence } from 'vs/base/common/iterator'; +import { Emitter, Event } from 'vs/base/common/event'; + +export interface ITreeElement { + readonly element: T; + readonly children?: Iterator> | ITreeElement[]; + readonly collapsible?: boolean; + readonly collapsed?: boolean; +} + +export interface ITreeNode { + readonly parent: IMutableTreeNode | undefined; + readonly element: T; + readonly children: IMutableTreeNode[]; + readonly depth: number; + readonly collapsible: boolean; + readonly collapsed: boolean; + readonly visibleCount: number; +} + +interface IMutableTreeNode extends ITreeNode { + collapsed: boolean; + visibleCount: number; +} + +function visibleCountReducer(result: number, node: IMutableTreeNode): number { + return result + (node.collapsed ? 1 : node.visibleCount); +} + +function getVisibleCount(nodes: IMutableTreeNode[]): number { + return nodes.reduce(visibleCountReducer, 0); +} + +function getVisibleNodes(nodes: IMutableTreeNode[], result: ITreeNode[] = []): ITreeNode[] { + for (const node of nodes) { + result.push(node); + + if (!node.collapsed) { + getVisibleNodes(node.children, result); + } + } + + return result; +} + +function getTreeElementIterator(elements: Iterator> | ITreeElement[] | undefined): Iterator> { + if (!elements) { + return Iterator.empty(); + } else if (Array.isArray(elements)) { + return Iterator.iterate(elements); + } else { + return elements; + } +} + +function treeElementToNode(treeElement: ITreeElement, parent: IMutableTreeNode, visible: boolean, treeListElements: ITreeNode[]): IMutableTreeNode { + const depth = parent.depth + 1; + const { element, collapsible, collapsed } = treeElement; + const node = { parent, element, children: [], depth, collapsible: !!collapsible, collapsed: !!collapsed, visibleCount: 0 }; + + if (visible) { + treeListElements.push(node); + } + + const children = getTreeElementIterator(treeElement.children); + node.children = Iterator.collect(Iterator.map(children, el => treeElementToNode(el, node, visible && !treeElement.collapsed, treeListElements))); + node.collapsible = node.collapsible || node.children.length > 0; + node.visibleCount = 1 + getVisibleCount(node.children); + + return node; +} + +function treeNodeToElement(node: IMutableTreeNode): ITreeElement { + const { element, collapsed } = node; + const children = Iterator.map(Iterator.iterate(node.children), treeNodeToElement); + + return { element, children, collapsed }; +} + +export function getNodeLocation(node: ITreeNode): number[] { + const location = []; + + while (node.parent) { + location.push(node.parent.children.indexOf(node)); + node = node.parent; + } + + return location.reverse(); +} + +export class TreeModel { + + private root: IMutableTreeNode = { + parent: undefined, + element: undefined, + children: [], + depth: 0, + collapsible: false, + collapsed: false, + visibleCount: 1 + }; + + private _onDidChangeCollapseState = new Emitter>(); + readonly onDidChangeCollapseState: Event> = this._onDidChangeCollapseState.event; + + constructor(private list: ISpliceable>) { } + + splice(location: number[], deleteCount: number, toInsert?: ISequence>): Iterator> { + if (location.length === 0) { + throw new Error('Invalid tree location'); + } + + const { parentNode, listIndex, visible } = this.findParentNode(location); + const treeListElementsToInsert: ITreeNode[] = []; + const elementsToInsert = getTreeElementIterator(toInsert); + const nodesToInsert = Iterator.collect(Iterator.map(elementsToInsert, el => treeElementToNode(el, parentNode, visible, treeListElementsToInsert))); + const lastIndex = location[location.length - 1]; + const deletedNodes = parentNode.children.splice(lastIndex, deleteCount, ...nodesToInsert); + const visibleDeleteCount = getVisibleCount(deletedNodes); + + parentNode.visibleCount += getVisibleCount(nodesToInsert) - visibleDeleteCount; + + if (visible) { + this.list.splice(listIndex, visibleDeleteCount, treeListElementsToInsert); + } + + return Iterator.map(Iterator.iterate(deletedNodes), treeNodeToElement); + } + + getListIndex(location: number[]): number { + return this.findNode(location).listIndex; + } + + setCollapsed(location: number[], collapsed: boolean): boolean { + return this._setCollapsed(location, collapsed); + } + + toggleCollapsed(location: number[]): void { + this._setCollapsed(location); + } + + private _setCollapsed(location: number[], collapsed?: boolean | undefined): boolean { + const { node, listIndex, visible } = this.findNode(location); + + if (!node.collapsible) { + return false; + } + + if (typeof collapsed === 'undefined') { + collapsed = !node.collapsed; + } + + if (node.collapsed === collapsed) { + return false; + } + + node.collapsed = collapsed; + + if (visible) { + this._onDidChangeCollapseState.fire(node); + + let visibleCountDiff: number; + + if (collapsed) { + const deleteCount = getVisibleCount(node.children); + + this.list.splice(listIndex + 1, deleteCount, []); + visibleCountDiff = -deleteCount; + } else { + const toInsert = getVisibleNodes(node.children); + + this.list.splice(listIndex + 1, 0, toInsert); + visibleCountDiff = toInsert.length; + } + + let mutableNode = node; + + while (mutableNode) { + mutableNode.visibleCount += visibleCountDiff; + mutableNode = mutableNode.parent; + } + } + + return true; + } + + isCollapsed(location: number[]): boolean { + return this.findNode(location).node.collapsed; + } + + private findNode(location: number[]): { node: IMutableTreeNode, listIndex: number, visible: boolean } { + const { parentNode, listIndex, visible } = this.findParentNode(location); + const index = location[location.length - 1]; + + if (index < 0 || index > parentNode.children.length) { + throw new Error('Invalid tree location'); + } + + const node = parentNode.children[index]; + + return { node, listIndex, visible }; + } + + private findParentNode(location: number[], node: IMutableTreeNode = this.root, listIndex: number = 0, visible = true): { parentNode: IMutableTreeNode; listIndex: number; visible: boolean; } { + const [index, ...rest] = location; + + if (index < 0 || index > node.children.length) { + throw new Error('Invalid tree location'); + } + + // TODO@joao perf! + for (let i = 0; i < index; i++) { + listIndex += node.children[i].visibleCount; + } + + visible = visible && !node.collapsed; + + if (rest.length === 0) { + return { parentNode: node, listIndex, visible }; + } + + return this.findParentNode(rest, node.children[index], listIndex + 1, visible); + } +} \ No newline at end of file diff --git a/src/vs/base/common/actions.ts b/src/vs/base/common/actions.ts index 9756373084..cc23881cd6 100644 --- a/src/vs/base/common/actions.ts +++ b/src/vs/base/common/actions.ts @@ -5,7 +5,7 @@ 'use strict'; import { TPromise } from 'vs/base/common/winjs.base'; -import { IDisposable } from 'vs/base/common/lifecycle'; +import { IDisposable, combinedDisposable } from 'vs/base/common/lifecycle'; import { Event, Emitter } from 'vs/base/common/event'; export interface ITelemetryData { @@ -237,3 +237,26 @@ export class ActionRunner implements IActionRunner { this._onDidRun.dispose(); } } + +export class RadioGroup { + + private _disposable: IDisposable; + + constructor(readonly actions: Action[]) { + this._disposable = combinedDisposable(actions.map(action => { + return action.onDidChange(e => { + if (e.checked && action.checked) { + for (const candidate of actions) { + if (candidate !== action) { + candidate.checked = false; + } + } + } + }); + })); + } + + dispose(): void { + this._disposable.dispose(); + } +} diff --git a/src/vs/base/common/arrays.ts b/src/vs/base/common/arrays.ts index 7ac7cce54a..57785b34a1 100644 --- a/src/vs/base/common/arrays.ts +++ b/src/vs/base/common/arrays.ts @@ -12,11 +12,19 @@ import { ISplice } from 'vs/base/common/sequence'; * @param array The array. * @param n Which element from the end (default is zero). */ -export function tail(array: T[], n: number = 0): T { +export function tail(array: ArrayLike, n: number = 0): T { return array[array.length - (1 + n)]; } -export function equals(one: T[], other: T[], itemEquals: (a: T, b: T) => boolean = (a, b) => a === b): boolean { +export function tail2(arr: T[]): [T[], T] { + if (arr.length === 0) { + throw new Error('Invalid tail call'); + } + + return [arr.slice(0, arr.length - 1), arr[arr.length - 1]]; +} + +export function equals(one: ReadonlyArray, other: ReadonlyArray, itemEquals: (a: T, b: T) => boolean = (a, b) => a === b): boolean { if (one.length !== other.length) { return false; } @@ -69,48 +77,56 @@ export function findFirstInSorted(array: T[], p: (x: T) => boolean): number { return low; } +type Compare = (a: T, b: T) => number; + /** * Like `Array#sort` but always stable. Usually runs a little slower `than Array#sort` * so only use this when actually needing stable sort. */ -export function mergeSort(data: T[], compare: (a: T, b: T) => number): T[] { - _divideAndMerge(data, compare); +export function mergeSort(data: T[], compare: Compare): T[] { + _sort(data, compare, 0, data.length - 1, []); return data; } -function _divideAndMerge(data: T[], compare: (a: T, b: T) => number): void { - if (data.length <= 1) { - // sorted - return; +function _merge(a: T[], compare: Compare, lo: number, mid: number, hi: number, aux: T[]): void { + let leftIdx = lo, rightIdx = mid + 1; + for (let i = lo; i <= hi; i++) { + aux[i] = a[i]; } - const p = (data.length / 2) | 0; - const left = data.slice(0, p); - const right = data.slice(p); - - _divideAndMerge(left, compare); - _divideAndMerge(right, compare); - - let leftIdx = 0; - let rightIdx = 0; - let i = 0; - while (leftIdx < left.length && rightIdx < right.length) { - let ret = compare(left[leftIdx], right[rightIdx]); - if (ret <= 0) { - // smaller_equal -> take left to preserve order - data[i++] = left[leftIdx++]; + for (let i = lo; i <= hi; i++) { + if (leftIdx > mid) { + // left side consumed + a[i] = aux[rightIdx++]; + } else if (rightIdx > hi) { + // right side consumed + a[i] = aux[leftIdx++]; + } else if (compare(aux[rightIdx], aux[leftIdx]) < 0) { + // right element is less -> comes first + a[i] = aux[rightIdx++]; } else { - // greater -> take right - data[i++] = right[rightIdx++]; + // left element comes first (less or equal) + a[i] = aux[leftIdx++]; } } - while (leftIdx < left.length) { - data[i++] = left[leftIdx++]; - } - while (rightIdx < right.length) { - data[i++] = right[rightIdx++]; - } } +function _sort(a: T[], compare: Compare, lo: number, hi: number, aux: T[]) { + if (hi <= lo) { + return; + } + let mid = lo + ((hi - lo) / 2) | 0; + _sort(a, compare, lo, mid, aux); + _sort(a, compare, mid + 1, hi, aux); + if (compare(a[mid], a[mid + 1]) <= 0) { + // left and right are sorted and if the last-left element is less + // or equals than the first-right element there is nothing else + // to do + return; + } + _merge(a, compare, lo, mid, hi, aux); +} + + export function groupBy(data: T[], compare: (a: T, b: T) => number): T[][] { const result: T[][] = []; let currentGroup: T[]; @@ -276,12 +292,27 @@ function topStep(array: T[], compare: (a: T, b: T) => number, result: T[], i: /** * @returns a new array with all undefined or null values removed. The original array is not modified at all. */ -export function coalesce(array: T[]): T[] { +export function coalesce(array: T[]): T[]; +export function coalesce(array: T[], inplace: true): void; +export function coalesce(array: T[], inplace?: true): void | T[] { if (!array) { - return array; + if (!inplace) { + return array; + } } + if (!inplace) { + return array.filter(e => !!e); - return array.filter(e => !!e); + } else { + let to = 0; + for (let i = 0; i < array.length; i++) { + if (!!array[i]) { + array[to] = array[i]; + to += 1; + } + } + array.length = to; + } } /** @@ -338,7 +369,7 @@ export function uniqueFilter(keyFn: (t: T) => string): (t: T) => boolean { }; } -export function firstIndex(array: T[], fn: (item: T) => boolean): number { +export function firstIndex(array: T[] | ReadonlyArray, fn: (item: T) => boolean): number { for (let i = 0; i < array.length; i++) { const element = array[i]; @@ -350,7 +381,7 @@ export function firstIndex(array: T[], fn: (item: T) => boolean): number { return -1; } -export function first(array: T[], fn: (item: T) => boolean, notFoundValue: T = null): T { +export function first(array: T[] | ReadonlyArray, fn: (item: T) => boolean, notFoundValue: T = null): T { const index = firstIndex(array, fn); return index < 0 ? notFoundValue : array[index]; } @@ -443,15 +474,44 @@ export function arrayInsert(target: T[], insertIndex: number, insertArr: T[]) * Uses Fisher-Yates shuffle to shuffle the given array * @param array */ -export function shuffle(array: T[]): void { - var i = 0 - , j = 0 - , temp = null; +export function shuffle(array: T[], seed?: number): void { + // Seeded random number generator in JS. Modified from: + // https://stackoverflow.com/questions/521295/seeding-the-random-number-generator-in-javascript + const random = () => { + var x = Math.sin(seed++) * 179426549; // throw away most significant digits and reduce any potential bias + return x - Math.floor(x); + }; - for (i = array.length - 1; i > 0; i -= 1) { - j = Math.floor(Math.random() * (i + 1)); - temp = array[i]; + const rand = typeof seed === 'number' ? random : Math.random; + + for (let i = array.length - 1; i > 0; i -= 1) { + let j = Math.floor(rand() * (i + 1)); + let temp = array[i]; array[i] = array[j]; array[j] = temp; } -} \ No newline at end of file +} + +/** + * Pushes an element to the start of the array, if found. + */ +export function pushToStart(arr: T[], value: T): void { + const index = arr.indexOf(value); + + if (index > -1) { + arr.splice(index, 1); + arr.unshift(value); + } +} + +/** + * Pushes an element to the end of the array, if found. + */ +export function pushToEnd(arr: T[], value: T): void { + const index = arr.indexOf(value); + + if (index > -1) { + arr.splice(index, 1); + arr.push(value); + } +} diff --git a/src/vs/base/common/async.ts b/src/vs/base/common/async.ts index 68516bde36..e4a5348fdb 100644 --- a/src/vs/base/common/async.ts +++ b/src/vs/base/common/async.ts @@ -6,7 +6,7 @@ 'use strict'; import * as errors from 'vs/base/common/errors'; -import { Promise, TPromise, ValueCallback, ErrorCallback, ProgressCallback } from 'vs/base/common/winjs.base'; +import { TPromise, ValueCallback, ErrorCallback, ProgressCallback } from 'vs/base/common/winjs.base'; import { CancellationToken, CancellationTokenSource } from 'vs/base/common/cancellation'; import { Disposable, IDisposable } from 'vs/base/common/lifecycle'; import { Event, Emitter } from 'vs/base/common/event'; @@ -24,6 +24,48 @@ export function toThenable(arg: T | Thenable): Thenable { } } +export function toWinJsPromise(arg: Thenable | TPromise): TPromise { + if (arg instanceof TPromise) { + return arg; + } + + return new TPromise((resolve, reject) => arg.then(resolve, reject)); +} + +export interface CancelablePromise extends Promise { + cancel(): void; +} + +export function createCancelablePromise(callback: (token: CancellationToken) => Thenable): CancelablePromise { + const source = new CancellationTokenSource(); + + const thenable = callback(source.token); + const promise = new Promise((resolve, reject) => { + source.token.onCancellationRequested(() => { + reject(errors.canceled()); + }); + Promise.resolve(thenable).then(value => { + source.dispose(); + resolve(value); + }, err => { + source.dispose(); + reject(err); + }); + }); + + return new class implements CancelablePromise { + cancel() { + source.cancel(); + } + then(resolve?: ((value: T) => TResult1 | Thenable) | undefined | null, reject?: ((reason: any) => TResult2 | Thenable) | undefined | null): Promise { + return promise.then(resolve, reject); + } + catch(reject?: ((reason: any) => TResult | Thenable) | undefined | null): Promise { + return this.then(undefined, reject); + } + }; +} + export function asWinJsPromise(callback: (token: CancellationToken) => T | TPromise | Thenable): TPromise { let source = new CancellationTokenSource(); return new TPromise((resolve, reject, progress) => { @@ -69,6 +111,33 @@ export function wireCancellationToken(token: CancellationToken, promise: TPro return always(promise, () => subscription.dispose()); } +export function asDisposablePromise(input: Thenable, cancelValue?: T, bucket?: IDisposable[]): { promise: Thenable } & IDisposable { + let dispose: () => void; + let promise = new TPromise((resolve, reject) => { + dispose = function () { + resolve(cancelValue); + if (isWinJSPromise(input)) { + input.cancel(); + } + }; + input.then(resolve, err => { + if (errors.isPromiseCanceledError(err)) { + resolve(cancelValue); + } else { + reject(err); + } + }); + }); + let res = { + promise, + dispose + }; + if (Array.isArray(bucket)) { + bucket.push(res); + } + return res; +} + export interface ITask { (): T; } @@ -101,9 +170,9 @@ export interface ITask { */ export class Throttler { - private activePromise: Promise; - private queuedPromise: Promise; - private queuedPromiseFactory: ITask; + private activePromise: TPromise; + private queuedPromise: TPromise; + private queuedPromiseFactory: ITask; constructor() { this.activePromise = null; @@ -169,7 +238,7 @@ export class SimpleThrottler { * A helper to delay execution of a task that is being requested often. * * Following the throttler, now imagine the mail man wants to optimize the number of - * trips proactively. The trip itself can be long, so the he decides not to make the trip + * trips proactively. The trip itself can be long, so he decides not to make the trip * as soon as a letter is submitted. Instead he waits a while, in case more * letters are submitted. After said waiting period, if no letters were submitted, he * decides to make the trip. Imagine that N more letters were submitted after the first @@ -191,7 +260,7 @@ export class SimpleThrottler { export class Delayer { private timeout: number; - private completionPromise: Promise; + private completionPromise: TPromise; private onSuccess: ValueCallback; private task: ITask>; @@ -254,7 +323,7 @@ export class Delayer { * A helper to delay execution of a task that is being requested often, while * preventing accumulation of consecutive executions, while the task runs. * - * Simply combine the two mail man strategies from the Throttler and Delayer + * Simply combine the two mail men's strategies from the Throttler and Delayer * helpers, for an analogy. */ export class ThrottledDelayer extends Delayer> { @@ -283,7 +352,7 @@ export class Barrier { constructor() { this._isOpen = false; - this._promise = new TPromise((c, e, p) => { + this._promise = new TPromise((c, e) => { this._completePromise = c; }, () => { console.warn('You should really not try to cancel this ready promise!'); @@ -327,10 +396,18 @@ export class ShallowCancelThenPromise extends TPromise { } /** - * Replacement for `WinJS.Promise.timeout`. + * Replacement for `WinJS.TPromise.timeout`. */ -export function timeout(n: number): Promise { - return new Promise(resolve => setTimeout(resolve, n)); +export function timeout(n: number): CancelablePromise { + return createCancelablePromise(token => { + return new Promise((resolve, reject) => { + const handle = setTimeout(resolve, n); + token.onCancellationRequested(_ => { + clearTimeout(handle); + reject(errors.canceled()); + }); + }); + }); } function isWinJSPromise(candidate: any): candidate is TPromise { @@ -384,16 +461,11 @@ export function always(winjsPromiseOrThenable: Thenable | TPromise, f: export function sequence(promiseFactories: ITask>[]): TPromise { const results: T[] = []; + let index = 0; + const len = promiseFactories.length; - // reverse since we start with last element using pop() - promiseFactories = promiseFactories.reverse(); - - function next(): Thenable { - if (promiseFactories.length) { - return promiseFactories.pop()(); - } - - return null; + function next(): Thenable | null { + return index < len ? promiseFactories[index++]() : null; } function thenHandler(result: any): Thenable { @@ -412,15 +484,38 @@ export function sequence(promiseFactories: ITask>[]): TPromise(promiseFactories: ITask>[], shouldStop: (t: T) => boolean = t => !!t): TPromise { - promiseFactories = [...promiseFactories.reverse()]; +export function first2(promiseFactories: ITask>[], shouldStop: (t: T) => boolean = t => !!t, defaultValue: T = null): Promise { + + let index = 0; + const len = promiseFactories.length; + + const loop = () => { + if (index >= len) { + return Promise.resolve(defaultValue); + } + const factory = promiseFactories[index++]; + const promise = factory(); + return promise.then(result => { + if (shouldStop(result)) { + return Promise.resolve(result); + } + return loop(); + }); + }; + + return loop(); +} + +export function first(promiseFactories: ITask>[], shouldStop: (t: T) => boolean = t => !!t, defaultValue: T = null): TPromise { + let index = 0; + const len = promiseFactories.length; const loop: () => TPromise = () => { - if (promiseFactories.length === 0) { - return TPromise.as(null); + if (index >= len) { + return TPromise.as(defaultValue); } - const factory = promiseFactories.pop(); + const factory = promiseFactories[index++]; const promise = factory(); return promise.then(result => { @@ -436,7 +531,7 @@ export function first(promiseFactories: ITask>[], shouldStop: (t: } interface ILimitedTaskFactory { - factory: ITask; + factory: ITask; c: ValueCallback; e: ErrorCallback; p: ProgressCallback; @@ -467,7 +562,7 @@ export class Limiter { return this.runningPromises + this.outstandingPromises.length; } - queue(promiseFactory: ITask): Promise; + queue(promiseFactory: ITask): TPromise; queue(promiseFactory: ITask>): TPromise { return new TPromise((c, e, p) => { this.outstandingPromises.push({ @@ -620,12 +715,13 @@ export class IntervalTimer extends Disposable { export class RunOnceScheduler { + protected runner: (...args: any[]) => void; + private timeoutToken: number; - private runner: () => void; private timeout: number; private timeoutHandler: () => void; - constructor(runner: () => void, timeout: number) { + constructor(runner: (...args: any[]) => void, timeout: number) { this.timeoutToken = -1; this.runner = runner; this.timeout = timeout; @@ -668,61 +764,52 @@ export class RunOnceScheduler { private onTimeout() { this.timeoutToken = -1; if (this.runner) { - this.runner(); + this.doRun(); } } + + protected doRun(): void { + this.runner(); + } } -export function nfcall(fn: Function, ...args: any[]): Promise; +export class RunOnceWorker extends RunOnceScheduler { + private units: T[] = []; + + constructor(runner: (units: T[]) => void, timeout: number) { + super(runner, timeout); + } + + work(unit: T): void { + this.units.push(unit); + + if (!this.isScheduled()) { + this.schedule(); + } + } + + protected doRun(): void { + const units = this.units; + this.units = []; + + this.runner(units); + } + + dispose(): void { + this.units = []; + + super.dispose(); + } +} + +export function nfcall(fn: Function, ...args: any[]): TPromise; export function nfcall(fn: Function, ...args: any[]): TPromise; export function nfcall(fn: Function, ...args: any[]): any { return new TPromise((c, e) => fn(...args, (err: any, result: any) => err ? e(err) : c(result)), () => null); } -export function ninvoke(thisArg: any, fn: Function, ...args: any[]): Promise; +export function ninvoke(thisArg: any, fn: Function, ...args: any[]): TPromise; export function ninvoke(thisArg: any, fn: Function, ...args: any[]): TPromise; export function ninvoke(thisArg: any, fn: Function, ...args: any[]): any { return new TPromise((c, e) => fn.call(thisArg, ...args, (err: any, result: any) => err ? e(err) : c(result)), () => null); } - -/** - * An emitter that will ignore any events that occur during a specific code - * execution triggered via throttle() until the promise has finished (either - * successfully or with an error). Only after the promise has finished, the - * last event that was fired during the operation will get emitted. - * - */ -export class ThrottledEmitter extends Emitter { - private suspended: boolean; - - private lastEvent: T; - private hasLastEvent: boolean; - - public throttle(promise: TPromise): TPromise { - this.suspended = true; - - return always(promise, () => this.resume()); - } - - public fire(event?: T): any { - if (this.suspended) { - this.lastEvent = event; - this.hasLastEvent = true; - - return; - } - - return super.fire(event); - } - - private resume(): void { - this.suspended = false; - - if (this.hasLastEvent) { - this.fire(this.lastEvent); - } - - this.hasLastEvent = false; - this.lastEvent = void 0; - } -} diff --git a/src/vs/base/common/collections.ts b/src/vs/base/common/collections.ts index 068347bdda..3aa9caf741 100644 --- a/src/vs/base/common/collections.ts +++ b/src/vs/base/common/collections.ts @@ -47,6 +47,15 @@ export function size(from: IStringDictionary | INumberDictionary): numb return count; } +export function first(from: IStringDictionary | INumberDictionary): T { + for (let key in from) { + if (hasOwnProperty.call(from, key)) { + return from[key]; + } + } + return undefined; +} + /** * Iterates over each entry in the provided set. The iterator allows * to remove elements and will stop when the callback returns {{false}}. diff --git a/src/vs/base/common/color.ts b/src/vs/base/common/color.ts index eff12b77d1..724b41e05d 100644 --- a/src/vs/base/common/color.ts +++ b/src/vs/base/common/color.ts @@ -114,7 +114,7 @@ export class HSLA { return new HSLA(h, s, l, a); } - private static _hue2rgb(p: number, q: number, t: number) { + private static _hue2rgb(p: number, q: number, t: number): number { if (t < 0) { t += 1; } diff --git a/src/vs/base/common/date.ts b/src/vs/base/common/date.ts index c7c69f40a8..a9204cfab0 100644 --- a/src/vs/base/common/date.ts +++ b/src/vs/base/common/date.ts @@ -5,21 +5,15 @@ 'use strict'; -function pad(number: number): string { - if (number < 10) { - return '0' + number; - } - - return String(number); -} +import { pad } from './strings'; export function toLocalISOString(date: Date): string { return date.getFullYear() + - '-' + pad(date.getMonth() + 1) + - '-' + pad(date.getDate()) + - 'T' + pad(date.getHours()) + - ':' + pad(date.getMinutes()) + - ':' + pad(date.getSeconds()) + + '-' + pad(date.getMonth() + 1, 2) + + '-' + pad(date.getDate(), 2) + + 'T' + pad(date.getHours(), 2) + + ':' + pad(date.getMinutes(), 2) + + ':' + pad(date.getSeconds(), 2) + '.' + (date.getMilliseconds() / 1000).toFixed(3).slice(2, 5) + 'Z'; -} \ No newline at end of file +} diff --git a/src/vs/base/common/decorators.ts b/src/vs/base/common/decorators.ts index 40263f86c7..ba56d25660 100644 --- a/src/vs/base/common/decorators.ts +++ b/src/vs/base/common/decorators.ts @@ -69,19 +69,23 @@ export interface IDebouceReducer { export function debounce(delay: number, reducer?: IDebouceReducer, initialValueProvider?: () => T): Function { return createDecorator((fn, key) => { const timerKey = `$debounce$${key}`; - let result = initialValueProvider ? initialValueProvider() : void 0; + const resultKey = `$debounce$result$${key}`; return function (this: any, ...args: any[]) { + if (!this[resultKey]) { + this[resultKey] = initialValueProvider ? initialValueProvider() : void 0; + } + clearTimeout(this[timerKey]); if (reducer) { - result = reducer(result, ...args); - args = [result]; + this[resultKey] = reducer(this[resultKey], ...args); + args = [this[resultKey]]; } this[timerKey] = setTimeout(() => { fn.apply(this, args); - result = initialValueProvider ? initialValueProvider() : void 0; + this[resultKey] = initialValueProvider ? initialValueProvider() : void 0; }, delay); }; }); diff --git a/src/vs/base/common/diagnostics.ts b/src/vs/base/common/diagnostics.ts deleted file mode 100644 index 1f6436031c..0000000000 --- a/src/vs/base/common/diagnostics.ts +++ /dev/null @@ -1,88 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the Source EULA. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ -'use strict'; - -import * as Platform from 'vs/base/common/platform'; - -/** - * To enable diagnostics, open a browser console and type: window.Monaco.Diagnostics. = true. - * Then trigger an action that will write to diagnostics to see all cached output from the past. - */ - -const globals = Platform.globals; -if (!globals.Monaco) { - globals.Monaco = {}; -} -globals.Monaco.Diagnostics = {}; - -const switches = globals.Monaco.Diagnostics; -const map = new Map(); -const data: any[] = []; - -function fifo(array: any[], size: number) { - while (array.length > size) { - array.shift(); - } -} - -export function register(what: string, fn: Function): (...args: any[]) => void { - - let disable = true; // Otherwise we have unreachable code. - if (disable) { - return () => { - // Intentional empty, disable for now because it is leaking memory - }; - } - - // register switch - const flag = switches[what] || false; - switches[what] = flag; - - // register function - const tracers = map.get(what) || []; - tracers.push(fn); - map.set(what, tracers); - - const result = function (...args: any[]) { - - let idx: number; - - if (switches[what] === true) { - // replay back-in-time functions - const allArgs = [arguments]; - idx = data.indexOf(fn); - if (idx !== -1) { - allArgs.unshift.apply(allArgs, data[idx + 1] || []); - data[idx + 1] = []; - } - - const doIt: () => void = function () { - const thisArguments = allArgs.shift(); - fn.apply(fn, thisArguments); - if (allArgs.length > 0) { - setTimeout(doIt, 500); - } - }; - doIt(); - - } else { - // know where to store - idx = data.indexOf(fn); - idx = idx !== -1 ? idx : data.length; - const dataIdx = idx + 1; - - // store arguments - const allargs = data[dataIdx] || []; - allargs.push(arguments); - fifo(allargs, 50); - - // store data - data[idx] = fn; - data[dataIdx] = allargs; - } - }; - - return result; -} diff --git a/src/vs/base/common/diff/diff.ts b/src/vs/base/common/diff/diff.ts index eaf4aa4102..60b627b409 100644 --- a/src/vs/base/common/diff/diff.ts +++ b/src/vs/base/common/diff/diff.ts @@ -6,12 +6,10 @@ import { DiffChange } from 'vs/base/common/diff/diffChange'; - function createStringSequence(a: string): ISequence { - return { getLength() { return a.length; }, - getElementHash(pos: number) { return a[pos]; } + getElementAtIndex(pos: number) { return a.charCodeAt(pos); } }; } @@ -22,7 +20,7 @@ export function stringDiff(original: string, modified: string, pretty: boolean): export interface ISequence { getLength(): number; - getElementHash(index: number): string; + getElementAtIndex(index: number): number | string; } export interface IDiffChange { @@ -211,8 +209,6 @@ class DiffChangeHelper { } -const hasOwnProperty = Object.prototype.hasOwnProperty; - /** * An implementation of the difference algorithm described in * "An O(ND) Difference Algorithm and its variations" by Eugene W. Myers @@ -223,8 +219,6 @@ export class LcsDiff { private ModifiedSequence: ISequence; private ContinueProcessingPredicate: IContinueProcessingPredicate; - private m_originalIds: number[]; - private m_modifiedIds: number[]; private m_forwardHistory: number[][]; private m_reverseHistory: number[][]; @@ -235,63 +229,21 @@ export class LcsDiff { this.OriginalSequence = originalSequence; this.ModifiedSequence = newSequence; this.ContinueProcessingPredicate = continueProcessingPredicate; - this.m_originalIds = []; - this.m_modifiedIds = []; this.m_forwardHistory = []; this.m_reverseHistory = []; - - this.ComputeUniqueIdentifiers(); - } - - private ComputeUniqueIdentifiers(): void { - let originalSequenceLength = this.OriginalSequence.getLength(); - let modifiedSequenceLength = this.ModifiedSequence.getLength(); - this.m_originalIds = new Array(originalSequenceLength); - this.m_modifiedIds = new Array(modifiedSequenceLength); - - // Create a new hash table for unique elements from the original - // sequence. - let hashTable: { [key: string]: number; } = {}; - let currentUniqueId = 1; - let i: number; - - // Fill up the hash table for unique elements - for (i = 0; i < originalSequenceLength; i++) { - let originalElementHash = this.OriginalSequence.getElementHash(i); - if (!hasOwnProperty.call(hashTable, originalElementHash)) { - // No entry in the hashtable so this is a new unique element. - // Assign the element a new unique identifier and add it to the - // hash table - this.m_originalIds[i] = currentUniqueId++; - hashTable[originalElementHash] = this.m_originalIds[i]; - } else { - this.m_originalIds[i] = hashTable[originalElementHash]; - } - } - - // Now match up modified elements - for (i = 0; i < modifiedSequenceLength; i++) { - let modifiedElementHash = this.ModifiedSequence.getElementHash(i); - if (!hasOwnProperty.call(hashTable, modifiedElementHash)) { - this.m_modifiedIds[i] = currentUniqueId++; - hashTable[modifiedElementHash] = this.m_modifiedIds[i]; - } else { - this.m_modifiedIds[i] = hashTable[modifiedElementHash]; - } - } } private ElementsAreEqual(originalIndex: number, newIndex: number): boolean { - return this.m_originalIds[originalIndex] === this.m_modifiedIds[newIndex]; + return (this.OriginalSequence.getElementAtIndex(originalIndex) === this.ModifiedSequence.getElementAtIndex(newIndex)); } private OriginalElementsAreEqual(index1: number, index2: number): boolean { - return this.m_originalIds[index1] === this.m_originalIds[index2]; + return (this.OriginalSequence.getElementAtIndex(index1) === this.OriginalSequence.getElementAtIndex(index2)); } private ModifiedElementsAreEqual(index1: number, index2: number): boolean { - return this.m_modifiedIds[index1] === this.m_modifiedIds[index2]; + return (this.ModifiedSequence.getElementAtIndex(index1) === this.ModifiedSequence.getElementAtIndex(index2)); } public ComputeDiff(pretty: boolean): IDiffChange[] { @@ -891,7 +843,8 @@ export class LcsDiff { if (index <= 0 || index >= this.OriginalSequence.getLength() - 1) { return true; } - return /^\s*$/.test(this.OriginalSequence.getElementHash(index)); + const element = this.OriginalSequence.getElementAtIndex(index); + return (typeof element === 'string' && /^\s*$/.test(element)); } private _OriginalRegionIsBoundary(originalStart: number, originalLength: number): boolean { @@ -911,7 +864,8 @@ export class LcsDiff { if (index <= 0 || index >= this.ModifiedSequence.getLength() - 1) { return true; } - return /^\s*$/.test(this.ModifiedSequence.getElementHash(index)); + const element = this.ModifiedSequence.getElementAtIndex(index); + return (typeof element === 'string' && /^\s*$/.test(element)); } private _ModifiedRegionIsBoundary(modifiedStart: number, modifiedLength: number): boolean { diff --git a/src/vs/base/common/event.ts b/src/vs/base/common/event.ts index 905a14fb96..f577d5da0c 100644 --- a/src/vs/base/common/event.ts +++ b/src/vs/base/common/event.ts @@ -4,11 +4,11 @@ *--------------------------------------------------------------------------------------------*/ 'use strict'; -import { IDisposable, toDisposable, combinedDisposable, empty as EmptyDisposable } from 'vs/base/common/lifecycle'; -import { TPromise } from 'vs/base/common/winjs.base'; -import { once as onceFn } from 'vs/base/common/functional'; import { onUnexpectedError } from 'vs/base/common/errors'; +import { once as onceFn } from 'vs/base/common/functional'; +import { combinedDisposable, Disposable, IDisposable, toDisposable } from 'vs/base/common/lifecycle'; import { LinkedList } from 'vs/base/common/linkedList'; +import { TPromise } from 'vs/base/common/winjs.base'; /** * To an event a function with one or zero parameters @@ -58,9 +58,9 @@ export class Emitter { private static readonly _noop = function () { }; private _event: Event; - private _listeners: LinkedList; - private _deliveryQueue: [Listener, T][]; private _disposed: boolean; + private _deliveryQueue: [Listener, T][]; + protected _listeners: LinkedList; constructor(private _options?: EmitterOptions) { @@ -159,6 +159,52 @@ export class Emitter { } } +export interface IWaitUntil { + waitUntil(thenable: Thenable): void; +} + +export class AsyncEmitter extends Emitter { + + private _asyncDeliveryQueue: [Listener, T, Thenable[]][]; + + async fireAsync(eventFn: (thenables: Thenable[], listener: Function) => T): Promise { + if (!this._listeners) { + return; + } + + // put all [listener,event]-pairs into delivery queue + // then emit all event. an inner/nested event might be + // the driver of this + if (!this._asyncDeliveryQueue) { + this._asyncDeliveryQueue = []; + } + + for (let iter = this._listeners.iterator(), e = iter.next(); !e.done; e = iter.next()) { + let thenables: Thenable[] = []; + this._asyncDeliveryQueue.push([e.value, eventFn(thenables, typeof e.value === 'function' ? e.value : e.value[0]), thenables]); + } + + while (this._asyncDeliveryQueue.length > 0) { + const [listener, event, thenables] = this._asyncDeliveryQueue.shift(); + try { + if (typeof listener === 'function') { + listener.call(undefined, event); + } else { + listener[0].call(listener[1], event); + } + } catch (e) { + onUnexpectedError(e); + continue; + } + + // freeze thenables-collection to enforce sync-calls to + // wait until and then wait for all thenables to resolve + Object.freeze(thenables); + await Promise.all(thenables); + } + } +} + export class EventMultiplexer implements IDisposable { private readonly emitter: Emitter; @@ -367,6 +413,7 @@ export interface IChainableEvent { filter(fn: (e: T) => boolean): IChainableEvent; latch(): IChainableEvent; on(listener: (e: T) => any, thisArgs?: any, disposables?: IDisposable[]): IDisposable; + once(listener: (e: T) => any, thisArgs?: any, disposables?: IDisposable[]): IDisposable; } export function mapEvent(event: Event, map: (i: I) => O): Event { @@ -377,6 +424,8 @@ export function forEach(event: Event, each: (i: I) => void): Event { return (listener, thisArgs = null, disposables?) => event(i => { each(i); listener.call(thisArgs, i); }, null, disposables); } +export function filterEvent(event: Event, filter: (e: T) => boolean): Event; +export function filterEvent(event: Event, filter: (e: T | R) => e is R): Event; export function filterEvent(event: Event, filter: (e: T) => boolean): Event { return (listener, thisArgs = null, disposables?) => event(e => filter(e) && listener.call(thisArgs, e), null, disposables); } @@ -406,6 +455,10 @@ class ChainableEvent implements IChainableEvent { on(listener: (e: T) => any, thisArgs: any, disposables: IDisposable[]) { return this._event(listener, thisArgs, disposables); } + + once(listener: (e: T) => any, thisArgs: any, disposables: IDisposable[]) { + return once(this._event)(listener, thisArgs, disposables); + } } export function chain(event: Event): IChainableEvent { @@ -513,7 +566,7 @@ export class Relay implements IDisposable { private emitter = new Emitter(); readonly event: Event = this.emitter.event; - private disposable: IDisposable = EmptyDisposable; + private disposable: IDisposable = Disposable.None; set input(event: Event) { this.disposable.dispose(); @@ -550,4 +603,4 @@ export function latch(event: Event): Event { cache = value; return shouldEmit; }); -} \ No newline at end of file +} diff --git a/src/vs/base/common/filters.ts b/src/vs/base/common/filters.ts index fbd14dce7c..70721e7ecf 100644 --- a/src/vs/base/common/filters.ts +++ b/src/vs/base/common/filters.ts @@ -255,7 +255,8 @@ export function matchesCamelCase(word: string, camelCaseWord: string): IMatch[] let result: IMatch[] = null; let i = 0; - while (i < camelCaseWord.length && (result = _matchesCamelCase(word.toLowerCase(), camelCaseWord, 0, i)) === null) { + word = word.toLowerCase(); + while (i < camelCaseWord.length && (result = _matchesCamelCase(word, camelCaseWord, 0, i)) === null) { i = nextAnchor(camelCaseWord, i + 1); } @@ -275,7 +276,9 @@ export function matchesWords(word: string, target: string, contiguous: boolean = let result: IMatch[] = null; let i = 0; - while (i < target.length && (result = _matchesWords(word.toLowerCase(), target, 0, i, contiguous)) === null) { + word = word.toLowerCase(); + target = target.toLowerCase(); + while (i < target.length && (result = _matchesWords(word, target, 0, i, contiguous)) === null) { i = nextWord(target, i + 1); } @@ -287,7 +290,7 @@ function _matchesWords(word: string, target: string, i: number, j: number, conti return []; } else if (j === target.length) { return null; - } else if (word[i] !== target[j].toLowerCase()) { + } else if (word[i] !== target[j]) { return null; } else { let result: IMatch[] = null; @@ -341,7 +344,7 @@ export function matchesFuzzy(word: string, wordToMatchAgainst: string, enableSep return enableSeparateSubstringMatching ? fuzzySeparateFilter(word, wordToMatchAgainst) : fuzzyContiguousFilter(word, wordToMatchAgainst); } -export function skipScore(pattern: string, word: string, patternMaxWhitespaceIgnore?: number): [number, number[]] { +export function anyScore(pattern: string, word: string, patternMaxWhitespaceIgnore?: number): FuzzyScore { pattern = pattern.toLowerCase(); word = word.toLowerCase(); @@ -452,7 +455,9 @@ function isWhitespaceAtPos(value: string, index: number): boolean { const enum Arrow { Top = 0b1, Diag = 0b10, Left = 0b100 } -export function fuzzyScore(pattern: string, word: string, patternMaxWhitespaceIgnore?: number): [number, number[]] { +export type FuzzyScore = [number, number[]]; + +export function fuzzyScore(pattern: string, word: string, patternMaxWhitespaceIgnore?: number, firstMatchCanBeWeak?: boolean): FuzzyScore { const patternLen = pattern.length > 100 ? 100 : pattern.length; const wordLen = word.length > 100 ? 100 : word.length; @@ -514,7 +519,7 @@ export function fuzzyScore(pattern: string, word: string, patternMaxWhitespaceIg } else { score = 5; } - } else if (lowWordChar !== word[wordPos - 1]) { + } else if (lowWordChar !== word[wordPos - 1] && (wordPos === 1 || lowWord[wordPos - 2] === word[wordPos - 2])) { // hitting upper-case: `foo <-> forOthers` if (pattern[patternPos - 1] === word[wordPos - 1]) { score = 7; @@ -576,6 +581,7 @@ export function fuzzyScore(pattern: string, word: string, patternMaxWhitespaceIg _matchesCount = 0; _topScore = -100; _patternStartPos = patternStartPos; + _firstMatchCanBeWeak = firstMatchCanBeWeak; _findAllMatches(patternLen, wordLen, patternLen === wordLen ? 1 : 0, new LazyArray(), false); if (_matchesCount === 0) { @@ -589,6 +595,7 @@ let _matchesCount: number = 0; let _topMatch: LazyArray; let _topScore: number = 0; let _patternStartPos: number = 0; +let _firstMatchCanBeWeak: boolean = false; function _findAllMatches(patternPos: number, wordPos: number, total: number, matches: LazyArray, lastMatched: boolean): void { @@ -642,7 +649,7 @@ function _findAllMatches(patternPos: number, wordPos: number, total: number, mat if (score === 1) { simpleMatchCount += 1; - if (patternPos === _patternStartPos) { + if (patternPos === _patternStartPos && !_firstMatchCanBeWeak) { // when the first match is a weak // match we discard it return undefined; @@ -715,15 +722,15 @@ class LazyArray { //#region --- graceful --- -export function fuzzyScoreGracefulAggressive(pattern: string, word: string, patternMaxWhitespaceIgnore?: number): [number, number[]] { +export function fuzzyScoreGracefulAggressive(pattern: string, word: string, patternMaxWhitespaceIgnore?: number): FuzzyScore { return fuzzyScoreWithPermutations(pattern, word, true, patternMaxWhitespaceIgnore); } -export function fuzzyScoreGraceful(pattern: string, word: string, patternMaxWhitespaceIgnore?: number): [number, number[]] { +export function fuzzyScoreGraceful(pattern: string, word: string, patternMaxWhitespaceIgnore?: number): FuzzyScore { return fuzzyScoreWithPermutations(pattern, word, false, patternMaxWhitespaceIgnore); } -function fuzzyScoreWithPermutations(pattern: string, word: string, aggressive?: boolean, patternMaxWhitespaceIgnore?: number): [number, number[]] { +function fuzzyScoreWithPermutations(pattern: string, word: string, aggressive?: boolean, patternMaxWhitespaceIgnore?: number): FuzzyScore { let top: [number, number[]] = fuzzyScore(pattern, word, patternMaxWhitespaceIgnore); if (top && !aggressive) { diff --git a/src/vs/base/common/glob.ts b/src/vs/base/common/glob.ts index 91720fcad0..f9bd14d21a 100644 --- a/src/vs/base/common/glob.ts +++ b/src/vs/base/common/glob.ts @@ -247,8 +247,8 @@ const T5 = /^([\w\.-]+(\/[\w\.-]+)*)\/?$/; // something/else export type ParsedPattern = (path: string, basename?: string) => boolean; -// The ParsedExpression returns a Promise iff siblingsFn returns a Promise. -export type ParsedExpression = (path: string, basename?: string, siblingsFn?: () => string[] | TPromise) => string | TPromise /* the matching pattern */; +// The ParsedExpression returns a Promise iff hasSibling returns a Promise. +export type ParsedExpression = (path: string, basename?: string, hasSibling?: (name: string) => boolean | TPromise) => string | TPromise /* the matching pattern */; export interface IGlobOptions { /** @@ -264,9 +264,8 @@ interface ParsedStringPattern { allBasenames?: string[]; allPaths?: string[]; } -type SiblingsPattern = { siblings: string[], name: string }; interface ParsedExpressionPattern { - (path: string, basename: string, siblingsPatternFn: () => SiblingsPattern | TPromise): string | TPromise /* the matching pattern */; + (path: string, basename: string, name: string, hasSibling: (name: string) => boolean | TPromise): string | TPromise /* the matching pattern */; requiresSiblings?: boolean; allBasenames?: string[]; allPaths?: string[]; @@ -436,13 +435,13 @@ function toRegExp(pattern: string): ParsedStringPattern { * - character ranges (using [...]) */ export function match(pattern: string | IRelativePattern, path: string): boolean; -export function match(expression: IExpression, path: string, siblingsFn?: () => string[]): string /* the matching pattern */; -export function match(arg1: string | IExpression | IRelativePattern, path: string, siblingsFn?: () => string[]): any { +export function match(expression: IExpression, path: string, hasSibling?: (name: string) => boolean): string /* the matching pattern */; +export function match(arg1: string | IExpression | IRelativePattern, path: string, hasSibling?: (name: string) => boolean): any { if (!arg1 || !path) { return false; } - return parse(arg1)(path, undefined, siblingsFn); + return parse(arg1)(path, undefined, hasSibling); } /** @@ -482,6 +481,44 @@ export function parse(arg1: string | IExpression | IRelativePattern, options: IG return parsedExpression(arg1, options); } +export function hasSiblingPromiseFn(siblingsFn?: () => TPromise) { + if (!siblingsFn) { + return undefined; + } + + let siblings: TPromise>; + return (name: string) => { + if (!siblings) { + siblings = (siblingsFn() || TPromise.as([])) + .then(list => list ? listToMap(list) : {}); + } + return siblings.then(map => !!map[name]); + }; +} + +export function hasSiblingFn(siblingsFn?: () => string[]) { + if (!siblingsFn) { + return undefined; + } + + let siblings: Record; + return (name: string) => { + if (!siblings) { + const list = siblingsFn(); + siblings = list ? listToMap(list) : {}; + } + return !!siblings[name]; + }; +} + +function listToMap(list: string[]) { + const map: Record = {}; + for (const key of list) { + map[key] = true; + } + return map; +} + export function isRelativePattern(obj: any): obj is IRelativePattern { const rp = obj as IRelativePattern; @@ -493,8 +530,8 @@ export function isRelativePattern(obj: any): obj is IRelativePattern { */ export function parseToAsync(expression: IExpression, options?: IGlobOptions): ParsedExpression { const parsedExpression = parse(expression, options); - return (path: string, basename?: string, siblingsFn?: () => string[] | TPromise): string | TPromise => { - const result = parsedExpression(path, basename, siblingsFn); + return (path: string, basename?: string, hasSibling?: (name: string) => boolean | TPromise): string | TPromise => { + const result = parsedExpression(path, basename, hasSibling); return result instanceof TPromise ? result : TPromise.as(result); }; } @@ -522,7 +559,7 @@ function parsedExpression(expression: IExpression, options: IGlobOptions): Parse return parsedPatterns[0]; } - const resultExpression: ParsedStringPattern = function (path: string, basename: string, siblingsFn?: () => string[]) { + const resultExpression: ParsedStringPattern = function (path: string, basename: string) { for (let i = 0, n = parsedPatterns.length; i < n; i++) { // Pattern matches path const result = (parsedPatterns[i])(path, basename); @@ -547,38 +584,21 @@ function parsedExpression(expression: IExpression, options: IGlobOptions): Parse return resultExpression; } - const resultExpression: ParsedStringPattern = function (path: string, basename: string, siblingsFn?: () => string[] | TPromise) { - let siblingsPattern: SiblingsPattern | TPromise; - let siblingsResolved = !siblingsFn; - - function siblingsToSiblingsPattern(siblings: string[]) { - if (siblings && siblings.length) { - if (!basename) { - basename = paths.basename(path); - } - const name = basename.substr(0, basename.length - paths.extname(path).length); - return { siblings, name }; - } - - return undefined; - } - - function siblingsPatternFn() { - // Resolve siblings only once - if (!siblingsResolved) { - siblingsResolved = true; - const siblings = siblingsFn(); - siblingsPattern = TPromise.is(siblings) ? - siblings.then(siblingsToSiblingsPattern) : - siblingsToSiblingsPattern(siblings); - } - - return siblingsPattern; - } + const resultExpression: ParsedStringPattern = function (path: string, basename: string, hasSibling?: (name: string) => boolean | TPromise) { + let name: string; for (let i = 0, n = parsedPatterns.length; i < n; i++) { // Pattern matches path - const result = (parsedPatterns[i])(path, basename, siblingsPatternFn); + const parsedPattern = (parsedPatterns[i]); + if (parsedPattern.requiresSiblings && hasSibling) { + if (!basename) { + basename = paths.basename(path); + } + if (!name) { + name = basename.substr(0, basename.length - paths.extname(path).length); + } + } + const result = parsedPattern(path, basename, name, hasSibling); if (result) { return result; } @@ -619,28 +639,16 @@ function parseExpressionPattern(pattern: string, value: any, options: IGlobOptio if (value) { const when = (value).when; if (typeof when === 'string') { - const siblingsPatternToMatchingPattern = (siblingsPattern: SiblingsPattern): string => { - let clausePattern = when.replace('$(basename)', siblingsPattern.name); - if (siblingsPattern.siblings.indexOf(clausePattern) !== -1) { - return pattern; - } else { - return null; // pattern does not match in the end because the when clause is not satisfied - } - }; - - const result: ParsedExpressionPattern = (path: string, basename: string, siblingsPatternFn: () => SiblingsPattern | TPromise) => { - if (!parsedPattern(path, basename)) { + const result: ParsedExpressionPattern = (path: string, basename: string, name: string, hasSibling: (name: string) => boolean | TPromise) => { + if (!hasSibling || !parsedPattern(path, basename)) { return null; } - const siblingsPattern = siblingsPatternFn(); - if (!siblingsPattern) { - return null; // pattern is malformed or we don't have siblings - } - - return TPromise.is(siblingsPattern) ? - siblingsPattern.then(siblingsPatternToMatchingPattern) : - siblingsPatternToMatchingPattern(siblingsPattern); + const clausePattern = when.replace('$(basename)', name); + const matched = hasSibling(clausePattern); + return TPromise.is(matched) ? + matched.then(m => m ? pattern : null) : + matched ? pattern : null; }; result.requiresSiblings = true; return result; diff --git a/src/vs/base/common/history.ts b/src/vs/base/common/history.ts index ce55554d65..6c7f04e2c4 100644 --- a/src/vs/base/common/history.ts +++ b/src/vs/base/common/history.ts @@ -27,26 +27,12 @@ export class HistoryNavigator implements INavigator { this._onChange(); } - public addIfNotPresent(t: T) { - if (!this._history.has(t)) { - this.add(t); - } - } - public next(): T { - if (this._navigator.next()) { - return this._navigator.current(); - } - this.last(); - return null; + return this._navigator.next(); } public previous(): T { - if (this._navigator.previous()) { - return this._navigator.current(); - } - this.first(); - return null; + return this._navigator.previous(); } public current(): T { @@ -65,6 +51,10 @@ export class HistoryNavigator implements INavigator { return this._navigator.last(); } + public has(t: T): boolean { + return this._history.has(t); + } + public clear(): void { this._initialize([]); this._onChange(); @@ -72,8 +62,7 @@ export class HistoryNavigator implements INavigator { private _onChange() { this._reduceToLimit(); - this._navigator = new ArrayNavigator(this._elements); - this._navigator.last(); + this._navigator = new ArrayNavigator(this._elements, 0, this._elements.length, this._elements.length); } private _reduceToLimit() { @@ -95,4 +84,4 @@ export class HistoryNavigator implements INavigator { this._history.forEach(e => elements.push(e)); return elements; } -} \ No newline at end of file +} diff --git a/src/vs/base/common/iterator.ts b/src/vs/base/common/iterator.ts index c029128103..748b667955 100644 --- a/src/vs/base/common/iterator.ts +++ b/src/vs/base/common/iterator.ts @@ -5,8 +5,86 @@ 'use strict'; -export interface IIterator { - next(): { readonly done: boolean, readonly value: E }; +export interface IteratorResult { + readonly done: boolean; + readonly value: T | undefined; +} + +export interface Iterator { + next(): IteratorResult; +} + +export module Iterator { + const _empty: Iterator = { + next() { + return { done: true, value: undefined }; + } + }; + + export function empty(): Iterator { + return _empty; + } + + export function iterate(array: T[], index = 0, length = array.length): Iterator { + return { + next(): IteratorResult { + if (index >= length) { + return { done: true, value: undefined }; + } + + return { done: false, value: array[index++] }; + } + }; + } + + export function map(iterator: Iterator, fn: (t: T) => R): Iterator { + return { + next() { + const { done, value } = iterator.next(); + return { done, value: done ? undefined : fn(value) }; + } + }; + } + + export function filter(iterator: Iterator, fn: (t: T) => boolean): Iterator { + return { + next() { + while (true) { + const { done, value } = iterator.next(); + + if (done) { + return { done, value: undefined }; + } + + if (fn(value)) { + return { done, value }; + } + } + } + }; + } + + export function forEach(iterator: Iterator, fn: (t: T) => void): void { + for (let next = iterator.next(); !next.done; next = iterator.next()) { + fn(next.value); + } + } + + export function collect(iterator: Iterator): T[] { + const result: T[] = []; + forEach(iterator, value => result.push(value)); + return result; + } +} + +export type ISequence = Iterator | T[]; + +export function getSequenceIterator(arg: Iterator | T[]): Iterator { + if (Array.isArray(arg)) { + return Iterator.iterate(arg); + } else { + return arg; + } } export interface INextIterator { @@ -20,11 +98,11 @@ export class ArrayIterator implements INextIterator { protected end: number; protected index: number; - constructor(items: T[], start: number = 0, end: number = items.length) { + constructor(items: T[], start: number = 0, end: number = items.length, index = start - 1) { this.items = items; this.start = start; this.end = end; - this.index = start - 1; + this.index = index; } public first(): T { @@ -48,8 +126,8 @@ export class ArrayIterator implements INextIterator { export class ArrayNavigator extends ArrayIterator implements INavigator { - constructor(items: T[], start: number = 0, end: number = items.length) { - super(items, start, end); + constructor(items: T[], start: number = 0, end: number = items.length, index = start - 1) { + super(items, start, end, index); } public current(): T { diff --git a/src/vs/base/common/json.ts b/src/vs/base/common/json.ts index e9223c2b0e..af28d679c0 100644 --- a/src/vs/base/common/json.ts +++ b/src/vs/base/common/json.ts @@ -407,6 +407,7 @@ export function createScanner(text: string, ignoreTrivia: boolean = false): JSON case CharacterCodes.doubleQuote: case CharacterCodes.colon: case CharacterCodes.comma: + case CharacterCodes.slash: return false; } return true; @@ -628,7 +629,7 @@ export type JSONPath = Segment[]; export interface ParseOptions { disallowComments?: boolean; - allowTrailingComma?: boolean; + disallowTrailingComma?: boolean; } /** @@ -817,7 +818,7 @@ export function visit(text: string, visitor: JSONVisitor, options?: ParseOptions onError = toOneArgVisit(visitor.onError); let disallowComments = options && options.disallowComments; - let allowTrailingComma = options && options.allowTrailingComma; + let disallowTrailingComma = options && options.disallowTrailingComma; function scanNext(): SyntaxKind { while (true) { let token = _scanner.scan(); @@ -929,7 +930,7 @@ export function visit(text: string, visitor: JSONVisitor, options?: ParseOptions } onSeparator(','); scanNext(); // consume comma - if (_scanner.getToken() === SyntaxKind.CloseBraceToken && allowTrailingComma) { + if (_scanner.getToken() === SyntaxKind.CloseBraceToken && !disallowTrailingComma) { break; } } else if (needsComma) { @@ -961,7 +962,7 @@ export function visit(text: string, visitor: JSONVisitor, options?: ParseOptions } onSeparator(','); scanNext(); // consume comma - if (_scanner.getToken() === SyntaxKind.CloseBracketToken && allowTrailingComma) { + if (_scanner.getToken() === SyntaxKind.CloseBracketToken && !disallowTrailingComma) { break; } } else if (needsComma) { diff --git a/src/vs/base/common/keybindingLabels.ts b/src/vs/base/common/keybindingLabels.ts index 16ec6fbd8e..6688faf7f8 100644 --- a/src/vs/base/common/keybindingLabels.ts +++ b/src/vs/base/common/keybindingLabels.ts @@ -59,6 +59,13 @@ export const UILabelProvider = new ModifierLabelProvider( altKey: nls.localize({ key: 'altKey', comment: ['This is the short form for the Alt key on the keyboard'] }, "Alt"), metaKey: nls.localize({ key: 'windowsKey', comment: ['This is the short form for the Windows key on the keyboard'] }, "Windows"), separator: '+', + }, + { + ctrlKey: nls.localize({ key: 'ctrlKey', comment: ['This is the short form for the Control key on the keyboard'] }, "Ctrl"), + shiftKey: nls.localize({ key: 'shiftKey', comment: ['This is the short form for the Shift key on the keyboard'] }, "Shift"), + altKey: nls.localize({ key: 'altKey', comment: ['This is the short form for the Alt key on the keyboard'] }, "Alt"), + metaKey: nls.localize({ key: 'superKey', comment: ['This is the short form for the Super key on the keyboard'] }, "Super"), + separator: '+', } ); @@ -79,6 +86,13 @@ export const AriaLabelProvider = new ModifierLabelProvider( altKey: nls.localize({ key: 'altKey.long', comment: ['This is the long form for the Alt key on the keyboard'] }, "Alt"), metaKey: nls.localize({ key: 'windowsKey.long', comment: ['This is the long form for the Windows key on the keyboard'] }, "Windows"), separator: '+', + }, + { + ctrlKey: nls.localize({ key: 'ctrlKey.long', comment: ['This is the long form for the Control key on the keyboard'] }, "Control"), + shiftKey: nls.localize({ key: 'shiftKey.long', comment: ['This is the long form for the Shift key on the keyboard'] }, "Shift"), + altKey: nls.localize({ key: 'altKey.long', comment: ['This is the long form for the Alt key on the keyboard'] }, "Alt"), + metaKey: nls.localize({ key: 'superKey.long', comment: ['This is the long form for the Super key on the keyboard'] }, "Super"), + separator: '+', } ); diff --git a/src/vs/base/common/labels.ts b/src/vs/base/common/labels.ts index 13f7759658..8ef001945d 100644 --- a/src/vs/base/common/labels.ts +++ b/src/vs/base/common/labels.ts @@ -5,15 +5,16 @@ 'use strict'; import URI from 'vs/base/common/uri'; -import { nativeSep, normalize, basename as pathsBasename, join, sep } from 'vs/base/common/paths'; -import { endsWith, ltrim, equalsIgnoreCase, startsWithIgnoreCase, rtrim, startsWith } from 'vs/base/common/strings'; +import { nativeSep, normalize, basename as pathsBasename, sep } from 'vs/base/common/paths'; +import { endsWith, ltrim, startsWithIgnoreCase, rtrim, startsWith } from 'vs/base/common/strings'; import { Schemas } from 'vs/base/common/network'; import { isLinux, isWindows, isMacintosh } from 'vs/base/common/platform'; +import { isEqual } from 'vs/base/common/resources'; export interface IWorkspaceFolderProvider { - getWorkspaceFolder(resource: URI): { uri: URI }; + getWorkspaceFolder(resource: URI): { uri: URI, name?: string }; getWorkspace(): { - folders: { uri: URI }[]; + folders: { uri: URI, name?: string }[]; }; } @@ -21,7 +22,10 @@ export interface IUserHomeProvider { userHome: string; } -export function getPathLabel(resource: URI | string, rootProvider?: IWorkspaceFolderProvider, userHomeProvider?: IUserHomeProvider): string { +/** + * @deprecated use UriLabelService instead + */ +export function getPathLabel(resource: URI | string, userHomeProvider: IUserHomeProvider, rootProvider?: IWorkspaceFolderProvider): string { if (!resource) { return null; } @@ -30,31 +34,31 @@ export function getPathLabel(resource: URI | string, rootProvider?: IWorkspaceFo resource = URI.file(resource); } - // return early if the resource is neither file:// nor untitled:// - if (resource.scheme !== Schemas.file && resource.scheme !== Schemas.untitled) { - return resource.with({ query: null, fragment: null }).toString(true); - } - // return early if we can resolve a relative path label from the root const baseResource = rootProvider ? rootProvider.getWorkspaceFolder(resource) : null; if (baseResource) { const hasMultipleRoots = rootProvider.getWorkspace().folders.length > 1; let pathLabel: string; - if (isLinux ? baseResource.uri.fsPath === resource.fsPath : equalsIgnoreCase(baseResource.uri.fsPath, resource.fsPath)) { - pathLabel = ''; // no label if pathes are identical + if (isEqual(baseResource.uri, resource, !isLinux)) { + pathLabel = ''; // no label if paths are identical } else { - pathLabel = normalize(ltrim(resource.fsPath.substr(baseResource.uri.fsPath.length), nativeSep), true); + pathLabel = normalize(ltrim(resource.path.substr(baseResource.uri.path.length), sep), true); } if (hasMultipleRoots) { - const rootName = pathsBasename(baseResource.uri.fsPath); - pathLabel = pathLabel ? join(rootName, pathLabel) : rootName; // always show root basename if there are multiple + const rootName = (baseResource && baseResource.name) ? baseResource.name : pathsBasename(baseResource.uri.fsPath); + pathLabel = pathLabel ? (rootName + ' • ' + pathLabel) : rootName; // always show root basename if there are multiple } return pathLabel; } + // return if the resource is neither file:// nor untitled:// and no baseResource was provided + if (resource.scheme !== Schemas.file && resource.scheme !== Schemas.untitled) { + return resource.with({ query: null, fragment: null }).toString(true); + } + // convert c:\something => C:\something if (hasDriveLetter(resource.fsPath)) { return normalize(normalizeDriveLetter(resource.fsPath), true); @@ -78,7 +82,7 @@ export function getBaseLabel(resource: URI | string): string { resource = URI.file(resource); } - const base = pathsBasename(resource.fsPath) || resource.fsPath /* can be empty string if '/' is passed in */; + const base = pathsBasename(resource.path) || (resource.scheme === Schemas.file ? resource.fsPath : resource.path) /* can be empty string if '/' is passed in */; // convert c: => C: if (hasDriveLetter(base)) { diff --git a/src/vs/base/common/lifecycle.ts b/src/vs/base/common/lifecycle.ts index 0452c56e4b..39f17f1e19 100644 --- a/src/vs/base/common/lifecycle.ts +++ b/src/vs/base/common/lifecycle.ts @@ -7,10 +7,6 @@ import { once } from 'vs/base/common/functional'; -export const empty: IDisposable = Object.freeze({ - dispose() { } -}); - export interface IDisposable { dispose(): void; } @@ -24,7 +20,6 @@ export function dispose(disposable: T): T; export function dispose(...disposables: T[]): T[]; export function dispose(disposables: T[]): T[]; export function dispose(first: T | T[], ...rest: T[]): T | T[] { - if (Array.isArray(first)) { first.forEach(d => d && d.dispose()); return []; @@ -45,23 +40,16 @@ export function combinedDisposable(disposables: IDisposable[]): IDisposable { return { dispose: () => dispose(disposables) }; } -export function toDisposable(...fns: (() => void)[]): IDisposable { - return { - dispose() { - for (const fn of fns) { - fn(); - } - } - }; +export function toDisposable(fn: () => void): IDisposable { + return { dispose() { fn(); } }; } export abstract class Disposable implements IDisposable { - private _toDispose: IDisposable[]; + static None = Object.freeze({ dispose() { } }); - constructor() { - this._toDispose = []; - } + protected _toDispose: IDisposable[] = []; + protected get toDispose(): IDisposable[] { return this._toDispose; } public dispose(): void { this._toDispose = dispose(this._toDispose); @@ -69,6 +57,7 @@ export abstract class Disposable implements IDisposable { protected _register(t: T): T { this._toDispose.push(t); + return t; } } diff --git a/src/vs/base/common/linkedList.ts b/src/vs/base/common/linkedList.ts index 0df56fb565..d7e23d9eaa 100644 --- a/src/vs/base/common/linkedList.ts +++ b/src/vs/base/common/linkedList.ts @@ -5,7 +5,7 @@ 'use strict'; -import { IIterator } from 'vs/base/common/iterator'; +import { Iterator } from 'vs/base/common/iterator'; class Node { element: E; @@ -94,7 +94,7 @@ export class LinkedList { }; } - iterator(): IIterator { + iterator(): Iterator { let element = { done: undefined, value: undefined, diff --git a/src/vs/base/common/map.ts b/src/vs/base/common/map.ts index f24bc0959f..531e093bcd 100644 --- a/src/vs/base/common/map.ts +++ b/src/vs/base/common/map.ts @@ -6,6 +6,8 @@ 'use strict'; import URI from 'vs/base/common/uri'; +import { CharCode } from 'vs/base/common/charCode'; +import { Iterator } from './iterator'; export function values(set: Set): V[]; export function values(map: Map): V[]; @@ -35,7 +37,6 @@ export function getOrSet(map: Map, key: K, value: V): V { export interface IKeyIterator { reset(key: string): this; next(): this; - join(parts: string[]): string; hasNext(): boolean; cmp(a: string): number; @@ -58,10 +59,6 @@ export class StringIterator implements IKeyIterator { return this; } - join(parts: string[]): string { - return parts.join(''); - } - hasNext(): boolean { return this._pos < this._value.length - 1; } @@ -79,9 +76,6 @@ export class StringIterator implements IKeyIterator { export class PathIterator implements IKeyIterator { - private static readonly _fwd = '/'.charCodeAt(0); - private static readonly _bwd = '\\'.charCodeAt(0); - private _value: string; private _from: number; private _to: number; @@ -97,17 +91,13 @@ export class PathIterator implements IKeyIterator { return this._to < this._value.length; } - join(parts: string[]): string { - return parts.join('/'); - } - next(): this { // this._data = key.split(/[\\/]/).filter(s => !!s); this._from = this._to; let justSeps = true; for (; this._to < this._value.length; this._to++) { const ch = this._value.charCodeAt(this._to); - if (ch === PathIterator._fwd || ch === PathIterator._bwd) { + if (ch === CharCode.Slash || ch === CharCode.Backslash) { if (justSeps) { this._from++; } else { @@ -150,14 +140,15 @@ export class PathIterator implements IKeyIterator { } class TernarySearchTreeNode { - str: string; - element: E; + segment: string; + value: E; + key: string; left: TernarySearchTreeNode; mid: TernarySearchTreeNode; right: TernarySearchTreeNode; isEmpty(): boolean { - return !this.left && !this.mid && !this.right && !this.element; + return !this.left && !this.mid && !this.right && !this.value; } } @@ -188,17 +179,17 @@ export class TernarySearchTree { if (!this._root) { this._root = new TernarySearchTreeNode(); - this._root.str = iter.value(); + this._root.segment = iter.value(); } node = this._root; while (true) { - let val = iter.cmp(node.str); + let val = iter.cmp(node.segment); if (val > 0) { // left if (!node.left) { node.left = new TernarySearchTreeNode(); - node.left.str = iter.value(); + node.left.segment = iter.value(); } node = node.left; @@ -206,7 +197,7 @@ export class TernarySearchTree { // right if (!node.right) { node.right = new TernarySearchTreeNode(); - node.right.str = iter.value(); + node.right.segment = iter.value(); } node = node.right; @@ -215,15 +206,16 @@ export class TernarySearchTree { iter.next(); if (!node.mid) { node.mid = new TernarySearchTreeNode(); - node.mid.str = iter.value(); + node.mid.segment = iter.value(); } node = node.mid; } else { break; } } - const oldElement = node.element; - node.element = element; + const oldElement = node.value; + node.value = element; + node.key = key; return oldElement; } @@ -231,7 +223,7 @@ export class TernarySearchTree { let iter = this._iter.reset(key); let node = this._root; while (node) { - let val = iter.cmp(node.str); + let val = iter.cmp(node.segment); if (val > 0) { // left node = node.left; @@ -246,7 +238,7 @@ export class TernarySearchTree { break; } } - return node ? node.element : undefined; + return node ? node.value : undefined; } delete(key: string): void { @@ -257,7 +249,7 @@ export class TernarySearchTree { // find and unset node while (node) { - let val = iter.cmp(node.str); + let val = iter.cmp(node.segment); if (val > 0) { // left stack.push([1, node]); @@ -273,7 +265,7 @@ export class TernarySearchTree { node = node.mid; } else { // remove element - node.element = undefined; + node.value = undefined; // clean up empty nodes while (stack.length > 0 && node.isEmpty()) { @@ -295,7 +287,7 @@ export class TernarySearchTree { let node = this._root; let candidate: E; while (node) { - let val = iter.cmp(node.str); + let val = iter.cmp(node.segment); if (val > 0) { // left node = node.left; @@ -305,20 +297,20 @@ export class TernarySearchTree { } else if (iter.hasNext()) { // mid iter.next(); - candidate = node.element || candidate; + candidate = node.value || candidate; node = node.mid; } else { break; } } - return node && node.element || candidate; + return node && node.value || candidate; } - findSuperstr(key: string): TernarySearchTree { + findSuperstr(key: string): Iterator { let iter = this._iter.reset(key); let node = this._root; while (node) { - let val = iter.cmp(node.str); + let val = iter.cmp(node.segment); if (val > 0) { // left node = node.left; @@ -333,35 +325,59 @@ export class TernarySearchTree { // collect if (!node.mid) { return undefined; + } else { + return this._nodeIterator(node.mid); } - let ret = new TernarySearchTree(this._iter); - ret._root = node.mid; - return ret; } } return undefined; } - forEach(callback: (value: E, index: string) => any) { - this._forEach(this._root, [], callback); + private _nodeIterator(node: TernarySearchTreeNode): Iterator { + let res = { + done: false, + value: undefined + }; + let idx: number; + let data: E[]; + let next = () => { + if (!data) { + // lazy till first invocation + data = []; + idx = 0; + this._forEach(node, value => data.push(value)); + } + if (idx >= data.length) { + res.done = true; + res.value = undefined; + } else { + res.done = false; + res.value = data[idx++]; + } + return res; + }; + return { next }; } - private _forEach(node: TernarySearchTreeNode, parts: string[], callback: (value: E, index: string) => any) { + forEach(callback: (value: E, index: string) => any) { + this._forEach(this._root, callback); + } + + private _forEach(node: TernarySearchTreeNode, callback: (value: E, index: string) => any) { if (node) { // left - this._forEach(node.left, parts, callback); + this._forEach(node.left, callback); // node - parts.push(node.str); - if (node.element) { - callback(node.element, this._iter.join(parts)); + if (node.value) { + // callback(node.value, this._iter.join(parts)); + callback(node.value, node.key); } // mid - this._forEach(node.mid, parts, callback); - parts.pop(); + this._forEach(node.mid, callback); // right - this._forEach(node.right, parts, callback); + this._forEach(node.right, callback); } } } @@ -420,6 +436,14 @@ export class ResourceMap { public keys(): URI[] { return keys(this.map).map(URI.parse); } + + public clone(): ResourceMap { + const resourceMap = new ResourceMap(); + + this.map.forEach((value, key) => resourceMap.map.set(key, value)); + + return resourceMap; + } } // We should fold BoundedMap and LinkedMap. See https://github.com/Microsoft/vscode/issues/28496 diff --git a/src/vs/base/common/marked/marked.js b/src/vs/base/common/marked/marked.js index ca72ea8d6d..eada75cfb9 100644 --- a/src/vs/base/common/marked/marked.js +++ b/src/vs/base/common/marked/marked.js @@ -1,12 +1,12 @@ /** * marked - a markdown parser - * Copyright (c) 2011-2014, Christopher Jeffrey. (MIT Licensed) + * Copyright (c) 2011-2014, Christopher Jeffrey. (Source EULAd) * https://github.com/markedjs/marked */ var __marked_exports; -;(function(root) { +; (function (root) { 'use strict'; /** @@ -18,20 +18,29 @@ var block = { code: /^( {4}[^\n]+\n*)+/, fences: noop, hr: /^ {0,3}((?:- *){3,}|(?:_ *){3,}|(?:\* *){3,})(?:\n+|$)/, - heading: /^ *(#{1,6}) *([^\n]+?) *#* *(?:\n+|$)/, + heading: /^ *(#{1,6}) *([^\n]+?) *(?:#+ *)?(?:\n+|$)/, nptable: noop, blockquote: /^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/, list: /^( *)(bull) [\s\S]+?(?:hr|def|\n{2,}(?! )(?!\1bull )\n*|\s*$)/, - html: /^ *(?:comment *(?:\n|\s*$)|closed *(?:\n{2,}|\s*$)|closing *(?:\n{2,}|\s*$))/, + html: '^ {0,3}(?:' // optional indentation + + '<(script|pre|style)[\\s>][\\s\\S]*?(?:[^\\n]*\\n+|$)' // (1) + + '|comment[^\\n]*(\\n+|$)' // (2) + + '|<\\?[\\s\\S]*?\\?>\\n*' // (3) + + '|\\n*' // (4) + + '|\\n*' // (5) + + '|)[\\s\\S]*?(?:\\n{2,}|$)' // (6) + + '|<(?!script|pre|style)([a-z][\\w-]*)(?:attribute)*? */?>(?=\\h*\\n)[\\s\\S]*?(?:\\n{2,}|$)' // (7) open tag + + '|(?=\\h*\\n)[\\s\\S]*?(?:\\n{2,}|$)' // (7) closing tag + + ')', def: /^ {0,3}\[(label)\]: *\n? *]+)>?(?:(?: +\n? *| *\n *)(title))? *(?:\n+|$)/, table: noop, lheading: /^([^\n]+)\n *(=|-){2,} *(?:\n+|$)/, - paragraph: /^([^\n]+(?:\n?(?!hr|heading|lheading| {0,3}>|tag)[^\n]+)+)/, + paragraph: /^([^\n]+(?:\n(?!hr|heading|lheading| {0,3}>|<\/?(?:tag)(?: +|\n|\/?>)|<(?:script|pre|style|!--))[^\n]+)*)/, text: /^[^\n]+/ }; -block._label = /(?:\\[\[\]]|[^\[\]])+/; -block._title = /(?:"(?:\\"|[^"]|"[^"\n]*")*"|'\n?(?:[^'\n]+\n?)*'|\([^()]*\))/; +block._label = /(?!\s*\])(?:\\[\[\]]|[^\[\]])+/; +block._title = /(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/; block.def = edit(block.def) .replace('label', block._label) .replace('title', block._title) @@ -49,23 +58,24 @@ block.list = edit(block.list) .replace('def', '\\n+(?=' + block.def.source + ')') .getRegex(); -block._tag = '(?!(?:' - + 'a|em|strong|small|s|cite|q|dfn|abbr|data|time|code' - + '|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo' - + '|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b'; - -block.html = edit(block.html) - .replace('comment', //) - .replace('closed', /<(tag)[\s\S]+?<\/\1>/) - .replace('closing', /\s]*)*?\/?>/) - .replace(/tag/g, block._tag) +block._tag = 'address|article|aside|base|basefont|blockquote|body|caption' + + '|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption' + + '|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe' + + '|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option' + + '|p|param|section|source|summary|table|tbody|td|tfoot|th|thead|title|tr' + + '|track|ul'; +block._comment = //; +block.html = edit(block.html, 'i') + .replace('comment', block._comment) + .replace('tag', block._tag) + .replace('attribute', / +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/) .getRegex(); block.paragraph = edit(block.paragraph) .replace('hr', block.hr) .replace('heading', block.heading) .replace('lheading', block.lheading) - .replace('tag', '<' + block._tag) + .replace('tag', block._tag) // pars can be interrupted by type (6) html blocks .getRegex(); block.blockquote = edit(block.blockquote) @@ -99,8 +109,26 @@ block.gfm.paragraph = edit(block.paragraph) */ block.tables = merge({}, block.gfm, { - nptable: /^ *(\S.*\|.*)\n *([-:]+ *\|[-| :]*)\n((?:.*\|.*(?:\n|$))*)\n*/, - table: /^ *\|(.+)\n *\|( *[-:]+[-| :]*)\n((?: *\|.*(?:\n|$))*)\n*/ + nptable: /^ *([^|\n ].*\|.*)\n *([-:]+ *\|[-| :]*)(?:\n((?:.*[^>\n ].*(?:\n|$))*)\n*|$)/, + table: /^ *\|(.+)\n *\|?( *[-:]+[-| :]*)(?:\n((?: *[^>\n ].*(?:\n|$))*)\n*|$)/ +}); + +/** + * Pedantic grammar + */ + +block.pedantic = merge({}, block.normal, { + html: edit( + '^ *(?:comment *(?:\\n|\\s*$)' + + '|<(tag)[\\s\\S]+? *(?:\\n{2,}|\\s*$)' // closed tag + + '|\\s]*)*?/?> *(?:\\n{2,}|\\s*$))') + .replace('comment', block._comment) + .replace(/tag/g, '(?!(?:' + + 'a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub' + + '|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)' + + '\\b)\\w+(?!:|[^\\w\\s@]*@)\\b') + .getRegex(), + def: /^ *\[([^\]]+)\]: *]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/ }); /** @@ -113,7 +141,9 @@ function Lexer(options) { this.options = options || marked.defaults; this.rules = block.normal; - if (this.options.gfm) { + if (this.options.pedantic) { + this.rules = block.pedantic; + } else if (this.options.gfm) { if (this.options.tables) { this.rules = block.tables; } else { @@ -167,7 +197,9 @@ Lexer.prototype.token = function(src, top) { i, tag, l, - isordered; + isordered, + istask, + ischecked; while (src) { // newline @@ -187,7 +219,7 @@ Lexer.prototype.token = function(src, top) { this.tokens.push({ type: 'code', text: !this.options.pedantic - ? cap.replace(/\n+$/, '') + ? rtrim(cap, '\n') : cap }); continue; @@ -217,34 +249,36 @@ Lexer.prototype.token = function(src, top) { // table no leading pipe (gfm) if (top && (cap = this.rules.nptable.exec(src))) { - src = src.substring(cap[0].length); - item = { type: 'table', - header: cap[1].replace(/^ *| *\| *$/g, '').split(/ *\| */), + header: splitCells(cap[1].replace(/^ *| *\| *$/g, '')), align: cap[2].replace(/^ *|\| *$/g, '').split(/ *\| */), - cells: cap[3].replace(/\n$/, '').split('\n') + cells: cap[3] ? cap[3].replace(/\n$/, '').split('\n') : [] }; - for (i = 0; i < item.align.length; i++) { - if (/^ *-+: *$/.test(item.align[i])) { - item.align[i] = 'right'; - } else if (/^ *:-+: *$/.test(item.align[i])) { - item.align[i] = 'center'; - } else if (/^ *:-+ *$/.test(item.align[i])) { - item.align[i] = 'left'; - } else { - item.align[i] = null; + if (item.header.length === item.align.length) { + src = src.substring(cap[0].length); + + for (i = 0; i < item.align.length; i++) { + if (/^ *-+: *$/.test(item.align[i])) { + item.align[i] = 'right'; + } else if (/^ *:-+: *$/.test(item.align[i])) { + item.align[i] = 'center'; + } else if (/^ *:-+ *$/.test(item.align[i])) { + item.align[i] = 'left'; + } else { + item.align[i] = null; + } } + + for (i = 0; i < item.cells.length; i++) { + item.cells[i] = splitCells(item.cells[i], item.header.length); + } + + this.tokens.push(item); + + continue; } - - for (i = 0; i < item.cells.length; i++) { - item.cells[i] = item.cells[i].split(/ *\| */); - } - - this.tokens.push(item); - - continue; } // hr @@ -333,10 +367,20 @@ Lexer.prototype.token = function(src, top) { if (!loose) loose = next; } + // Check for task list items + istask = /^\[[ xX]\] /.test(item); + ischecked = undefined; + if (istask) { + ischecked = item[1] !== ' '; + item = item.replace(/^\[[ xX]\] +/, ''); + } + this.tokens.push({ type: loose ? 'loose_item_start' - : 'list_item_start' + : 'list_item_start', + task: istask, + checked: ischecked }); // Recurse. @@ -372,7 +416,7 @@ Lexer.prototype.token = function(src, top) { if (top && (cap = this.rules.def.exec(src))) { src = src.substring(cap[0].length); if (cap[3]) cap[3] = cap[3].substring(1, cap[3].length - 1); - tag = cap[1].toLowerCase(); + tag = cap[1].toLowerCase().replace(/\s+/g, ' '); if (!this.tokens.links[tag]) { this.tokens.links[tag] = { href: cap[2], @@ -384,36 +428,38 @@ Lexer.prototype.token = function(src, top) { // table (gfm) if (top && (cap = this.rules.table.exec(src))) { - src = src.substring(cap[0].length); - item = { type: 'table', - header: cap[1].replace(/^ *| *\| *$/g, '').split(/ *\| */), + header: splitCells(cap[1].replace(/^ *| *\| *$/g, '')), align: cap[2].replace(/^ *|\| *$/g, '').split(/ *\| */), - cells: cap[3].replace(/(?: *\| *)?\n$/, '').split('\n') + cells: cap[3] ? cap[3].replace(/(?: *\| *)?\n$/, '').split('\n') : [] }; - for (i = 0; i < item.align.length; i++) { - if (/^ *-+: *$/.test(item.align[i])) { - item.align[i] = 'right'; - } else if (/^ *:-+: *$/.test(item.align[i])) { - item.align[i] = 'center'; - } else if (/^ *:-+ *$/.test(item.align[i])) { - item.align[i] = 'left'; - } else { - item.align[i] = null; + if (item.header.length === item.align.length) { + src = src.substring(cap[0].length); + + for (i = 0; i < item.align.length; i++) { + if (/^ *-+: *$/.test(item.align[i])) { + item.align[i] = 'right'; + } else if (/^ *:-+: *$/.test(item.align[i])) { + item.align[i] = 'center'; + } else if (/^ *:-+ *$/.test(item.align[i])) { + item.align[i] = 'left'; + } else { + item.align[i] = null; + } } + + for (i = 0; i < item.cells.length; i++) { + item.cells[i] = splitCells( + item.cells[i].replace(/^ *\| *| *\| *$/g, ''), + item.header.length); + } + + this.tokens.push(item); + + continue; } - - for (i = 0; i < item.cells.length; i++) { - item.cells[i] = item.cells[i] - .replace(/^ *\| *| *\| *$/g, '') - .split(/ *\| */); - } - - this.tokens.push(item); - - continue; } // lheading @@ -463,39 +509,54 @@ Lexer.prototype.token = function(src, top) { */ var inline = { - escape: /^\\([\\`*{}\[\]()#+\-.!_>])/, + escape: /^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/, autolink: /^<(scheme:[^\s\x00-\x1f<>]*|email)>/, url: noop, - tag: /^|^<\/?[a-zA-Z0-9\-]+(?:"[^"]*"|'[^']*'|\s[^<'">\/\s]*)*?\/?>/, - link: /^!?\[(inside)\]\(href\)/, - reflink: /^!?\[(inside)\]\s*\[([^\]]*)\]/, - nolink: /^!?\[((?:\[[^\[\]]*\]|\\[\[\]]|[^\[\]])*)\]/, - strong: /^__([\s\S]+?)__(?!_)|^\*\*([\s\S]+?)\*\*(?!\*)/, - em: /^_([^\s_](?:[^_]|__)+?[^\s_])_\b|^\*((?:\*\*|[^*])+?)\*(?!\*)/, + tag: '^comment' + + '|^' // self-closing tag + + '|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>' // open tag + + '|^<\\?[\\s\\S]*?\\?>' // processing instruction, e.g. + + '|^' // declaration, e.g. + + '|^', // CDATA section + link: /^!?\[(label)\]\(href(?:\s+(title))?\s*\)/, + reflink: /^!?\[(label)\]\[(?!\s*\])((?:\\[\[\]]?|[^\[\]\\])+)\]/, + nolink: /^!?\[(?!\s*\])((?:\[[^\[\]]*\]|\\[\[\]]|[^\[\]])*)\](?:\[\])?/, + strong: /^__([^\s][\s\S]*?[^\s])__(?!_)|^\*\*([^\s][\s\S]*?[^\s])\*\*(?!\*)|^__([^\s])__(?!_)|^\*\*([^\s])\*\*(?!\*)/, + em: /^_([^\s][\s\S]*?[^\s_])_(?!_)|^_([^\s_][\s\S]*?[^\s])_(?!_)|^\*([^\s][\s\S]*?[^\s*])\*(?!\*)|^\*([^\s*][\s\S]*?[^\s])\*(?!\*)|^_([^\s_])_(?!_)|^\*([^\s*])\*(?!\*)/, code: /^(`+)\s*([\s\S]*?[^`]?)\s*\1(?!`)/, br: /^ {2,}\n(?!\s*$)/, del: noop, text: /^[\s\S]+?(?=[\\?@\[\]\\^_`{|}~])/g; + inline._scheme = /[a-zA-Z][a-zA-Z0-9+.-]{1,31}/; inline._email = /[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/; - inline.autolink = edit(inline.autolink) .replace('scheme', inline._scheme) .replace('email', inline._email) - .getRegex() + .getRegex(); -inline._inside = /(?:\[[^\[\]]*\]|\\[\[\]]|[^\[\]]|\](?=[^\[]*\]))*/; -inline._href = /\s*?(?:\s+['"]([\s\S]*?)['"])?\s*/; +inline._attribute = /\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/; + +inline.tag = edit(inline.tag) + .replace('comment', block._comment) + .replace('attribute', inline._attribute) + .getRegex(); + +inline._label = /(?:\[[^\[\]]*\]|\\[\[\]]?|`[^`]*`|[^\[\]\\])*?/; +inline._href = /\s*(<(?:\\[<>]?|[^\s<>\\])*>|(?:\\[()]?|\([^\s\x00-\x1f()\\]*\)|[^\s\x00-\x1f()\\])*?)/; +inline._title = /"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/; inline.link = edit(inline.link) - .replace('inside', inline._inside) + .replace('label', inline._label) .replace('href', inline._href) + .replace('title', inline._title) .getRegex(); inline.reflink = edit(inline.reflink) - .replace('inside', inline._inside) + .replace('label', inline._label) .getRegex(); /** @@ -510,7 +571,13 @@ inline.normal = merge({}, inline); inline.pedantic = merge({}, inline.normal, { strong: /^__(?=\S)([\s\S]*?\S)__(?!_)|^\*\*(?=\S)([\s\S]*?\S)\*\*(?!\*)/, - em: /^_(?=\S)([\s\S]*?\S)_(?!_)|^\*(?=\S)([\s\S]*?\S)\*(?!\*)/ + em: /^_(?=\S)([\s\S]*?\S)_(?!_)|^\*(?=\S)([\s\S]*?\S)\*(?!\*)/, + link: edit(/^!?\[(label)\]\((.*?)\)/) + .replace('label', inline._label) + .getRegex(), + reflink: edit(/^!?\[(label)\]\s*\[([^\]]*)\]/) + .replace('label', inline._label) + .getRegex() }); /** @@ -554,14 +621,14 @@ function InlineLexer(links, options) { throw new Error('Tokens array requires a `links` property.'); } - if (this.options.gfm) { + if (this.options.pedantic) { + this.rules = inline.pedantic; + } else if (this.options.gfm) { if (this.options.breaks) { this.rules = inline.breaks; } else { this.rules = inline.gfm; } - } else if (this.options.pedantic) { - this.rules = inline.pedantic; } } @@ -589,6 +656,7 @@ InlineLexer.prototype.output = function(src) { link, text, href, + title, cap; while (src) { @@ -652,9 +720,23 @@ InlineLexer.prototype.output = function(src) { if (cap = this.rules.link.exec(src)) { src = src.substring(cap[0].length); this.inLink = true; + href = cap[2]; + if (this.options.pedantic) { + link = /^([^'"]*[^\s])\s+(['"])(.*)\2/.exec(href); + + if (link) { + href = link[1]; + title = link[3]; + } else { + title = ''; + } + } else { + title = cap[3] ? cap[3].slice(1, -1) : ''; + } + href = href.trim().replace(/^<([\s\S]*)>$/, '$1'); out += this.outputLink(cap, { - href: cap[2], - title: cap[3] + href: InlineLexer.escapes(href), + title: InlineLexer.escapes(title) }); this.inLink = false; continue; @@ -680,14 +762,14 @@ InlineLexer.prototype.output = function(src) { // strong if (cap = this.rules.strong.exec(src)) { src = src.substring(cap[0].length); - out += this.renderer.strong(this.output(cap[2] || cap[1])); + out += this.renderer.strong(this.output(cap[4] || cap[3] || cap[2] || cap[1])); continue; } // em if (cap = this.rules.em.exec(src)) { src = src.substring(cap[0].length); - out += this.renderer.em(this.output(cap[2] || cap[1])); + out += this.renderer.em(this.output(cap[6] || cap[5] || cap[4] || cap[3] || cap[2] || cap[1])); continue; } @@ -727,12 +809,16 @@ InlineLexer.prototype.output = function(src) { return out; }; +InlineLexer.escapes = function(text) { + return text ? text.replace(InlineLexer.rules._escapes, '$1') : text; +} + /** * Compile Link */ InlineLexer.prototype.outputLink = function(cap, link) { - var href = escape(link.href), + var href = link.href, title = link.title ? escape(link.title) : null; return cap[0].charAt(0) !== '!' @@ -790,7 +876,7 @@ InlineLexer.prototype.mangle = function(text) { */ function Renderer(options) { - this.options = options || {}; + this.options = options || marked.defaults; } Renderer.prototype.code = function(code, lang, escaped) { @@ -805,7 +891,7 @@ Renderer.prototype.code = function(code, lang, escaped) { if (!lang) { return '
'
       + (escaped ? code : escape(code, true))
-      + '\n
'; + + ''; } return '
'
     + (escaped ? code : escape(code, true))
-    + '\n
\n'; + + '\n'; }; Renderer.prototype.blockquote = function(quote) { @@ -825,16 +911,20 @@ Renderer.prototype.html = function(html) { }; Renderer.prototype.heading = function(text, level, raw) { - return '' - + text - + '\n'; + if (this.options.headerIds) { + return '' + + text + + '\n'; + } + // ignore IDs + return '' + text + '\n'; }; Renderer.prototype.hr = function() { @@ -851,18 +941,26 @@ Renderer.prototype.listitem = function(text) { return '
  • ' + text + '
  • \n'; }; +Renderer.prototype.checkbox = function(checked) { + return ' '; +} + Renderer.prototype.paragraph = function(text) { return '

    ' + text + '

    \n'; }; Renderer.prototype.table = function(header, body) { + if (body) body = '' + body + ''; + return '\n' + '\n' + header + '\n' - + '\n' + body - + '\n' + '
    \n'; }; @@ -873,7 +971,7 @@ Renderer.prototype.tablerow = function(content) { Renderer.prototype.tablecell = function(content, flags) { var type = flags.header ? 'th' : 'td'; var tag = flags.align - ? '<' + type + ' style="text-align:' + flags.align + '">' + ? '<' + type + ' align="' + flags.align + '">' : '<' + type + '>'; return tag + content + '\n'; }; @@ -915,7 +1013,12 @@ Renderer.prototype.link = function(href, title, text) { if (this.options.baseUrl && !originIndependentUrl.test(href)) { href = resolveUrl(this.options.baseUrl, href); } - var out = '= 0 && str[curr] === '\\') escaped = !escaped; + if (escaped) { + // odd number of slashes means | is escaped + // so we leave it alone + return '|'; + } else { + // add space before unescaped | + return ' |'; + } + }), + cells = row.split(/ \|/), + i = 0; + + if (cells.length > count) { + cells.splice(count); + } else { + while (cells.length < count) cells.push(''); + } + + for (; i < cells.length; i++) { + // leading or trailing whitespace is ignored per the gfm spec + cells[i] = cells[i].trim().replace(/\\\|/g, '|'); + } + return cells; +} + +// Remove trailing 'c's. Equivalent to str.replace(/c*$/, ''). +// /c*$/ is vulnerable to REDOS. +// invert: Remove suffix of non-c chars instead. Default falsey. +function rtrim(str, c, invert) { + if (str.length === 0) { + return ''; + } + + // Length of suffix matching the invert condition. + var suffLen = 0; + + // Step left until we fail to match the invert condition. + while (suffLen < str.length) { + var currChar = str.charAt(str.length - suffLen - 1); + if (currChar === c && !invert) { + suffLen++; + } else if (currChar !== c && invert) { + suffLen++; + } else { + break; + } + } + + return str.substr(0, str.length - suffLen); +} + /** * Marked */ @@ -1343,24 +1506,29 @@ marked.setOptions = function(opt) { return marked; }; -marked.defaults = { - gfm: true, - tables: true, - breaks: false, - pedantic: false, - sanitize: false, - sanitizer: null, - mangle: true, - smartLists: false, - silent: false, - highlight: null, - langPrefix: 'lang-', - smartypants: false, - headerPrefix: '', - renderer: new Renderer(), - xhtml: false, - baseUrl: null -}; +marked.getDefaults = function () { + return { + baseUrl: null, + breaks: false, + gfm: true, + headerIds: true, + headerPrefix: '', + highlight: null, + langPrefix: 'language-', + mangle: true, + pedantic: false, + renderer: new Renderer(), + sanitize: false, + sanitizer: null, + silent: false, + smartLists: false, + smartypants: false, + tables: true, + xhtml: false + }; +} + +marked.defaults = marked.getDefaults(); /** * Expose @@ -1379,16 +1547,15 @@ marked.InlineLexer = InlineLexer; marked.inlineLexer = InlineLexer.output; marked.parse = marked; - __marked_exports = marked; }).call(this); // ESM-comment-begin define([], function() { - return { - marked: __marked_exports - }; +return { + marked: __marked_exports +}; }); // ESM-comment-end diff --git a/src/vs/base/common/mime.ts b/src/vs/base/common/mime.ts index ba91726ded..d1ca387a3c 100644 --- a/src/vs/base/common/mime.ts +++ b/src/vs/base/common/mime.ts @@ -238,4 +238,63 @@ export function suggestFilename(langId: string, prefix: string): string { } return prefix; // without any known extension, just return the prefix +} + +interface MapExtToMediaMimes { + [index: string]: string; +} + +// Known media mimes that we can handle +const mapExtToMediaMimes: MapExtToMediaMimes = { + '.bmp': 'image/bmp', + '.gif': 'image/gif', + '.jpg': 'image/jpg', + '.jpeg': 'image/jpg', + '.jpe': 'image/jpg', + '.png': 'image/png', + '.tiff': 'image/tiff', + '.tif': 'image/tiff', + '.ico': 'image/x-icon', + '.tga': 'image/x-tga', + '.psd': 'image/vnd.adobe.photoshop', + '.webp': 'image/webp', + '.mid': 'audio/midi', + '.midi': 'audio/midi', + '.mp4a': 'audio/mp4', + '.mpga': 'audio/mpeg', + '.mp2': 'audio/mpeg', + '.mp2a': 'audio/mpeg', + '.mp3': 'audio/mpeg', + '.m2a': 'audio/mpeg', + '.m3a': 'audio/mpeg', + '.oga': 'audio/ogg', + '.ogg': 'audio/ogg', + '.spx': 'audio/ogg', + '.aac': 'audio/x-aac', + '.wav': 'audio/x-wav', + '.wma': 'audio/x-ms-wma', + '.mp4': 'video/mp4', + '.mp4v': 'video/mp4', + '.mpg4': 'video/mp4', + '.mpeg': 'video/mpeg', + '.mpg': 'video/mpeg', + '.mpe': 'video/mpeg', + '.m1v': 'video/mpeg', + '.m2v': 'video/mpeg', + '.ogv': 'video/ogg', + '.qt': 'video/quicktime', + '.mov': 'video/quicktime', + '.webm': 'video/webm', + '.mkv': 'video/x-matroska', + '.mk3d': 'video/x-matroska', + '.mks': 'video/x-matroska', + '.wmv': 'video/x-ms-wmv', + '.flv': 'video/x-flv', + '.avi': 'video/x-msvideo', + '.movie': 'video/x-sgi-movie' +}; + +export function getMediaMime(path: string): string | undefined { + const ext = paths.extname(path); + return mapExtToMediaMimes[ext.toLowerCase()]; } \ No newline at end of file diff --git a/src/vs/base/common/normalization.ts b/src/vs/base/common/normalization.ts new file mode 100644 index 0000000000..e1944f7138 --- /dev/null +++ b/src/vs/base/common/normalization.ts @@ -0,0 +1,49 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the Source EULA. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +'use strict'; + +import { LRUCache } from 'vs/base/common/map'; + +/** + * The normalize() method returns the Unicode Normalization Form of a given string. The form will be + * the Normalization Form Canonical Composition. + * + * @see {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/normalize} + */ +export const canNormalize = typeof (('').normalize) === 'function'; + +const nfcCache = new LRUCache(10000); // bounded to 10000 elements +export function normalizeNFC(str: string): string { + return normalize(str, 'NFC', nfcCache); +} + +const nfdCache = new LRUCache(10000); // bounded to 10000 elements +export function normalizeNFD(str: string): string { + return normalize(str, 'NFD', nfdCache); +} + +const nonAsciiCharactersPattern = /[^\u0000-\u0080]/; +function normalize(str: string, form: string, normalizedCache: LRUCache): string { + if (!canNormalize || !str) { + return str; + } + + const cached = normalizedCache.get(str); + if (cached) { + return cached; + } + + let res: string; + if (nonAsciiCharactersPattern.test(str)) { + res = (str).normalize(form); + } else { + res = str; + } + + // Use the cache for fast lookup + normalizedCache.set(str, res); + + return res; +} diff --git a/src/vs/base/common/objects.ts b/src/vs/base/common/objects.ts index 909493c705..52ebab3032 100644 --- a/src/vs/base/common/objects.ts +++ b/src/vs/base/common/objects.ts @@ -16,7 +16,7 @@ export function deepClone(obj: T): T { return obj as any; } const result: any = Array.isArray(obj) ? [] : {}; - Object.keys(obj).forEach((key: keyof T) => { + Object.keys(obj).forEach((key: string) => { if (obj[key] && typeof obj[key] === 'object') { result[key] = deepClone(obj[key]); } else { @@ -225,6 +225,7 @@ export function getOrDefault(obj: T, fn: (obj: T) => R, defaultValue: R = return typeof result === 'undefined' ? defaultValue : result; } +type obj = { [key: string]: any; }; /** * Returns an object that has keys for each value that is different in the base object. Keys * that do not exist in the target but in the base object are not considered. @@ -235,7 +236,6 @@ export function getOrDefault(obj: T, fn: (obj: T) => R, defaultValue: R = * @param base the object to diff against * @param obj the object to use for diffing */ -export type obj = { [key: string]: any; }; export function distinct(base: obj, target: obj): obj { const result = Object.create(null); diff --git a/src/vs/base/common/parsers.ts b/src/vs/base/common/parsers.ts index 0f5c48a931..4cecb1a855 100644 --- a/src/vs/base/common/parsers.ts +++ b/src/vs/base/common/parsers.ts @@ -81,7 +81,7 @@ export abstract class Parser { } protected static merge(destination: T, source: T, overwrite: boolean): void { - Object.keys(source).forEach((key: keyof T) => { + Object.keys(source).forEach((key: string) => { let destValue = destination[key]; let sourceValue = source[key]; if (Types.isUndefined(sourceValue)) { diff --git a/src/vs/base/common/paths.ts b/src/vs/base/common/paths.ts index d4d3d57e66..52238c14f6 100644 --- a/src/vs/base/common/paths.ts +++ b/src/vs/base/common/paths.ts @@ -53,7 +53,7 @@ export function basename(path: string): string { } /** - * @returns {{.far}} from boo.far or the empty string. + * @returns `.far` from `boo.far` or the empty string. */ export function extname(path: string): string { path = basename(path); @@ -328,7 +328,7 @@ export function isEqual(pathA: string, pathB: string, ignoreCase?: boolean): boo return equalsIgnoreCase(pathA, pathB); } -export function isEqualOrParent(path: string, candidate: string, ignoreCase?: boolean): boolean { +export function isEqualOrParent(path: string, candidate: string, ignoreCase?: boolean, separator = nativeSep): boolean { if (path === candidate) { return true; } @@ -352,15 +352,15 @@ export function isEqualOrParent(path: string, candidate: string, ignoreCase?: bo } let sepOffset = candidate.length; - if (candidate.charAt(candidate.length - 1) === nativeSep) { + if (candidate.charAt(candidate.length - 1) === separator) { sepOffset--; // adjust the expected sep offset in case our candidate already ends in separator character } - return path.charAt(sepOffset) === nativeSep; + return path.charAt(sepOffset) === separator; } - if (candidate.charAt(candidate.length - 1) !== nativeSep) { - candidate += nativeSep; + if (candidate.charAt(candidate.length - 1) !== separator) { + candidate += separator; } return path.indexOf(candidate) === 0; diff --git a/src/vs/base/common/performance.d.ts b/src/vs/base/common/performance.d.ts index 30775bc639..496103e0eb 100644 --- a/src/vs/base/common/performance.d.ts +++ b/src/vs/base/common/performance.d.ts @@ -14,11 +14,6 @@ export function mark(name: string): void; export function measure(name: string, from?: string, to?: string): PerformanceEntry; -/** - * Time something, shorthant for `mark` and `measure` - */ -export function time(name: string): { stop(): void }; - /** * All entries filtered by type and sorted by `startTime`. */ diff --git a/src/vs/base/common/performance.js b/src/vs/base/common/performance.js index 7e1b8b25c8..3c7d500ead 100644 --- a/src/vs/base/common/performance.js +++ b/src/vs/base/common/performance.js @@ -42,31 +42,33 @@ define([], function () { function getEntries(type, name) { const result = []; const entries = global._performanceEntries; - for (let i = 0; i < entries.length; i += 4) { + for (let i = 0; i < entries.length; i += 5) { if (entries[i] === type && (name === void 0 || entries[i + 1] === name)) { result.push({ type: entries[i], name: entries[i + 1], startTime: entries[i + 2], duration: entries[i + 3], + seq: entries[i + 4], }); } } return result.sort((a, b) => { - return a.startTime - b.startTime; + return a.startTime - b.startTime || a.seq - b.seq; }); } function getEntry(type, name) { const entries = global._performanceEntries; - for (let i = 0; i < entries.length; i += 4) { + for (let i = 0; i < entries.length; i += 5) { if (entries[i] === type && entries[i + 1] === name) { return { type: entries[i], name: entries[i + 1], startTime: entries[i + 2], duration: entries[i + 3], + seq: entries[i + 4], }; } } @@ -76,7 +78,7 @@ define([], function () { const entries = global._performanceEntries; let name = from; let startTime = 0; - for (let i = 0; i < entries.length; i += 4) { + for (let i = 0; i < entries.length; i += 5) { if (entries[i + 1] === name) { if (name === from) { // found `from` (start of interval) @@ -91,19 +93,15 @@ define([], function () { return 0; } + let seq = 0; + function mark(name) { - global._performanceEntries.push('mark', name, _now(), 0); + global._performanceEntries.push('mark', name, _now(), 0, seq++); if (typeof console.timeStamp === 'function') { console.timeStamp(name); } } - function time(name) { - let from = `${name}/start`; - mark(from); - return { stop() { measure(name, from); } }; - } - function measure(name, from, to) { let startTime; @@ -127,9 +125,9 @@ define([], function () { function _getLastStartTime(name) { const entries = global._performanceEntries; - for (let i = entries.length - 1; i >= 0; i -= 4) { - if (entries[i - 2] === name) { - return entries[i - 1]; + for (let i = entries.length - 1; i >= 0; i -= 5) { + if (entries[i - 3] === name) { + return entries[i - 2]; } } @@ -139,7 +137,6 @@ define([], function () { var exports = { mark: mark, measure: measure, - time: time, getEntries: getEntries, getEntry: getEntry, getDuration: getDuration, diff --git a/src/vs/base/common/platform.ts b/src/vs/base/common/platform.ts index 8649ad67a2..be8938c913 100644 --- a/src/vs/base/common/platform.ts +++ b/src/vs/base/common/platform.ts @@ -46,6 +46,8 @@ if (typeof process === 'object' && typeof process.nextTick === 'function' && typ _isWindows = (process.platform === 'win32'); _isMacintosh = (process.platform === 'darwin'); _isLinux = (process.platform === 'linux'); + _locale = LANGUAGE_DEFAULT; + _language = LANGUAGE_DEFAULT; const rawNlsConfig = process.env['VSCODE_NLS_CONFIG']; if (rawNlsConfig) { try { diff --git a/src/vs/base/common/resources.ts b/src/vs/base/common/resources.ts index 03799b6d16..81e277a94f 100644 --- a/src/vs/base/common/resources.ts +++ b/src/vs/base/common/resources.ts @@ -7,6 +7,18 @@ import * as paths from 'vs/base/common/paths'; import uri from 'vs/base/common/uri'; import { equalsIgnoreCase } from 'vs/base/common/strings'; +import { Schemas } from 'vs/base/common/network'; +import { isLinux } from 'vs/base/common/platform'; + +export function getComparisonKey(resource: uri): string { + return hasToIgnoreCase(resource) ? resource.toString().toLowerCase() : resource.toString(); +} + +export function hasToIgnoreCase(resource: uri): boolean { + // A file scheme resource is in the same platform as code, so ignore case for non linux platforms + // Resource can be from another platform. Lowering the case as an hack. Should come from File system provider + return resource && resource.scheme === Schemas.file ? !isLinux : true; +} export function basenameOrAuthority(resource: uri): string { return paths.basename(resource.path) || resource.authority; @@ -18,7 +30,7 @@ export function isEqualOrParent(resource: uri, candidate: uri, ignoreCase?: bool return paths.isEqualOrParent(resource.fsPath, candidate.fsPath, ignoreCase); } - return paths.isEqualOrParent(resource.path, candidate.path, ignoreCase); + return paths.isEqualOrParent(resource.path, candidate.path, ignoreCase, '/'); } return false; @@ -52,6 +64,13 @@ export function dirname(resource: uri): uri { }); } +export function joinPath(resource: uri, pathFragment: string): uri { + const joinedPath = paths.join(resource.path || '/', pathFragment); + return resource.with({ + path: joinedPath + }); +} + export function distinctParents(items: T[], resourceAccessor: (item: T) => uri): T[] { const distinctParents: T[] = []; for (let i = 0; i < items.length; i++) { diff --git a/src/vs/base/common/scrollable.ts b/src/vs/base/common/scrollable.ts index b23cd10ca3..a6c4815146 100644 --- a/src/vs/base/common/scrollable.ts +++ b/src/vs/base/common/scrollable.ts @@ -229,7 +229,7 @@ export class Scrollable extends Disposable { /** * Returns the final scroll position that the instance will have once the smooth scroll animation concludes. - * If no scroll animation is occuring, it will return the current scroll position instead. + * If no scroll animation is occurring, it will return the current scroll position instead. */ public getFutureScrollPosition(): IScrollPosition { if (this._smoothScrolling) { diff --git a/src/vs/base/common/strings.ts b/src/vs/base/common/strings.ts index 431c8618d6..88af2e7dd9 100644 --- a/src/vs/base/common/strings.ts +++ b/src/vs/base/common/strings.ts @@ -4,7 +4,6 @@ *--------------------------------------------------------------------------------------------*/ 'use strict'; -import { LRUCache } from 'vs/base/common/map'; import { CharCode } from 'vs/base/common/charCode'; /** @@ -239,48 +238,6 @@ export function regExpContainsBackreference(regexpValue: string): boolean { return !!regexpValue.match(/([^\\]|^)(\\\\)*\\\d+/); } -/** - * The normalize() method returns the Unicode Normalization Form of a given string. The form will be - * the Normalization Form Canonical Composition. - * - * @see {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/normalize} - */ -export const canNormalize = typeof (('').normalize) === 'function'; - -const nfcCache = new LRUCache(10000); // bounded to 10000 elements -export function normalizeNFC(str: string): string { - return normalize(str, 'NFC', nfcCache); -} - -const nfdCache = new LRUCache(10000); // bounded to 10000 elements -export function normalizeNFD(str: string): string { - return normalize(str, 'NFD', nfdCache); -} - -const nonAsciiCharactersPattern = /[^\u0000-\u0080]/; -function normalize(str: string, form: string, normalizedCache: LRUCache): string { - if (!canNormalize || !str) { - return str; - } - - const cached = normalizedCache.get(str); - if (cached) { - return cached; - } - - let res: string; - if (nonAsciiCharactersPattern.test(str)) { - res = (str).normalize(form); - } else { - res = str; - } - - // Use the cache for fast lookup - normalizedCache.set(str, res); - - return res; -} - /** * Returns first index of the string that is not whitespace. * If string is empty or contains only whitespaces, returns -1 @@ -376,11 +333,11 @@ export function compareIgnoreCase(a: string, b: string): number { } } -function isLowerAsciiLetter(code: number): boolean { +export function isLowerAsciiLetter(code: number): boolean { return code >= CharCode.a && code <= CharCode.z; } -function isUpperAsciiLetter(code: number): boolean { +export function isUpperAsciiLetter(code: number): boolean { return code >= CharCode.A && code <= CharCode.Z; } diff --git a/src/vs/base/common/uri.ts b/src/vs/base/common/uri.ts index db5471cfdf..64c9a1c6b2 100644 --- a/src/vs/base/common/uri.ts +++ b/src/vs/base/common/uri.ts @@ -4,22 +4,8 @@ *--------------------------------------------------------------------------------------------*/ 'use strict'; -import * as platform from 'vs/base/common/platform'; - - -function _encode(ch: string): string { - return '%' + ch.charCodeAt(0).toString(16).toUpperCase(); -} - -// see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/encodeURIComponent -function encodeURIComponent2(str: string): string { - return encodeURIComponent(str).replace(/[!'()*]/g, _encode); -} - -function encodeNoop(str: string): string { - return str.replace(/[#?]/, _encode); -} - +import { isWindows } from 'vs/base/common/platform'; +import { CharCode } from 'vs/base/common/charCode'; const _schemePattern = /^\w[\w\d+.-]*$/; const _singleSlashStart = /^\//; @@ -50,12 +36,30 @@ function _validateUri(ret: URI): void { } } +// implements a bit of https://tools.ietf.org/html/rfc3986#section-5 +function _referenceResolution(scheme: string, path: string): string { + + // the slash-character is our 'default base' as we don't + // support constructing URIs relative to other URIs. This + // also means that we alter and potentially break paths. + // see https://tools.ietf.org/html/rfc3986#section-5.1.4 + switch (scheme) { + case 'https': + case 'http': + case 'file': + if (!path) { + path = _slash; + } else if (path[0] !== _slash) { + path = _slash + path; + } + break; + } + return path; +} + const _empty = ''; const _slash = '/'; const _regexp = /^(([^:/?#]+?):)?(\/\/([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?/; -const _driveLetterPath = /^\/[a-zA-Z]:/; -const _upperCaseDrive = /^(\/)?([A-Z]:)/; -const _driveLetter = /^[a-zA-Z]:/; /** * Uniform Resource Identifier (URI) http://tools.ietf.org/html/rfc3986. @@ -143,9 +147,10 @@ export default class URI implements UriComponents { } else { this.scheme = schemeOrData || _empty; this.authority = authority || _empty; - this.path = path || _empty; + this.path = _referenceResolution(this.scheme, path || _empty); this.query = query || _empty; this.fragment = fragment || _empty; + _validateUri(this); } } @@ -232,7 +237,7 @@ export default class URI implements UriComponents { // normalize to fwd-slashes on windows, // on other systems bwd-slashes are valid // filename character, eg /f\oo/ba\r.txt - if (platform.isWindows) { + if (isWindows) { path = path.replace(/\\/g, _slash); } @@ -249,18 +254,6 @@ export default class URI implements UriComponents { } } - // Ensure that path starts with a slash - // or that it is at least a slash - if (_driveLetter.test(path)) { - path = _slash + path; - - } else if (path[0] !== _slash) { - // tricky -> makes invalid paths - // but otherwise we have to stop - // allowing relative paths... - path = _slash + path; - } - return new _URI('file', authority, path, _empty, _empty); } @@ -285,33 +278,7 @@ export default class URI implements UriComponents { } public toJSON(): object { - const res = { - $mid: 1, - fsPath: this.fsPath, - external: this.toString(), - }; - - if (this.path) { - res.path = this.path; - } - - if (this.scheme) { - res.scheme = this.scheme; - } - - if (this.authority) { - res.authority = this.authority; - } - - if (this.query) { - res.query = this.query; - } - - if (this.fragment) { - res.fragment = this.fragment; - } - - return res; + return this; } static revive(data: UriComponents | any): URI { @@ -367,8 +334,141 @@ class _URI extends URI { return _asFormatted(this, true); } } + + toJSON(): object { + const res = { + $mid: 1 + }; + // cached state + if (this._fsPath) { + res.fsPath = this._fsPath; + } + if (this._formatted) { + res.external = this._formatted; + } + // uri components + if (this.path) { + res.path = this.path; + } + if (this.scheme) { + res.scheme = this.scheme; + } + if (this.authority) { + res.authority = this.authority; + } + if (this.query) { + res.query = this.query; + } + if (this.fragment) { + res.fragment = this.fragment; + } + return res; + } } +// reserved characters: https://tools.ietf.org/html/rfc3986#section-2.2 +const encodeTable: { [ch: number]: string } = { + [CharCode.Colon]: '%3A', // gen-delims + [CharCode.Slash]: '%2F', + [CharCode.QuestionMark]: '%3F', + [CharCode.Hash]: '%23', + [CharCode.OpenSquareBracket]: '%5B', + [CharCode.CloseSquareBracket]: '%5D', + [CharCode.AtSign]: '%40', + + [CharCode.ExclamationMark]: '%21', // sub-delims + [CharCode.DollarSign]: '%24', + [CharCode.Ampersand]: '%26', + [CharCode.SingleQuote]: '%27', + [CharCode.OpenParen]: '%28', + [CharCode.CloseParen]: '%29', + [CharCode.Asterisk]: '%2A', + [CharCode.Plus]: '%2B', + [CharCode.Comma]: '%2C', + [CharCode.Semicolon]: '%3B', + [CharCode.Equals]: '%3D', + + [CharCode.Space]: '%20', +}; + +function encodeURIComponentFast(uriComponent: string, allowSlash: boolean): string { + let res: string = undefined; + let nativeEncodePos = -1; + + for (let pos = 0; pos < uriComponent.length; pos++) { + let code = uriComponent.charCodeAt(pos); + + // unreserved characters: https://tools.ietf.org/html/rfc3986#section-2.3 + if ( + (code >= CharCode.a && code <= CharCode.z) + || (code >= CharCode.A && code <= CharCode.Z) + || (code >= CharCode.Digit0 && code <= CharCode.Digit9) + || code === CharCode.Dash + || code === CharCode.Period + || code === CharCode.Underline + || code === CharCode.Tilde + || (allowSlash && code === CharCode.Slash) + ) { + // check if we are delaying native encode + if (nativeEncodePos !== -1) { + res += encodeURIComponent(uriComponent.substring(nativeEncodePos, pos)); + nativeEncodePos = -1; + } + // check if we write into a new string (by default we try to return the param) + if (res !== undefined) { + res += uriComponent.charAt(pos); + } + + } else { + // encoding needed, we need to allocate a new string + if (res === undefined) { + res = uriComponent.substr(0, pos); + } + + // check with default table first + let escaped = encodeTable[code]; + if (escaped !== undefined) { + + // check if we are delaying native encode + if (nativeEncodePos !== -1) { + res += encodeURIComponent(uriComponent.substring(nativeEncodePos, pos)); + nativeEncodePos = -1; + } + + // append escaped variant to result + res += escaped; + + } else if (nativeEncodePos === -1) { + // use native encode only when needed + nativeEncodePos = pos; + } + } + } + + if (nativeEncodePos !== -1) { + res += encodeURIComponent(uriComponent.substring(nativeEncodePos)); + } + + return res !== undefined ? res : uriComponent; +} + +function encodeURIComponentMinimal(path: string): string { + let res: string = undefined; + for (let pos = 0; pos < path.length; pos++) { + let code = path.charCodeAt(pos); + if (code === CharCode.Hash || code === CharCode.QuestionMark) { + if (res === undefined) { + res = path.substr(0, pos); + } + res += encodeTable[code]; + } else { + if (res !== undefined) { + res += path[pos]; + } + } + } + return res !== undefined ? res : path; +} /** * Compute `fsPath` for the given uri @@ -377,17 +477,21 @@ class _URI extends URI { function _makeFsPath(uri: URI): string { let value: string; - if (uri.authority && uri.path && uri.scheme === 'file') { + if (uri.authority && uri.path.length > 1 && uri.scheme === 'file') { // unc path: file://shares/c$/far/boo value = `//${uri.authority}${uri.path}`; - } else if (_driveLetterPath.test(uri.path)) { + } else if ( + uri.path.charCodeAt(0) === CharCode.Slash + && (uri.path.charCodeAt(1) >= CharCode.A && uri.path.charCodeAt(1) <= CharCode.Z || uri.path.charCodeAt(1) >= CharCode.a && uri.path.charCodeAt(1) <= CharCode.z) + && uri.path.charCodeAt(2) === CharCode.Colon + ) { // windows drive letter: file:///c:/far/boo value = uri.path[1].toLowerCase() + uri.path.substr(2); } else { // other path value = uri.path; } - if (platform.isWindows) { + if (isWindows) { value = value.replace(/\//g, '\\'); } return value; @@ -399,71 +503,69 @@ function _makeFsPath(uri: URI): string { function _asFormatted(uri: URI, skipEncoding: boolean): string { const encoder = !skipEncoding - ? encodeURIComponent2 - : encodeNoop; - - const parts: string[] = []; + ? encodeURIComponentFast + : encodeURIComponentMinimal; + let res = ''; let { scheme, authority, path, query, fragment } = uri; if (scheme) { - parts.push(scheme, ':'); + res += scheme; + res += ':'; } if (authority || scheme === 'file') { - parts.push('//'); + res += _slash; + res += _slash; } if (authority) { let idx = authority.indexOf('@'); if (idx !== -1) { + // @ const userinfo = authority.substr(0, idx); authority = authority.substr(idx + 1); idx = userinfo.indexOf(':'); if (idx === -1) { - parts.push(encoder(userinfo)); + res += encoder(userinfo, false); } else { - parts.push(encoder(userinfo.substr(0, idx)), ':', encoder(userinfo.substr(idx + 1))); + // :@ + res += encoder(userinfo.substr(0, idx), false); + res += ':'; + res += encoder(userinfo.substr(idx + 1), false); } - parts.push('@'); + res += '@'; } authority = authority.toLowerCase(); idx = authority.indexOf(':'); if (idx === -1) { - parts.push(encoder(authority)); + res += encoder(authority, false); } else { - parts.push(encoder(authority.substr(0, idx)), authority.substr(idx)); + // : + res += encoder(authority.substr(0, idx), false); + res += authority.substr(idx); } } if (path) { // lower-case windows drive letters in /C:/fff or C:/fff - const m = _upperCaseDrive.exec(path); - if (m) { - if (m[1]) { - path = '/' + m[2].toLowerCase() + path.substr(3); // "/c:".length === 3 - } else { - path = m[2].toLowerCase() + path.substr(2); // // "c:".length === 2 + if (path.length >= 3 && path.charCodeAt(0) === CharCode.Slash && path.charCodeAt(2) === CharCode.Colon) { + let code = path.charCodeAt(1); + if (code >= CharCode.A && code <= CharCode.Z) { + path = `/${String.fromCharCode(code + 32)}:${path.substr(3)}`; // "/c:".length === 3 + } + } else if (path.length >= 2 && path.charCodeAt(1) === CharCode.Colon) { + let code = path.charCodeAt(0); + if (code >= CharCode.A && code <= CharCode.Z) { + path = `${String.fromCharCode(code + 32)}:${path.substr(2)}`; // "/c:".length === 3 } } - - // encode every segement but not slashes - // make sure that # and ? are always encoded - // when occurring in paths - otherwise the result - // cannot be parsed back again - let lastIdx = 0; - while (true) { - let idx = path.indexOf(_slash, lastIdx); - if (idx === -1) { - parts.push(encoder(path.substring(lastIdx))); - break; - } - parts.push(encoder(path.substring(lastIdx, idx)), _slash); - lastIdx = idx + 1; - } + // encode the rest of the path + res += encoder(path, true); } if (query) { - parts.push('?', encoder(query)); + res += '?'; + res += encoder(query, false); } if (fragment) { - parts.push('#', encoder(fragment)); + res += '#'; + res += !skipEncoding ? encodeURIComponentFast(fragment, false) : fragment; } - - return parts.join(_empty); + return res; } diff --git a/src/vs/base/common/uriIpc.ts b/src/vs/base/common/uriIpc.ts new file mode 100644 index 0000000000..c9f1d66d55 --- /dev/null +++ b/src/vs/base/common/uriIpc.ts @@ -0,0 +1,18 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the Source EULA. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +'use strict'; + +import URI, { UriComponents } from 'vs/base/common/uri'; + +export interface IURITransformer { + transformIncoming(uri: UriComponents): UriComponents; + transformOutgoing(uri: URI): URI; +} + +export const DefaultURITransformer: IURITransformer = { + transformIncoming: (uri: UriComponents) => uri, + transformOutgoing: (uri: URI) => uri, +}; \ No newline at end of file diff --git a/src/vs/base/common/uuid.ts b/src/vs/base/common/uuid.ts index e47418e6d9..84d91d746c 100644 --- a/src/vs/base/common/uuid.ts +++ b/src/vs/base/common/uuid.ts @@ -28,7 +28,7 @@ class ValueUUID implements UUID { class V4UUID extends ValueUUID { - private static readonly _chars = ['0', '1', '2', '3', '4', '5', '6', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f']; + private static readonly _chars = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f']; private static readonly _timeHighBits = ['8', '9', 'a', 'b']; diff --git a/src/vs/base/common/winjs.base.d.ts b/src/vs/base/common/winjs.base.d.ts index 5cffd1fa59..2dce666a20 100644 --- a/src/vs/base/common/winjs.base.d.ts +++ b/src/vs/base/common/winjs.base.d.ts @@ -39,7 +39,6 @@ export declare class Promise { public static join(promises: [T1 | PromiseLike, T2 | PromiseLike]): Promise<[T1, T2]>; public static join(promises: (T | PromiseLike)[]): Promise; - public static join(promises: { [n: string]: T | PromiseLike }): Promise<{ [n: string]: T }>; public static any(promises: (T | PromiseLike)[]): Promise<{ key: string; value: Promise; }>; diff --git a/src/vs/base/common/winjs.base.js b/src/vs/base/common/winjs.base.js index ca6c787e58..c9d40d92f2 100644 --- a/src/vs/base/common/winjs.base.js +++ b/src/vs/base/common/winjs.base.js @@ -1038,6 +1038,12 @@ _winjs("WinJS/Promise/_StateMachine", ["WinJS/Core/_Global","WinJS/Core/_BaseCor /// error function. /// /// + // BEGIN monaco change + if (this.then !== Promise_then) { + this.then(onComplete, onError, onProgress); + return; + } + // END monaco change return this._state.then(this, onComplete, onError, onProgress); }, diff --git a/src/vs/base/common/worker/simpleWorker.ts b/src/vs/base/common/worker/simpleWorker.ts index c23ae37e5a..dd98966056 100644 --- a/src/vs/base/common/worker/simpleWorker.ts +++ b/src/vs/base/common/worker/simpleWorker.ts @@ -91,7 +91,7 @@ class SimpleWorkerProtocol { c: null, e: null }; - let result = new TPromise((c, e, p) => { + let result = new TPromise((c, e) => { reply.c = c; reply.e = e; }, () => { @@ -232,7 +232,7 @@ export class SimpleWorkerClient extends Disposable { loaderConfiguration = (self).requirejs.s.contexts._.config; } - this._lazyProxy = new TPromise((c, e, p) => { + this._lazyProxy = new TPromise((c, e) => { lazyProxyFulfill = c; lazyProxyReject = e; }, () => { /* no cancel */ }); @@ -273,7 +273,7 @@ export class SimpleWorkerClient extends Disposable { } private _request(method: string, args: any[]): TPromise { - return new TPromise((c, e, p) => { + return new TPromise((c, e) => { this._onModuleLoaded.then(() => { this._protocol.sendMessage(method, args).then(c, e); }, e); @@ -290,6 +290,7 @@ export class SimpleWorkerClient extends Disposable { export interface IRequestHandler { _requestHandlerBrand: any; + [prop: string]: any; } /** @@ -362,7 +363,7 @@ export class SimpleWorkerServer { let cc: ValueCallback; let ee: ErrorCallback; - let r = new TPromise((c, e, p) => { + let r = new TPromise((c, e) => { cc = c; ee = e; }); diff --git a/src/vs/base/node/config.ts b/src/vs/base/node/config.ts index 9dbcf56a36..eb5367d1ba 100644 --- a/src/vs/base/node/config.ts +++ b/src/vs/base/node/config.ts @@ -171,7 +171,7 @@ export class ConfigWatcher implements IConfigWatcher, IDisposable { // Windows: in some cases the filename contains artifacts from the absolute path // see https://github.com/nodejs/node/issues/19170 // As such, we have to ensure that the filename basename is used for comparison. - if (isWindows && filename !== this.configName) { + if (isWindows && filename && filename !== this.configName) { filename = basename(filename); } diff --git a/src/vs/base/node/cpuUsage.sh b/src/vs/base/node/cpuUsage.sh new file mode 100755 index 0000000000..94d56de989 --- /dev/null +++ b/src/vs/base/node/cpuUsage.sh @@ -0,0 +1,64 @@ +#!/bin/bash + +function get_total_cpu_time() { + # Read the first line of /proc/stat and remove the cpu prefix + CPU=(`sed -n 's/^cpu\s//p' /proc/stat`) + + # Sum all of the values in CPU to get total time + for VALUE in "${CPU[@]}"; do + let $1=$1+$VALUE + done +} + +TOTAL_TIME_BEFORE=0 +get_total_cpu_time TOTAL_TIME_BEFORE + +# Loop over the arguments, which are a list of PIDs +# The 13th and 14th words in /proc//stat are the user and system time +# the process has used, so sum these to get total process run time +declare -a PROCESS_BEFORE_TIMES +ITER=0 +for PID in "$@"; do + if [ -f /proc/$PID/stat ] + then + PROCESS_STATS=`cat /proc/$PID/stat` + PROCESS_STAT_ARRAY=($PROCESS_STATS) + + let PROCESS_TIME_BEFORE="${PROCESS_STAT_ARRAY[13]}+${PROCESS_STAT_ARRAY[14]}" + else + let PROCESS_TIME_BEFORE=0 + fi + + PROCESS_BEFORE_TIMES[$ITER]=$PROCESS_TIME_BEFORE + ((ITER++)) +done + +# Wait for a second +sleep 1 + +TOTAL_TIME_AFTER=0 +get_total_cpu_time TOTAL_TIME_AFTER + +# Check the user and system time sum of each process again and compute the change +# in process time used over total system time +ITER=0 +for PID in "$@"; do + if [ -f /proc/$PID/stat ] + then + PROCESS_STATS=`cat /proc/$PID/stat` + PROCESS_STAT_ARRAY=($PROCESS_STATS) + + let PROCESS_TIME_AFTER="${PROCESS_STAT_ARRAY[13]}+${PROCESS_STAT_ARRAY[14]}" + else + let PROCESS_TIME_AFTER=${PROCESS_BEFORE_TIMES[$ITER]} + fi + + PROCESS_TIME_BEFORE=${PROCESS_BEFORE_TIMES[$ITER]} + let PROCESS_DELTA=$PROCESS_TIME_AFTER-$PROCESS_TIME_BEFORE + let TOTAL_DELTA=$TOTAL_TIME_AFTER-$TOTAL_TIME_BEFORE + CPU_USAGE=`echo "100*$PROCESS_DELTA/$TOTAL_DELTA" | bc -l` + + # Parent script reads from stdout, so echo result to be read + echo $CPU_USAGE + ((ITER++)) +done diff --git a/src/vs/base/node/encoding.ts b/src/vs/base/node/encoding.ts index d9c5ffe072..b2b26af0d5 100644 --- a/src/vs/base/node/encoding.ts +++ b/src/vs/base/node/encoding.ts @@ -11,6 +11,7 @@ import { TPromise } from 'vs/base/common/winjs.base'; import { isLinux, isMacintosh } from 'vs/base/common/platform'; import { exec } from 'child_process'; import { Readable, Writable, WritableOptions } from 'stream'; +import { toWinJsPromise } from 'vs/base/common/async'; export const UTF8 = 'utf8'; export const UTF8_with_bom = 'utf8bom'; @@ -88,6 +89,7 @@ export function toDecodeStream(readable: Readable, options: IDecodeStreamOptions resolve({ detected, stream: this._decodeStream }); }, err => { + this.emit('error', err); callback(err); }); } @@ -191,25 +193,25 @@ const IGNORE_ENCODINGS = ['ascii', 'utf-8', 'utf-16', 'utf-32']; /** * Guesses the encoding from buffer. */ -export async function guessEncodingByBuffer(buffer: NodeBuffer): TPromise { - const jschardet = await import('jschardet'); +export function guessEncodingByBuffer(buffer: NodeBuffer): TPromise { + return toWinJsPromise(import('jschardet')).then(jschardet => { + jschardet.Constants.MINIMUM_THRESHOLD = MINIMUM_THRESHOLD; - jschardet.Constants.MINIMUM_THRESHOLD = MINIMUM_THRESHOLD; + const guessed = jschardet.detect(buffer); + if (!guessed || !guessed.encoding) { + return null; + } - const guessed = jschardet.detect(buffer); - if (!guessed || !guessed.encoding) { - return null; - } + const enc = guessed.encoding.toLowerCase(); - const enc = guessed.encoding.toLowerCase(); + // Ignore encodings that cannot guess correctly + // (http://chardet.readthedocs.io/en/latest/supported-encodings.html) + if (0 <= IGNORE_ENCODINGS.indexOf(enc)) { + return null; + } - // Ignore encodings that cannot guess correctly - // (http://chardet.readthedocs.io/en/latest/supported-encodings.html) - if (0 <= IGNORE_ENCODINGS.indexOf(enc)) { - return null; - } - - return toIconvLiteEncoding(guessed.encoding); + return toIconvLiteEncoding(guessed.encoding); + }); } const JSCHARDET_TO_ICONV_ENCODINGS: { [name: string]: string } = { diff --git a/src/vs/base/node/extfs.ts b/src/vs/base/node/extfs.ts index 6ead7d8582..b7d6b459af 100644 --- a/src/vs/base/node/extfs.ts +++ b/src/vs/base/node/extfs.ts @@ -5,15 +5,16 @@ 'use strict'; -import * as uuid from 'vs/base/common/uuid'; -import * as strings from 'vs/base/common/strings'; -import * as platform from 'vs/base/common/platform'; -import * as flow from 'vs/base/node/flow'; import * as fs from 'fs'; import * as paths from 'path'; -import { TPromise } from 'vs/base/common/winjs.base'; import { nfcall } from 'vs/base/common/async'; +import { normalizeNFC } from 'vs/base/common/normalization'; +import * as platform from 'vs/base/common/platform'; +import * as strings from 'vs/base/common/strings'; +import * as uuid from 'vs/base/common/uuid'; +import { TPromise } from 'vs/base/common/winjs.base'; import { encode, encodeStream } from 'vs/base/node/encoding'; +import * as flow from 'vs/base/node/flow'; const loop = flow.loop; @@ -21,7 +22,7 @@ export function readdirSync(path: string): string[] { // Mac: uses NFD unicode form on disk, but we want NFC // See also https://github.com/nodejs/node/issues/2165 if (platform.isMacintosh) { - return fs.readdirSync(path).map(c => strings.normalizeNFC(c)); + return fs.readdirSync(path).map(c => normalizeNFC(c)); } return fs.readdirSync(path); @@ -36,7 +37,7 @@ export function readdir(path: string, callback: (error: Error, files: string[]) return callback(error, null); } - return callback(null, children.map(c => strings.normalizeNFC(c))); + return callback(null, children.map(c => normalizeNFC(c))); }); } @@ -129,17 +130,27 @@ function doCopyFile(source: string, target: string, mode: number, callback: (err } export function mkdirp(path: string, mode?: number): TPromise { - const mkdir = () => nfcall(fs.mkdir, path, mode) - .then(null, (err: NodeJS.ErrnoException) => { - if (err.code === 'EEXIST') { - return nfcall(fs.stat, path) - .then((stat: fs.Stats) => stat.isDirectory - ? null - : TPromise.wrapError(new Error(`'${path}' exists and is not a directory.`))); + const mkdir = () => { + return nfcall(fs.mkdir, path, mode).then(null, (mkdirErr: NodeJS.ErrnoException) => { + + // ENOENT: a parent folder does not exist yet + if (mkdirErr.code === 'ENOENT') { + return TPromise.wrapError(mkdirErr); } - return TPromise.wrapError(err); + // Any other error: check if folder exists and + // return normally in that case if its a folder + return nfcall(fs.stat, path).then((stat: fs.Stats) => { + if (!stat.isDirectory()) { + return TPromise.wrapError(new Error(`'${path}' exists and is not a directory.`)); + } + + return null; + }, statErr => { + return TPromise.wrapError(mkdirErr); // bubble up original mkdir error + }); }); + }; // stop at root if (path === paths.dirname(path)) { @@ -148,10 +159,14 @@ export function mkdirp(path: string, mode?: number): TPromise { // recursively mkdir return mkdir().then(null, (err: NodeJS.ErrnoException) => { + + // ENOENT: a parent folder does not exist yet, continue + // to create the parent folder and then try again. if (err.code === 'ENOENT') { return mkdirp(paths.dirname(path), mode).then(mkdir); } + // Any other error return TPromise.wrapError(err); }); } @@ -619,7 +634,7 @@ function normalizePath(path: string): string { return strings.rtrim(paths.normalize(path), paths.sep); } -export function watch(path: string, onChange: (type: string, path: string) => void, onError: (error: string) => void): fs.FSWatcher { +export function watch(path: string, onChange: (type: string, path?: string) => void, onError: (error: string) => void): fs.FSWatcher { try { const watcher = fs.watch(path); @@ -630,7 +645,7 @@ export function watch(path: string, onChange: (type: string, path: string) => vo if (platform.isMacintosh) { // Mac: uses NFD unicode form on disk, but we want NFC // See also https://github.com/nodejs/node/issues/2165 - file = strings.normalizeNFC(file); + file = normalizeNFC(file); } } diff --git a/src/vs/base/node/pfs.ts b/src/vs/base/node/pfs.ts index 49afb117b6..e8b6d93663 100644 --- a/src/vs/base/node/pfs.ts +++ b/src/vs/base/node/pfs.ts @@ -99,6 +99,7 @@ const writeFilePathQueue: { [path: string]: Queue } = Object.create(null); export function writeFile(path: string, data: string, options?: extfs.IWriteFileOptions): TPromise; export function writeFile(path: string, data: NodeBuffer, options?: extfs.IWriteFileOptions): TPromise; +export function writeFile(path: string, data: Uint8Array, options?: extfs.IWriteFileOptions): TPromise; export function writeFile(path: string, data: NodeJS.ReadableStream, options?: extfs.IWriteFileOptions): TPromise; export function writeFile(path: string, data: any, options?: extfs.IWriteFileOptions): TPromise { const queueKey = toQueueKey(path); diff --git a/src/vs/base/node/processes.ts b/src/vs/base/node/processes.ts index 63522e222c..5397ad6512 100644 --- a/src/vs/base/node/processes.ts +++ b/src/vs/base/node/processes.ts @@ -8,7 +8,7 @@ import * as path from 'path'; import * as cp from 'child_process'; import { fork } from 'vs/base/node/stdFork'; import * as nls from 'vs/nls'; -import { PPromise, TPromise, TValueCallback, TProgressCallback, ErrorCallback } from 'vs/base/common/winjs.base'; +import { TPromise, TValueCallback, ErrorCallback } from 'vs/base/common/winjs.base'; import * as Types from 'vs/base/common/types'; import { IStringDictionary } from 'vs/base/common/collections'; import URI from 'vs/base/common/uri'; @@ -19,6 +19,8 @@ import { LineDecoder } from 'vs/base/node/decoder'; import { CommandOptions, ForkOptions, SuccessData, Source, TerminateResponse, TerminateResponseCode, Executable } from 'vs/base/common/processes'; export { CommandOptions, ForkOptions, SuccessData, Source, TerminateResponse, TerminateResponseCode }; +export type TProgressCallback = (progress: T) => void; + export interface LineData { line: string; source: Source; @@ -79,6 +81,7 @@ export abstract class AbstractProcess { private childProcess: cp.ChildProcess; protected childProcessPromise: TPromise; + private pidResolve: TValueCallback; protected terminateRequested: boolean; private static WellKnowCommands: IStringDictionary = { @@ -151,18 +154,16 @@ export abstract class AbstractProcess { return 'other'; } - public start(): PPromise { + public start(pp: TProgressCallback): TPromise { if (Platform.isWindows && ((this.options && this.options.cwd && TPath.isUNC(this.options.cwd)) || !this.options && !this.options.cwd && TPath.isUNC(process.cwd()))) { return TPromise.wrapError(new Error(nls.localize('TaskRunner.UNC', 'Can\'t execute a shell command on a UNC drive.'))); } return this.useExec().then((useExec) => { let cc: TValueCallback; let ee: ErrorCallback; - let pp: TProgressCallback; - let result = new PPromise((c, e, p) => { + let result = new TPromise((c, e) => { cc = c; ee = e; - pp = p; }); if (useExec) { @@ -233,7 +234,7 @@ export abstract class AbstractProcess { if (this.cmd) { childProcess = cp.spawn(this.cmd, this.args, this.options); } else if (this.module) { - this.childProcessPromise = new TPromise((c, e, p) => { + this.childProcessPromise = new TPromise((c, e) => { fork(this.module, this.args, this.options, (error: any, childProcess: cp.ChildProcess) => { if (error) { e(error); @@ -241,6 +242,10 @@ export abstract class AbstractProcess { return; } this.childProcess = childProcess; + if (this.pidResolve) { + this.pidResolve(Types.isNumber(childProcess.pid) ? childProcess.pid : -1); + this.pidResolve = undefined; + } this.childProcess.on('close', closeHandler); this.handleSpawn(childProcess, cc, pp, ee, false); c(childProcess); @@ -251,6 +256,10 @@ export abstract class AbstractProcess { if (childProcess) { this.childProcess = childProcess; this.childProcessPromise = TPromise.as(childProcess); + if (this.pidResolve) { + this.pidResolve(Types.isNumber(childProcess.pid) ? childProcess.pid : -1); + this.pidResolve = undefined; + } childProcess.on('error', (error: Error) => { this.childProcess = null; ee({ terminated: this.terminateRequested, error: error }); @@ -288,7 +297,13 @@ export abstract class AbstractProcess { } public get pid(): TPromise { - return this.childProcessPromise.then(childProcess => childProcess.pid, err => -1); + if (this.childProcessPromise) { + return this.childProcessPromise.then(childProcess => childProcess.pid, err => -1); + } else { + return new TPromise((resolve) => { + this.pidResolve = resolve; + }); + } } public terminate(): TPromise { @@ -308,7 +323,7 @@ export abstract class AbstractProcess { } private useExec(): TPromise { - return new TPromise((c, e, p) => { + return new TPromise((c, e) => { if (!this.shell || !Platform.isWindows) { c(false); } diff --git a/src/vs/base/node/proxy.ts b/src/vs/base/node/proxy.ts index 7b430d67f0..d1e4971d6f 100644 --- a/src/vs/base/node/proxy.ts +++ b/src/vs/base/node/proxy.ts @@ -8,8 +8,6 @@ import { Url, parse as parseUrl } from 'url'; import { isBoolean } from 'vs/base/common/types'; import { Agent } from './request'; -import { TPromise } from 'vs/base/common/winjs.base'; - function getSystemProxyURI(requestURL: Url): string { if (requestURL.protocol === 'http:') { @@ -26,7 +24,7 @@ export interface IOptions { strictSSL?: boolean; } -export async function getProxyAgent(rawRequestURL: string, options: IOptions = {}): TPromise { +export async function getProxyAgent(rawRequestURL: string, options: IOptions = {}): Promise { const requestURL = parseUrl(rawRequestURL); const proxyURL = options.proxyUrl || getSystemProxyURI(requestURL); diff --git a/src/vs/base/node/ps.ts b/src/vs/base/node/ps.ts index e74c7ff3b2..c107f2c4e2 100644 --- a/src/vs/base/node/ps.ts +++ b/src/vs/base/node/ps.ts @@ -6,6 +6,7 @@ 'use strict'; import { exec } from 'child_process'; +import URI from 'vs/base/common/uri'; export interface ProcessItem { name: string; @@ -191,7 +192,41 @@ export function listProcesses(rootPid: number): Promise { } } - resolve(rootItem); + if (process.platform === 'linux') { + // Flatten rootItem to get a list of all VSCode processes + let processes = [rootItem]; + const pids = []; + while (processes.length) { + const process = processes.shift(); + pids.push(process.pid); + if (process.children) { + processes = processes.concat(process.children); + } + } + + // The cpu usage value reported on Linux is the average over the process lifetime, + // recalculate the usage over a one second interval + // JSON.stringify is needed to escape spaces, https://github.com/nodejs/node/issues/6803 + let cmd = JSON.stringify(URI.parse(require.toUrl('vs/base/node/cpuUsage.sh')).fsPath); + cmd += ' ' + pids.join(' '); + + exec(cmd, {}, (err, stdout, stderr) => { + if (err || stderr) { + reject(err || stderr.toString()); + } else { + const cpuUsage = stdout.toString().split('\n'); + for (let i = 0; i < pids.length; i++) { + const processInfo = map.get(pids[i]); + processInfo.load = parseFloat(cpuUsage[i]); + } + + resolve(rootItem); + } + }); + } else { + resolve(rootItem); + } + } }); } diff --git a/src/vs/base/node/request.ts b/src/vs/base/node/request.ts index 70808f3e71..d60285e97c 100644 --- a/src/vs/base/node/request.ts +++ b/src/vs/base/node/request.ts @@ -49,7 +49,7 @@ export interface IRequestFunction { (options: IRequestOptions): TPromise; } -async function getNodeRequest(options: IRequestOptions): TPromise { +async function getNodeRequest(options: IRequestOptions): Promise { const endpoint = parseUrl(options.url); const module = endpoint.protocol === 'https:' ? await import('https') : await import('http'); return module.request; @@ -60,7 +60,7 @@ export function request(options: IRequestOptions): TPromise { const rawRequestPromise = options.getRawRequest ? TPromise.as(options.getRawRequest(options)) - : getNodeRequest(options); + : TPromise.wrap(getNodeRequest(options)); return rawRequestPromise.then(rawRequest => { diff --git a/src/vs/base/node/stats.ts b/src/vs/base/node/stats.ts index 575af6727d..1ad99c0724 100644 --- a/src/vs/base/node/stats.ts +++ b/src/vs/base/node/stats.ts @@ -5,8 +5,9 @@ 'use strict'; -import { readdirSync, statSync, existsSync, readFileSync } from 'fs'; +import { readdir, stat, exists, readFile } from 'fs'; import { join } from 'path'; +import { parse } from 'vs/base/common/json'; export interface WorkspaceStatItem { name: string; @@ -26,34 +27,49 @@ function asSortedItems(map: Map): WorkspaceStatItem[] { return a.sort((a, b) => b.count - a.count); } -export function collectLaunchConfigs(folder: string): WorkspaceStatItem[] { +export function collectLaunchConfigs(folder: string): Promise { let launchConfigs = new Map(); let launchConfig = join(folder, '.vscode', 'launch.json'); - if (existsSync(launchConfig)) { - try { - const contents = readFileSync(launchConfig).toString(); - const json = JSON.parse(contents); - if (json['configurations']) { - for (const each of json['configurations']) { - const type = each['type']; - if (type) { - if (launchConfigs.has(type)) { - launchConfigs.set(type, launchConfigs.get(type) + 1); - } - else { - launchConfigs.set(type, 1); + return new Promise((resolve, reject) => { + exists(launchConfig, (doesExist) => { + if (doesExist) { + readFile(launchConfig, (err, contents) => { + if (err) { + return resolve([]); + } + + const errors = []; + const json = parse(contents.toString(), errors); + if (errors.length) { + console.log(`Unable to parse ${launchConfig}`); + return resolve([]); + } + + if (json['configurations']) { + for (const each of json['configurations']) { + const type = each['type']; + if (type) { + if (launchConfigs.has(type)) { + launchConfigs.set(type, launchConfigs.get(type) + 1); + } + else { + launchConfigs.set(type, 1); + } + } } } - } + + return resolve(asSortedItems(launchConfigs)); + }); + } else { + return resolve([]); } - } catch { - } - } - return asSortedItems(launchConfigs); + }); + }); } -export function collectWorkspaceStats(folder: string, filter: string[]): WorkspaceStats { +export function collectWorkspaceStats(folder: string, filter: string[]): Promise { const configFilePatterns = [ { 'tag': 'grunt.js', 'pattern': /^gruntfile\.js$/i }, { 'tag': 'gulp.js', 'pattern': /^gulpfile\.js$/i }, @@ -78,35 +94,62 @@ export function collectWorkspaceStats(folder: string, filter: string[]): Workspa const MAX_FILES = 20000; - let walkSync = (dir: string, acceptFile: (fileName: string) => void, filter: string[], token) => { - try { - let files = readdirSync(dir); + function walk(dir: string, filter: string[], token, done: (allFiles: string[]) => void): void { + let results = []; + readdir(dir, async (err, files) => { + // Ignore folders that can't be read + if (err) { + return done(results); + } + + let pending = files.length; + if (pending === 0) { + return done(results); + } + for (const file of files) { if (token.maxReached) { - return; + return done(results); } - try { - if (statSync(join(dir, file)).isDirectory()) { - if (filter.indexOf(file) === -1) { - walkSync(join(dir, file), acceptFile, filter, token); + + stat(join(dir, file), (err, stats) => { + // Ignore files that can't be read + if (err) { + if (--pending === 0) { + return done(results); + } + } else { + if (stats.isDirectory()) { + if (filter.indexOf(file) === -1) { + walk(join(dir, file), filter, token, (res: string[]) => { + results = results.concat(res); + + if (--pending === 0) { + return done(results); + } + }); + } else { + if (--pending === 0) { + done(results); + } + } + } else { + if (token.count >= MAX_FILES) { + token.maxReached = true; + } + + token.count++; + results.push(file); + + if (--pending === 0) { + done(results); + } } } - else { - if (token.count >= MAX_FILES) { - token.maxReached = true; - return; - } - token.count++; - acceptFile(file); - } - } catch { - // skip over files for which stat fails - } + }); } - } catch { - // skip over folders that cannot be read - } - }; + }); + } let addFileType = (fileType: string) => { if (fileTypes.has(fileType)) { @@ -140,13 +183,18 @@ export function collectWorkspaceStats(folder: string, filter: string[]): Workspa }; let token: { count: number, maxReached: boolean } = { count: 0, maxReached: false }; - walkSync(folder, acceptFile, filter, token); - return { - configFiles: asSortedItems(configFiles), - fileTypes: asSortedItems(fileTypes), - fileCount: token.count, - maxFilesReached: token.maxReached + return new Promise((resolve, reject) => { + walk(folder, filter, token, (files) => { + files.forEach(acceptFile); - }; + resolve({ + configFiles: asSortedItems(configFiles), + fileTypes: asSortedItems(fileTypes), + fileCount: token.count, + maxFilesReached: token.maxReached + + }); + }); + }); } \ No newline at end of file diff --git a/src/vs/base/node/stdFork.ts b/src/vs/base/node/stdFork.ts index 21b6a9a3ed..2e6703a773 100644 --- a/src/vs/base/node/stdFork.ts +++ b/src/vs/base/node/stdFork.ts @@ -19,7 +19,7 @@ export interface IForkOpts { } function makeRandomHexString(length: number): string { - let chars = ['0', '1', '2', '3', '4', '5', '6', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f']; + let chars = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f']; let result = ''; for (let i = 0; i < length; i++) { let idx = Math.floor(chars.length * Math.random()); @@ -29,7 +29,7 @@ function makeRandomHexString(length: number): string { } function generatePipeName(): string { - let randomName = 'vscode-' + makeRandomHexString(40); + let randomName = 'vscode-std-' + makeRandomHexString(40); if (process.platform === 'win32') { return '\\\\.\\pipe\\' + randomName + '-sock'; } diff --git a/src/vs/base/node/zip.ts b/src/vs/base/node/zip.ts index c23657cd03..e59daca7be 100644 --- a/src/vs/base/node/zip.ts +++ b/src/vs/base/node/zip.ts @@ -72,6 +72,9 @@ function toExtractError(err: Error): ExtractError { function extractEntry(stream: Readable, fileName: string, mode: number, targetPath: string, options: IOptions): TPromise { const dirName = path.dirname(fileName); const targetDirName = path.join(targetPath, dirName); + if (targetDirName.indexOf(targetPath) !== 0) { + return TPromise.wrapError(new Error(nls.localize('invalid file', "Error extracting {0}. Invalid file.", fileName))); + } const targetFileName = path.join(targetPath, fileName); let istream: WriteStream; @@ -111,7 +114,6 @@ function extractZip(zipfile: ZipFile, targetPath: string, options: IOptions, log }, e)); zipfile.readEntry(); zipfile.on('entry', (entry: Entry) => { - logService.debug(targetPath, 'Found', entry.fileName); if (isCanceled) { return; diff --git a/src/vs/base/parts/ipc/common/ipc.ts b/src/vs/base/parts/ipc/common/ipc.ts index 711f90a62d..8e8f58223f 100644 --- a/src/vs/base/parts/ipc/common/ipc.ts +++ b/src/vs/base/parts/ipc/common/ipc.ts @@ -6,21 +6,30 @@ 'use strict'; import { Promise, TPromise } from 'vs/base/common/winjs.base'; -import { IDisposable, toDisposable } from 'vs/base/common/lifecycle'; -import { Event, Emitter, once, filterEvent } from 'vs/base/common/event'; +import { IDisposable, toDisposable, dispose } from 'vs/base/common/lifecycle'; +import { Event, Emitter, once, filterEvent, toPromise, Relay } from 'vs/base/common/event'; enum MessageType { - RequestCommon, - RequestCancel, + RequestPromise, + RequestPromiseCancel, ResponseInitialize, - ResponseSuccess, - ResponseProgress, - ResponseError, - ResponseErrorObj + ResponsePromiseSuccess, + ResponsePromiseProgress, + ResponsePromiseError, + ResponsePromiseErrorObj, + + RequestEventListen, + RequestEventDispose, + ResponseEventFire, } function isResponse(messageType: MessageType): boolean { - return messageType >= MessageType.ResponseInitialize; + return messageType === MessageType.ResponseInitialize + || messageType === MessageType.ResponsePromiseSuccess + || messageType === MessageType.ResponsePromiseProgress + || messageType === MessageType.ResponsePromiseError + || messageType === MessageType.ResponsePromiseErrorObj + || messageType === MessageType.ResponseEventFire; } interface IRawMessage { @@ -36,7 +45,6 @@ interface IRawRequest extends IRawMessage { interface IRequest { raw: IRawRequest; - emitter?: Emitter; flush?: () => void; } @@ -65,7 +73,8 @@ enum State { * with at most one single return value. */ export interface IChannel { - call(command: string, arg?: any): TPromise; + call(command: string, arg?: any): TPromise; + listen(event: string, arg?: any): Event; } /** @@ -90,7 +99,8 @@ export interface IChannelClient { * channels (each from a separate client) to pick from. */ export interface IClientRouter { - route(command: string, arg: any): string; + routeCall(command: string, arg: any): TPromise; + routeEvent(event: string, arg: any): TPromise; } /** @@ -104,6 +114,8 @@ export interface IRoutingChannelClient { getChannel(channelName: string, router: IClientRouter): T; } +// TODO@joao cleanup this mess! + export class ChannelServer implements IChannelServer, IDisposable { private channels: { [name: string]: IChannel } = Object.create(null); @@ -121,17 +133,22 @@ export class ChannelServer implements IChannelServer, IDisposable { private onMessage(request: IRawRequest): void { switch (request.type) { - case MessageType.RequestCommon: - this.onCommonRequest(request); + case MessageType.RequestPromise: + this.onPromise(request); break; - case MessageType.RequestCancel: - this.onCancelRequest(request); + case MessageType.RequestEventListen: + this.onEventListen(request); + break; + + case MessageType.RequestPromiseCancel: + case MessageType.RequestEventDispose: + this.disposeActiveRequest(request); break; } } - private onCommonRequest(request: IRawRequest): void { + private onPromise(request: IRawRequest): void { const channel = this.channels[request.channelName]; let promise: Promise; @@ -144,7 +161,7 @@ export class ChannelServer implements IChannelServer, IDisposable { const id = request.id; const requestPromise = promise.then(data => { - this.protocol.send({ id, data, type: MessageType.ResponseSuccess }); + this.protocol.send({ id, data, type: MessageType.ResponsePromiseSuccess }); delete this.activeRequests[request.id]; }, data => { if (data instanceof Error) { @@ -153,21 +170,31 @@ export class ChannelServer implements IChannelServer, IDisposable { message: data.message, name: data.name, stack: data.stack ? (data.stack.split ? data.stack.split('\n') : data.stack) : void 0 - }, type: MessageType.ResponseError + }, type: MessageType.ResponsePromiseError }); } else { - this.protocol.send({ id, data, type: MessageType.ResponseErrorObj }); + this.protocol.send({ id, data, type: MessageType.ResponsePromiseErrorObj }); } delete this.activeRequests[request.id]; }, data => { - this.protocol.send({ id, data, type: MessageType.ResponseProgress }); + this.protocol.send({ id, data, type: MessageType.ResponsePromiseProgress }); }); this.activeRequests[request.id] = toDisposable(() => requestPromise.cancel()); } - private onCancelRequest(request: IRawRequest): void { + private onEventListen(request: IRawRequest): void { + const channel = this.channels[request.channelName]; + + const id = request.id; + const event = channel.listen(request.name, request.arg); + const disposable = event(data => this.protocol.send({ id, data, type: MessageType.ResponseEventFire })); + + this.activeRequests[request.id] = disposable; + } + + private disposeActiveRequest(request: IRawRequest): void { const disposable = this.activeRequests[request.id]; if (disposable) { @@ -190,63 +217,86 @@ export class ChannelServer implements IChannelServer, IDisposable { export class ChannelClient implements IChannelClient, IDisposable { - private state: State; - private activeRequests: Promise[]; - private bufferedRequests: IRequest[]; - private handlers: { [id: number]: IHandler; }; - private lastRequestId: number; + private state: State = State.Uninitialized; + private activeRequests: IDisposable[] = []; + private bufferedRequests: IRequest[] = []; + private handlers: { [id: number]: IHandler; } = Object.create(null); + private lastRequestId: number = 0; private protocolListener: IDisposable; + private _onDidInitialize = new Emitter(); + readonly onDidInitialize = this._onDidInitialize.event; + constructor(private protocol: IMessagePassingProtocol) { - this.state = State.Uninitialized; - this.activeRequests = []; - this.bufferedRequests = []; - this.handlers = Object.create(null); - this.lastRequestId = 0; this.protocolListener = this.protocol.onMessage(r => this.onMessage(r)); } getChannel(channelName: string): T { - const call = (command: string, arg: any) => this.request(channelName, command, arg); - return { call } as T; + const call = (command: string, arg: any) => this.requestPromise(channelName, command, arg); + const listen = (event: string, arg: any) => this.requestEvent(channelName, event, arg); + + return { call, listen } as T; } - private request(channelName: string, name: string, arg: any): Promise { - const request = { - raw: { - id: this.lastRequestId++, - type: MessageType.RequestCommon, - channelName, - name, - arg - } - }; + private requestPromise(channelName: string, name: string, arg: any): TPromise { + const id = this.lastRequestId++; + const type = MessageType.RequestPromise; + const request = { raw: { id, type, channelName, name, arg } }; const activeRequest = this.state === State.Uninitialized ? this.bufferRequest(request) : this.doRequest(request); - this.activeRequests.push(activeRequest); + const disposable = toDisposable(() => activeRequest.cancel()); + this.activeRequests.push(disposable); activeRequest .then(null, _ => null) - .done(() => this.activeRequests = this.activeRequests.filter(i => i !== activeRequest)); + .done(() => this.activeRequests = this.activeRequests.filter(el => el !== disposable)); return activeRequest; } + private requestEvent(channelName: string, name: string, arg: any): Event { + const id = this.lastRequestId++; + const type = MessageType.RequestEventListen; + const request = { raw: { id, type, channelName, name, arg } }; + + let uninitializedPromise: TPromise | null = null; + const emitter = new Emitter({ + onFirstListenerAdd: () => { + uninitializedPromise = this.whenInitialized(); + uninitializedPromise.then(() => { + uninitializedPromise = null; + this.send(request.raw); + }); + }, + onLastListenerRemove: () => { + if (uninitializedPromise) { + uninitializedPromise.cancel(); + uninitializedPromise = null; + } else { + this.send({ id, type: MessageType.RequestEventDispose }); + } + } + }); + + this.handlers[id] = response => emitter.fire(response.data); + return emitter.event; + } + private doRequest(request: IRequest): Promise { const id = request.raw.id; return new TPromise((c, e, p) => { this.handlers[id] = response => { switch (response.type) { - case MessageType.ResponseSuccess: + case MessageType.ResponsePromiseSuccess: delete this.handlers[id]; c(response.data); break; - case MessageType.ResponseError: + case MessageType.ResponsePromiseError: delete this.handlers[id]; const error = new Error(response.data.message); (error).stack = response.data.stack; @@ -254,12 +304,12 @@ export class ChannelClient implements IChannelClient, IDisposable { e(error); break; - case MessageType.ResponseErrorObj: + case MessageType.ResponsePromiseErrorObj: delete this.handlers[id]; e(response.data); break; - case MessageType.ResponseProgress: + case MessageType.ResponsePromiseProgress: p(response.data); break; } @@ -267,7 +317,7 @@ export class ChannelClient implements IChannelClient, IDisposable { this.send(request.raw); }, - () => this.send({ id, type: MessageType.RequestCancel })); + () => this.send({ id, type: MessageType.RequestPromiseCancel })); } private bufferRequest(request: IRequest): Promise { @@ -309,6 +359,7 @@ export class ChannelClient implements IChannelClient, IDisposable { if (this.state === State.Uninitialized && response.type === MessageType.ResponseInitialize) { this.state = State.Idle; + this._onDidInitialize.fire(); this.bufferedRequests.forEach(r => r.flush && r.flush()); this.bufferedRequests = null; return; @@ -328,12 +379,19 @@ export class ChannelClient implements IChannelClient, IDisposable { } } + private whenInitialized(): TPromise { + if (this.state === State.Idle) { + return TPromise.as(null); + } else { + return toPromise(this.onDidInitialize); + } + } + dispose(): void { this.protocolListener.dispose(); this.protocolListener = null; - this.activeRequests.forEach(r => r.cancel()); - this.activeRequests = []; + this.activeRequests = dispose(this.activeRequests); } } @@ -381,16 +439,24 @@ export class IPCServer implements IChannelServer, IRoutingChannelClient, IDispos getChannel(channelName: string, router: IClientRouter): T { const call = (command: string, arg: any) => { - const id = router.route(command, arg); + const channelPromise = router.routeCall(command, arg) + .then(id => this.getClient(id)) + .then(client => client.getChannel(channelName)); - if (!id) { - return TPromise.wrapError(new Error('Client id should be provided')); - } - - return this.getClient(id).then(client => client.getChannel(channelName).call(command, arg)); + return getDelayedChannel(channelPromise) + .call(command, arg); }; - return { call } as T; + const listen = (event: string, arg: any) => { + const channelPromise = router.routeEvent(event, arg) + .then(id => this.getClient(id)) + .then(client => client.getChannel(channelName)); + + return getDelayedChannel(channelPromise) + .listen(event, arg); + }; + + return { call, listen } as T; } registerChannel(channelName: string, channel: IChannel): void { @@ -398,6 +464,10 @@ export class IPCServer implements IChannelServer, IRoutingChannelClient, IDispos } private getClient(clientId: string): TPromise { + if (!clientId) { + return TPromise.wrapError(new Error('Client id should be provided')); + } + const client = this.channelClients[clientId]; if (client) { @@ -453,7 +523,13 @@ export class IPCClient implements IChannelClient, IChannelServer, IDisposable { export function getDelayedChannel(promise: TPromise): T { const call = (command: string, arg: any) => promise.then(c => c.call(command, arg)); - return { call } as T; + const listen = (event: string, arg: any) => { + const relay = new Relay(); + promise.then(c => relay.input = c.listen(event, arg)); + return relay.event; + }; + + return { call, listen } as T; } export function getNextTickChannel(channel: T): T { @@ -469,34 +545,19 @@ export function getNextTickChannel(channel: T): T { .then(() => channel.call(command, arg)); }; - return { call } as T; -} - -export type Serializer = (obj: T) => R; -export type Deserializer = (raw: R) => T; - -export function eventToCall(event: Event, serializer: Serializer = t => t): TPromise { - let disposable: IDisposable; - - return new TPromise( - (c, e, p) => disposable = event(t => p(serializer(t))), - () => disposable.dispose() - ); -} - -export function eventFromCall(channel: IChannel, name: string, arg: any = null, deserializer: Deserializer = t => t): Event { - let promise: Promise; - - const emitter = new Emitter({ - onFirstListenerAdd: () => { - promise = channel.call(name, arg) - .then(null, err => null, e => emitter.fire(deserializer(e))); - }, - onLastListenerRemove: () => { - promise.cancel(); - promise = null; + const listen = (event: string, arg: any): Event => { + if (didTick) { + return channel.listen(event, arg); } - }); - return emitter.event; + const relay = new Relay(); + + TPromise.timeout(0) + .then(() => didTick = true) + .then(() => relay.input = channel.listen(event, arg)); + + return relay.event; + }; + + return { call, listen } as T; } diff --git a/src/vs/base/parts/ipc/node/ipc.cp.ts b/src/vs/base/parts/ipc/node/ipc.cp.ts index 4708601b23..a658127a67 100644 --- a/src/vs/base/parts/ipc/node/ipc.cp.ts +++ b/src/vs/base/parts/ipc/node/ipc.cp.ts @@ -3,12 +3,12 @@ * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { ChildProcess, fork } from 'child_process'; -import { IDisposable } from 'vs/base/common/lifecycle'; +import { ChildProcess, fork, ForkOptions } from 'child_process'; +import { IDisposable, toDisposable, dispose } from 'vs/base/common/lifecycle'; import { TPromise } from 'vs/base/common/winjs.base'; import { Delayer } from 'vs/base/common/async'; import { deepClone, assign } from 'vs/base/common/objects'; -import { Emitter, fromNodeEventEmitter } from 'vs/base/common/event'; +import { Emitter, fromNodeEventEmitter, Event } from 'vs/base/common/event'; import { createQueuedSender } from 'vs/base/node/processes'; import { ChannelServer as IPCServer, ChannelClient as IPCClient, IChannelClient, IChannel } from 'vs/base/parts/ipc/common/ipc'; import { isRemoteConsoleLog, log } from 'vs/base/node/console'; @@ -74,11 +74,14 @@ export interface IIPCOptions { export class Client implements IChannelClient, IDisposable { private disposeDelayer: Delayer; - private activeRequests: TPromise[]; + private activeRequests: IDisposable[]; private child: ChildProcess; private _client: IPCClient; private channels: { [name: string]: IChannel }; + private _onDidProcessExit = new Emitter<{ code: number, signal: string }>(); + readonly onDidProcessExit = this._onDidProcessExit.event; + constructor(private modulePath: string, private options: IIPCOptions) { const timeout = options && options.timeout ? options.timeout : 60000; this.disposeDelayer = new Delayer(timeout); @@ -89,11 +92,12 @@ export class Client implements IChannelClient, IDisposable { } getChannel(channelName: string): T { - const call = (command: string, arg: any) => this.request(channelName, command, arg); - return { call } as T; + const call = (command: string, arg: any) => this.requestPromise(channelName, command, arg); + const listen = (event: string, arg: any) => this.requestEvent(channelName, event, arg); + return { call, listen } as IChannel as T; } - protected request(channelName: string, name: string, arg: any): TPromise { + protected requestPromise(channelName: string, name: string, arg: any): TPromise { if (!this.disposeDelayer) { return TPromise.wrapError(new Error('disposed')); } @@ -110,7 +114,7 @@ export class Client implements IChannelClient, IDisposable { return; } - this.activeRequests.splice(this.activeRequests.indexOf(result), 1); + this.activeRequests.splice(this.activeRequests.indexOf(disposable), 1); if (this.activeRequests.length === 0) { this.disposeDelayer.trigger(() => this.disposeClient()); @@ -118,14 +122,49 @@ export class Client implements IChannelClient, IDisposable { }); }, () => request.cancel()); - this.activeRequests.push(result); + const disposable = toDisposable(() => result.cancel()); + this.activeRequests.push(disposable); return result; } + protected requestEvent(channelName: string, name: string, arg: any): Event { + if (!this.disposeDelayer) { + return Event.None; + } + + this.disposeDelayer.cancel(); + + let listener: IDisposable; + const emitter = new Emitter({ + onFirstListenerAdd: () => { + const channel = this.channels[channelName] || (this.channels[channelName] = this.client.getChannel(channelName)); + const event: Event = channel.listen(name, arg); + + listener = event(emitter.fire, emitter); + this.activeRequests.push(listener); + + }, + onLastListenerRemove: () => { + if (!this.activeRequests) { + return; + } + + this.activeRequests.splice(this.activeRequests.indexOf(listener), 1); + listener.dispose(); + + if (this.activeRequests.length === 0) { + this.disposeDelayer.trigger(() => this.disposeClient()); + } + } + }); + + return emitter.event; + } + private get client(): IPCClient { if (!this._client) { const args = this.options && this.options.args ? this.options.args : []; - const forkOpts = Object.create(null); + const forkOpts: ForkOptions = Object.create(null); forkOpts.env = assign(deepClone(process.env), { 'VSCODE_PARENT_PID': String(process.pid) }); @@ -178,15 +217,16 @@ export class Client implements IChannelClient, IDisposable { process.removeListener('exit', onExit); if (this.activeRequests) { - this.activeRequests.forEach(req => req.cancel()); - this.activeRequests = []; + this.activeRequests = dispose(this.activeRequests); } if (code !== 0 && signal !== 'SIGTERM') { - console.warn('IPC "' + this.options.serverName + '" crashed with exit code ' + code); + console.warn('IPC "' + this.options.serverName + '" crashed with exit code ' + code + ' and signal ' + signal); this.disposeDelayer.cancel(); this.disposeClient(); } + + this._onDidProcessExit.fire({ code, signal }); }); } @@ -203,6 +243,7 @@ export class Client implements IChannelClient, IDisposable { } dispose() { + this._onDidProcessExit.dispose(); this.disposeDelayer.cancel(); this.disposeDelayer = null; this.disposeClient(); diff --git a/src/vs/base/parts/ipc/node/ipc.net.ts b/src/vs/base/parts/ipc/node/ipc.net.ts index 3931645d54..9304cde78e 100644 --- a/src/vs/base/parts/ipc/node/ipc.net.ts +++ b/src/vs/base/parts/ipc/node/ipc.net.ts @@ -12,28 +12,41 @@ import { IMessagePassingProtocol, ClientConnectionEvent, IPCServer, IPCClient } import { join } from 'path'; import { tmpdir } from 'os'; import { generateUuid } from 'vs/base/common/uuid'; +import { IDisposable } from 'vs/base/common/lifecycle'; +import { TimeoutTimer } from 'vs/base/common/async'; export function generateRandomPipeName(): string { const randomSuffix = generateUuid(); if (process.platform === 'win32') { - return `\\\\.\\pipe\\vscode-${randomSuffix}-sock`; + return `\\\\.\\pipe\\vscode-ipc-${randomSuffix}-sock`; } else { // Mac/Unix: use socket file - return join(tmpdir(), `vscode-${randomSuffix}.sock`); + return join(tmpdir(), `vscode-ipc-${randomSuffix}.sock`); } } -export class Protocol implements IMessagePassingProtocol { +export class Protocol implements IDisposable, IMessagePassingProtocol { - private static readonly _headerLen = 17; + private static readonly _headerLen = 5; + + private _isDisposed: boolean; + private _chunks: Buffer[]; + + private _firstChunkTimer: TimeoutTimer; + private _socketDataListener: (data: Buffer) => void; + private _socketEndListener: () => void; + private _socketCloseListener: () => void; private _onMessage = new Emitter(); - readonly onMessage: Event = this._onMessage.event; - constructor(private _socket: Socket) { + private _onClose = new Emitter(); + readonly onClose: Event = this._onClose.event; + + constructor(private _socket: Socket, firstDataChunk?: Buffer) { + this._isDisposed = false; + this._chunks = []; - let chunks: Buffer[] = []; let totalLength = 0; const state = { @@ -42,18 +55,18 @@ export class Protocol implements IMessagePassingProtocol { bodyLen: -1, }; - _socket.on('data', (data: Buffer) => { + const acceptChunk = (data: Buffer) => { - chunks.push(data); + this._chunks.push(data); totalLength += data.length; while (totalLength > 0) { if (state.readHead) { - // expecting header -> read 17bytes for header + // expecting header -> read 5bytes for header // information: `bodyIsJson` and `bodyLen` if (totalLength >= Protocol._headerLen) { - const all = Buffer.concat(chunks); + const all = Buffer.concat(this._chunks); state.bodyIsJson = all.readInt8(0) === 1; state.bodyLen = all.readInt32BE(1); @@ -61,7 +74,7 @@ export class Protocol implements IMessagePassingProtocol { const rest = all.slice(Protocol._headerLen); totalLength = rest.length; - chunks = [rest]; + this._chunks = [rest]; } else { break; @@ -73,27 +86,79 @@ export class Protocol implements IMessagePassingProtocol { // the actual message or wait for more data if (totalLength >= state.bodyLen) { - const all = Buffer.concat(chunks); + const all = Buffer.concat(this._chunks); let message = all.toString('utf8', 0, state.bodyLen); if (state.bodyIsJson) { message = JSON.parse(message); } - this._onMessage.fire(message); + // ensure the public getBuffer returns a valid value if invoked from the event listeners const rest = all.slice(state.bodyLen); totalLength = rest.length; - chunks = [rest]; + this._chunks = [rest]; state.bodyIsJson = false; state.bodyLen = -1; state.readHead = true; + this._onMessage.fire(message); + + if (this._isDisposed) { + // check if an event listener lead to our disposal + break; + } } else { break; } } } - }); + }; + + const acceptFirstDataChunk = () => { + if (firstDataChunk && firstDataChunk.length > 0) { + let tmp = firstDataChunk; + firstDataChunk = null; + acceptChunk(tmp); + } + }; + + // Make sure to always handle the firstDataChunk if no more `data` event comes in + this._firstChunkTimer = new TimeoutTimer(); + this._firstChunkTimer.setIfNotSet(() => { + acceptFirstDataChunk(); + }, 0); + + this._socketDataListener = (data: Buffer) => { + acceptFirstDataChunk(); + acceptChunk(data); + }; + _socket.on('data', this._socketDataListener); + + this._socketEndListener = () => { + acceptFirstDataChunk(); + }; + _socket.on('end', this._socketEndListener); + + this._socketCloseListener = () => { + this._onClose.fire(); + }; + _socket.once('close', this._socketCloseListener); + } + + public dispose(): void { + this._isDisposed = true; + this._firstChunkTimer.dispose(); + this._socket.removeListener('data', this._socketDataListener); + this._socket.removeListener('end', this._socketEndListener); + this._socket.removeListener('close', this._socketCloseListener); + } + + public end(): void { + this._socket.end(); + } + + public getBuffer(): Buffer { + return Buffer.concat(this._chunks); } public send(message: any): void { @@ -106,10 +171,10 @@ export class Protocol implements IMessagePassingProtocol { // ensure string if (typeof message !== 'string') { message = JSON.stringify(message); - header.writeInt8(1, 0); + header.writeInt8(1, 0, true); } const data = Buffer.from(message); - header.writeInt32BE(data.length, 1); + header.writeInt32BE(data.length, 1, true); this._writeSoon(header, data); } @@ -176,18 +241,19 @@ export class Server extends IPCServer { export class Client extends IPCClient { - private _onClose = new Emitter(); - get onClose(): Event { return this._onClose.event; } + public static fromSocket(socket: Socket, id: string): Client { + return new Client(new Protocol(socket), id); + } - constructor(private socket: Socket, id: string) { - super(new Protocol(socket), id); - socket.once('close', () => this._onClose.fire()); + get onClose(): Event { return this.protocol.onClose; } + + constructor(private protocol: Protocol, id: string) { + super(protocol, id); } dispose(): void { super.dispose(); - this.socket.end(); - this.socket = null; + this.protocol.end(); } } @@ -205,13 +271,14 @@ export function serve(hook: any): TPromise { }); } +export function connect(options: { host: string, port: number }, clientId: string): TPromise; export function connect(port: number, clientId: string): TPromise; export function connect(namedPipe: string, clientId: string): TPromise; export function connect(hook: any, clientId: string): TPromise { return new TPromise((c, e) => { const socket = createConnection(hook, () => { socket.removeListener('error', e); - c(new Client(socket, clientId)); + c(Client.fromSocket(socket, clientId)); }); socket.once('error', e); diff --git a/src/vs/base/parts/ipc/test/node/ipc.net.test.ts b/src/vs/base/parts/ipc/test/node/ipc.net.test.ts index 25062fe049..83774f77d6 100644 --- a/src/vs/base/parts/ipc/test/node/ipc.net.test.ts +++ b/src/vs/base/parts/ipc/test/node/ipc.net.test.ts @@ -87,4 +87,39 @@ suite('IPC, Socket Protocol', () => { }); }); }); + + test('can devolve to a socket and evolve again without losing data', () => { + let resolve: (v: void) => void; + let result = new TPromise((_resolve, _reject) => { + resolve = _resolve; + }); + const sender = new Protocol(stream); + const receiver1 = new Protocol(stream); + + assert.equal(stream.listenerCount('data'), 2); + assert.equal(stream.listenerCount('end'), 2); + + receiver1.onMessage((msg) => { + assert.equal(msg.value, 1); + + let buffer = receiver1.getBuffer(); + receiver1.dispose(); + + assert.equal(stream.listenerCount('data'), 1); + assert.equal(stream.listenerCount('end'), 1); + + const receiver2 = new Protocol(stream, buffer); + receiver2.onMessage((msg) => { + assert.equal(msg.value, 2); + resolve(void 0); + }); + }); + + const msg1 = { value: 1 }; + const msg2 = { value: 2 }; + sender.send(msg1); + sender.send(msg2); + + return result; + }); }); diff --git a/src/vs/base/parts/ipc/test/node/ipc.test.ts b/src/vs/base/parts/ipc/test/node/ipc.test.ts index f2a2406f4d..470560786d 100644 --- a/src/vs/base/parts/ipc/test/node/ipc.test.ts +++ b/src/vs/base/parts/ipc/test/node/ipc.test.ts @@ -24,10 +24,6 @@ suite('IPC', () => { suite('child process', () => { test('createChannel', () => { - if (process.env['VSCODE_PID']) { - return undefined; // this test fails when run from within VS Code - } - const client = createClient(); const channel = client.getChannel('test'); const service = new TestServiceClient(channel); @@ -41,10 +37,6 @@ suite('IPC', () => { }); test('cancellation', () => { - if (process.env['VSCODE_PID']) { - return undefined; // this test fails when run from within VS Code - } - const client = createClient(); const channel = client.getChannel('test'); const service = new TestServiceClient(channel); @@ -61,10 +53,6 @@ suite('IPC', () => { }); test('events', () => { - if (process.env['VSCODE_PID']) { - return undefined; // this test fails when run from within VS Code - } - const client = createClient(); const channel = client.getChannel('test'); const service = new TestServiceClient(channel); @@ -87,10 +75,6 @@ suite('IPC', () => { }); test('event dispose', () => { - if (process.env['VSCODE_PID']) { - return undefined; // this test fails when run from within VS Code - } - const client = createClient(); const channel = client.getChannel('test'); const service = new TestServiceClient(channel); diff --git a/src/vs/base/parts/ipc/test/node/testService.ts b/src/vs/base/parts/ipc/test/node/testService.ts index 98ae58940f..5a63cc31c9 100644 --- a/src/vs/base/parts/ipc/test/node/testService.ts +++ b/src/vs/base/parts/ipc/test/node/testService.ts @@ -5,7 +5,7 @@ 'use strict'; import { TPromise, PPromise } from 'vs/base/common/winjs.base'; -import { IChannel, eventToCall, eventFromCall } from 'vs/base/parts/ipc/common/ipc'; +import { IChannel } from 'vs/base/parts/ipc/common/ipc'; import { Event, Emitter } from 'vs/base/common/event'; export interface IMarcoPoloEvent { @@ -68,6 +68,9 @@ export class TestService implements ITestService { } export interface ITestChannel extends IChannel { + listen(event: 'marco'): Event; + listen(event: string, arg?: any): Event; + call(command: 'marco'): TPromise; call(command: 'pong', ping: string): TPromise; call(command: 'cancelMe'): TPromise; @@ -79,12 +82,19 @@ export class TestChannel implements ITestChannel { constructor(private testService: ITestService) { } + listen(event: string, arg?: any): Event { + switch (event) { + case 'marco': return this.testService.onMarco; + } + + throw new Error('Event not found'); + } + call(command: string, ...args: any[]): TPromise { switch (command) { case 'pong': return this.testService.pong(args[0]); case 'cancelMe': return this.testService.cancelMe(); case 'marco': return this.testService.marco(); - case 'event:marco': return eventToCall(this.testService.onMarco); case 'batchPerf': return this.testService.batchPerf(args[0].batches, args[0].size, args[0].dataSize); default: return TPromise.wrapError(new Error('command not found')); } @@ -93,12 +103,9 @@ export class TestChannel implements ITestChannel { export class TestServiceClient implements ITestService { - private _onMarco: Event; - get onMarco(): Event { return this._onMarco; } + get onMarco(): Event { return this.channel.listen('marco'); } - constructor(private channel: ITestChannel) { - this._onMarco = eventFromCall(channel, 'event:marco'); - } + constructor(private channel: ITestChannel) { } marco(): TPromise { return this.channel.call('marco'); diff --git a/src/vs/base/parts/quickopen/browser/quickOpenModel.ts b/src/vs/base/parts/quickopen/browser/quickOpenModel.ts index 29ace6252a..135672c2b2 100644 --- a/src/vs/base/parts/quickopen/browser/quickOpenModel.ts +++ b/src/vs/base/parts/quickopen/browser/quickOpenModel.ts @@ -37,15 +37,15 @@ let IDS = 0; export class QuickOpenItemAccessorClass implements IItemAccessor { - public getItemLabel(entry: QuickOpenEntry): string { + getItemLabel(entry: QuickOpenEntry): string { return entry.getLabel(); } - public getItemDescription(entry: QuickOpenEntry): string { + getItemDescription(entry: QuickOpenEntry): string { return entry.getDescription(); } - public getItemPath(entry: QuickOpenEntry): string { + getItemPath(entry: QuickOpenEntry): string { const resource = entry.getResource(); return resource ? resource.fsPath : void 0; @@ -70,70 +70,72 @@ export class QuickOpenEntry { /** * A unique identifier for the entry */ - public getId(): string { + getId(): string { return this.id; } /** * The label of the entry to identify it from others in the list */ - public getLabel(): string { + getLabel(): string { return null; } /** * The options for the label to use for this entry */ - public getLabelOptions(): IIconLabelValueOptions { + getLabelOptions(): IIconLabelValueOptions { return null; } /** * The label of the entry to use when a screen reader wants to read about the entry */ - public getAriaLabel(): string { - return this.getLabel(); + getAriaLabel(): string { + return [this.getLabel(), this.getDescription(), this.getDetail()] + .filter(s => !!s) + .join(', '); } /** * Detail information about the entry that is optional and can be shown below the label */ - public getDetail(): string { + getDetail(): string { return null; } /** * The icon of the entry to identify it from others in the list */ - public getIcon(): string { + getIcon(): string { return null; } /** * A secondary description that is optional and can be shown right to the label */ - public getDescription(): string { + getDescription(): string { return null; } /** * A tooltip to show when hovering over the entry. */ - public getTooltip(): string { + getTooltip(): string { return null; } /** * A tooltip to show when hovering over the description portion of the entry. */ - public getDescriptionTooltip(): string { + getDescriptionTooltip(): string { return null; } /** * An optional keybinding to show for an entry. */ - public getKeybinding(): ResolvedKeybinding { + getKeybinding(): ResolvedKeybinding { return null; } @@ -141,28 +143,28 @@ export class QuickOpenEntry { * A resource for this entry. Resource URIs can be used to compare different kinds of entries and group * them together. */ - public getResource(): URI { + getResource(): URI { return null; } /** * Allows to reuse the same model while filtering. Hidden entries will not show up in the viewer. */ - public isHidden(): boolean { + isHidden(): boolean { return this.hidden; } /** * Allows to reuse the same model while filtering. Hidden entries will not show up in the viewer. */ - public setHidden(hidden: boolean): void { + setHidden(hidden: boolean): void { this.hidden = hidden; } /** * Allows to set highlight ranges that should show up for the entry label and optionally description if set. */ - public setHighlights(labelHighlights: IHighlight[], descriptionHighlights?: IHighlight[], detailHighlights?: IHighlight[]): void { + setHighlights(labelHighlights: IHighlight[], descriptionHighlights?: IHighlight[], detailHighlights?: IHighlight[]): void { this.labelHighlights = labelHighlights; this.descriptionHighlights = descriptionHighlights; this.detailHighlights = detailHighlights; @@ -171,7 +173,7 @@ export class QuickOpenEntry { /** * Allows to return highlight ranges that should show up for the entry label and description. */ - public getHighlights(): [IHighlight[] /* Label */, IHighlight[] /* Description */, IHighlight[] /* Detail */] { + getHighlights(): [IHighlight[] /* Label */, IHighlight[] /* Description */, IHighlight[] /* Detail */] { return [this.labelHighlights, this.descriptionHighlights, this.detailHighlights]; } @@ -181,7 +183,7 @@ export class QuickOpenEntry { * * The context parameter provides additional context information how the run was triggered. */ - public run(mode: Mode, context: IContext): boolean { + run(mode: Mode, context: IContext): boolean { return false; } @@ -190,7 +192,7 @@ export class QuickOpenEntry { * and the resource of this entry is the same as the resource for an editor history, it will not show up * because it is considered to be a duplicate of an editor history. */ - public mergeWithEditorHistory(): boolean { + mergeWithEditorHistory(): boolean { return false; } } @@ -211,97 +213,97 @@ export class QuickOpenEntryGroup extends QuickOpenEntry { /** * The label of the group or null if none. */ - public getGroupLabel(): string { + getGroupLabel(): string { return this.groupLabel; } - public setGroupLabel(groupLabel: string): void { + setGroupLabel(groupLabel: string): void { this.groupLabel = groupLabel; } /** * Whether to show a border on top of the group entry or not. */ - public showBorder(): boolean { + showBorder(): boolean { return this.withBorder; } - public setShowBorder(showBorder: boolean): void { + setShowBorder(showBorder: boolean): void { this.withBorder = showBorder; } - public getLabel(): string { + getLabel(): string { return this.entry ? this.entry.getLabel() : super.getLabel(); } - public getLabelOptions(): IIconLabelValueOptions { + getLabelOptions(): IIconLabelValueOptions { return this.entry ? this.entry.getLabelOptions() : super.getLabelOptions(); } - public getAriaLabel(): string { + getAriaLabel(): string { return this.entry ? this.entry.getAriaLabel() : super.getAriaLabel(); } - public getDetail(): string { + getDetail(): string { return this.entry ? this.entry.getDetail() : super.getDetail(); } - public getResource(): URI { + getResource(): URI { return this.entry ? this.entry.getResource() : super.getResource(); } - public getIcon(): string { + getIcon(): string { return this.entry ? this.entry.getIcon() : super.getIcon(); } - public getDescription(): string { + getDescription(): string { return this.entry ? this.entry.getDescription() : super.getDescription(); } - public getEntry(): QuickOpenEntry { + getEntry(): QuickOpenEntry { return this.entry; } - public getHighlights(): [IHighlight[], IHighlight[], IHighlight[]] { + getHighlights(): [IHighlight[], IHighlight[], IHighlight[]] { return this.entry ? this.entry.getHighlights() : super.getHighlights(); } - public isHidden(): boolean { + isHidden(): boolean { return this.entry ? this.entry.isHidden() : super.isHidden(); } - public setHighlights(labelHighlights: IHighlight[], descriptionHighlights?: IHighlight[], detailHighlights?: IHighlight[]): void { + setHighlights(labelHighlights: IHighlight[], descriptionHighlights?: IHighlight[], detailHighlights?: IHighlight[]): void { this.entry ? this.entry.setHighlights(labelHighlights, descriptionHighlights, detailHighlights) : super.setHighlights(labelHighlights, descriptionHighlights, detailHighlights); } - public setHidden(hidden: boolean): void { + setHidden(hidden: boolean): void { this.entry ? this.entry.setHidden(hidden) : super.setHidden(hidden); } - public run(mode: Mode, context: IContext): boolean { + run(mode: Mode, context: IContext): boolean { return this.entry ? this.entry.run(mode, context) : super.run(mode, context); } } class NoActionProvider implements IActionProvider { - public hasActions(tree: ITree, element: any): boolean { + hasActions(tree: ITree, element: any): boolean { return false; } - public getActions(tree: ITree, element: any): TPromise { + getActions(tree: ITree, element: any): TPromise { return TPromise.as(null); } - public hasSecondaryActions(tree: ITree, element: any): boolean { + hasSecondaryActions(tree: ITree, element: any): boolean { return false; } - public getSecondaryActions(tree: ITree, element: any): TPromise { + getSecondaryActions(tree: ITree, element: any): TPromise { return TPromise.as(null); } - public getActionItem(tree: ITree, element: any, action: Action): IActionItem { + getActionItem(tree: ITree, element: any, action: Action): IActionItem { return null; } } @@ -333,7 +335,7 @@ class Renderer implements IRenderer { this.actionRunner = actionRunner; } - public getHeight(entry: QuickOpenEntry): number { + getHeight(entry: QuickOpenEntry): number { if (entry.getDetail()) { return 44; } @@ -341,7 +343,7 @@ class Renderer implements IRenderer { return 22; } - public getTemplateId(entry: QuickOpenEntry): string { + getTemplateId(entry: QuickOpenEntry): string { if (entry instanceof QuickOpenEntryGroup) { return templateEntryGroup; } @@ -349,7 +351,7 @@ class Renderer implements IRenderer { return templateEntry; } - public renderTemplate(templateId: string, container: HTMLElement, styles: IQuickOpenStyles): IQuickOpenEntryGroupTemplateData { + renderTemplate(templateId: string, container: HTMLElement, styles: IQuickOpenStyles): IQuickOpenEntryGroupTemplateData { const entryContainer = document.createElement('div'); DOM.addClass(entryContainer, 'sub-content'); container.appendChild(entryContainer); @@ -410,7 +412,7 @@ class Renderer implements IRenderer { }; } - public renderElement(entry: QuickOpenEntry, templateId: string, data: IQuickOpenEntryGroupTemplateData, styles: IQuickOpenStyles): void { + renderElement(entry: QuickOpenEntry, templateId: string, data: IQuickOpenEntryGroupTemplateData, styles: IQuickOpenStyles): void { // Action Bar if (this.actionProvider.hasActions(null, entry)) { @@ -480,7 +482,7 @@ class Renderer implements IRenderer { } } - public disposeTemplate(templateId: string, templateData: IQuickOpenEntryGroupTemplateData): void { + disposeTemplate(templateId: string, templateData: IQuickOpenEntryGroupTemplateData): void { const data = templateData as IQuickOpenEntryGroupTemplateData; data.actionBar.dispose(); data.actionBar = null; @@ -501,7 +503,8 @@ export class QuickOpenModel implements IModel, IDataSource, IFilter, - IRunner + IRunner, + IAccessiblityProvider { private _entries: QuickOpenEntry[]; private _dataSource: IDataSource; @@ -519,21 +522,21 @@ export class QuickOpenModel implements this._accessibilityProvider = this; } - public get entries() { return this._entries; } - public get dataSource() { return this._dataSource; } - public get renderer() { return this._renderer; } - public get filter() { return this._filter; } - public get runner() { return this._runner; } - public get accessibilityProvider() { return this._accessibilityProvider; } + get entries() { return this._entries; } + get dataSource() { return this._dataSource; } + get renderer() { return this._renderer; } + get filter() { return this._filter; } + get runner() { return this._runner; } + get accessibilityProvider() { return this._accessibilityProvider; } - public set entries(entries: QuickOpenEntry[]) { + set entries(entries: QuickOpenEntry[]) { this._entries = entries; } /** * Adds entries that should show up in the quick open viewer. */ - public addEntries(entries: QuickOpenEntry[]): void { + addEntries(entries: QuickOpenEntry[]): void { if (types.isArray(entries)) { this._entries = this._entries.concat(entries); } @@ -542,7 +545,7 @@ export class QuickOpenModel implements /** * Set the entries that should show up in the quick open viewer. */ - public setEntries(entries: QuickOpenEntry[]): void { + setEntries(entries: QuickOpenEntry[]): void { if (types.isArray(entries)) { this._entries = entries; } @@ -553,7 +556,7 @@ export class QuickOpenModel implements * * @visibleOnly optional parameter to only return visible entries */ - public getEntries(visibleOnly?: boolean): QuickOpenEntry[] { + getEntries(visibleOnly?: boolean): QuickOpenEntry[] { if (visibleOnly) { return this._entries.filter((e) => !e.isHidden()); } @@ -561,15 +564,15 @@ export class QuickOpenModel implements return this._entries; } - public getId(entry: QuickOpenEntry): string { + getId(entry: QuickOpenEntry): string { return entry.getId(); } - public getLabel(entry: QuickOpenEntry): string { + getLabel(entry: QuickOpenEntry): string { return entry.getLabel(); } - public getAriaLabel(entry: QuickOpenEntry): string { + getAriaLabel(entry: QuickOpenEntry): string { const ariaLabel = entry.getAriaLabel(); if (ariaLabel) { return nls.localize('quickOpenAriaLabelEntry', "{0}, picker", entry.getAriaLabel()); @@ -578,11 +581,11 @@ export class QuickOpenModel implements return nls.localize('quickOpenAriaLabel', "picker"); } - public isVisible(entry: QuickOpenEntry): boolean { + isVisible(entry: QuickOpenEntry): boolean { return !entry.isHidden(); } - public run(entry: QuickOpenEntry, mode: Mode, context: IContext): boolean { + run(entry: QuickOpenEntry, mode: Mode, context: IContext): boolean { return entry.run(mode, context); } } diff --git a/src/vs/base/parts/quickopen/browser/quickOpenViewer.ts b/src/vs/base/parts/quickopen/browser/quickOpenViewer.ts index 607d1f79f5..e267f54466 100644 --- a/src/vs/base/parts/quickopen/browser/quickOpenViewer.ts +++ b/src/vs/base/parts/quickopen/browser/quickOpenViewer.ts @@ -23,7 +23,7 @@ export class DataSource implements IDataSource { this.modelProvider = isFunction(arg.getModel) ? arg : { getModel: () => arg }; } - public getId(tree: ITree, element: any): string { + getId(tree: ITree, element: any): string { if (!element) { return null; } @@ -32,17 +32,17 @@ export class DataSource implements IDataSource { return model === element ? '__root__' : model.dataSource.getId(element); } - public hasChildren(tree: ITree, element: any): boolean { + hasChildren(tree: ITree, element: any): boolean { const model = this.modelProvider.getModel(); return model && model === element && model.entries.length > 0; } - public getChildren(tree: ITree, element: any): TPromise { + getChildren(tree: ITree, element: any): TPromise { const model = this.modelProvider.getModel(); return TPromise.as(model === element ? model.entries : []); } - public getParent(tree: ITree, element: any): TPromise { + getParent(tree: ITree, element: any): TPromise { return TPromise.as(null); } } @@ -50,18 +50,18 @@ export class DataSource implements IDataSource { export class AccessibilityProvider implements IAccessibilityProvider { constructor(private modelProvider: IModelProvider) { } - public getAriaLabel(tree: ITree, element: any): string { + getAriaLabel(tree: ITree, element: any): string { const model = this.modelProvider.getModel(); return model.accessibilityProvider && model.accessibilityProvider.getAriaLabel(element); } - public getPosInSet(tree: ITree, element: any): string { + getPosInSet(tree: ITree, element: any): string { const model = this.modelProvider.getModel(); return String(model.entries.indexOf(element) + 1); } - public getSetSize(): string { + getSetSize(): string { const model = this.modelProvider.getModel(); return String(model.entries.length); } @@ -71,7 +71,7 @@ export class Filter implements IFilter { constructor(private modelProvider: IModelProvider) { } - public isVisible(tree: ITree, element: any): boolean { + isVisible(tree: ITree, element: any): boolean { const model = this.modelProvider.getModel(); if (!model.filter) { @@ -89,31 +89,31 @@ export class Renderer implements IRenderer { this.styles = styles; } - public updateStyles(styles: IQuickOpenStyles): void { + updateStyles(styles: IQuickOpenStyles): void { this.styles = styles; } - public getHeight(tree: ITree, element: any): number { + getHeight(tree: ITree, element: any): number { const model = this.modelProvider.getModel(); return model.renderer.getHeight(element); } - public getTemplateId(tree: ITree, element: any): string { + getTemplateId(tree: ITree, element: any): string { const model = this.modelProvider.getModel(); return model.renderer.getTemplateId(element); } - public renderTemplate(tree: ITree, templateId: string, container: HTMLElement): any { + renderTemplate(tree: ITree, templateId: string, container: HTMLElement): any { const model = this.modelProvider.getModel(); return model.renderer.renderTemplate(templateId, container, this.styles); } - public renderElement(tree: ITree, element: any, templateId: string, templateData: any): void { + renderElement(tree: ITree, element: any, templateId: string, templateData: any): void { const model = this.modelProvider.getModel(); model.renderer.renderElement(element, templateId, templateData, this.styles); } - public disposeTemplate(tree: ITree, templateId: string, templateData: any): void { + disposeTemplate(tree: ITree, templateId: string, templateData: any): void { const model = this.modelProvider.getModel(); model.renderer.disposeTemplate(templateId, templateData); } diff --git a/src/vs/base/parts/quickopen/browser/quickOpenWidget.ts b/src/vs/base/parts/quickopen/browser/quickOpenWidget.ts index df7784ac7b..b18498dc87 100644 --- a/src/vs/base/parts/quickopen/browser/quickOpenWidget.ts +++ b/src/vs/base/parts/quickopen/browser/quickOpenWidget.ts @@ -22,7 +22,7 @@ import { StandardKeyboardEvent } from 'vs/base/browser/keyboardEvent'; import { DefaultController, ClickBehavior } from 'vs/base/parts/tree/browser/treeDefaults'; import * as DOM from 'vs/base/browser/dom'; import { KeyCode } from 'vs/base/common/keyCodes'; -import { IDisposable, dispose } from 'vs/base/common/lifecycle'; +import { Disposable } from 'vs/base/common/lifecycle'; import { ScrollbarVisibility } from 'vs/base/common/scrollable'; import { Color } from 'vs/base/common/color'; import { mixin } from 'vs/base/common/objects'; @@ -65,7 +65,7 @@ export interface IShowOptions { export class QuickOpenController extends DefaultController { - public onContextMenu(tree: ITree, element: any, event: ContextMenuEvent): boolean { + onContextMenu(tree: ITree, element: any, event: ContextMenuEvent): boolean { if (platform.isMacintosh) { return this.onLeftClick(tree, element, event); // https://github.com/Microsoft/vscode/issues/1011 } @@ -91,7 +91,7 @@ const defaultStyles = { const DEFAULT_INPUT_ARIA_LABEL = nls.localize('quickOpenAriaLabel', "Quick picker. Type to narrow down results."); -export class QuickOpenWidget implements IModelProvider { +export class QuickOpenWidget extends Disposable implements IModelProvider { private static readonly MAX_WIDTH = 600; // Max total width of quick open widget private static readonly MAX_ITEMS_HEIGHT = 20 * 22; // Max height of item list below input field @@ -103,12 +103,12 @@ export class QuickOpenWidget implements IModelProvider { private inputBox: InputBox; private inputContainer: Builder; private helpText: Builder; + private resultCount: Builder; private treeContainer: Builder; private progressBar: ProgressBar; private visible: boolean; private isLoosingFocus: boolean; private callbacks: IQuickOpenCallbacks; - private toUnbind: IDisposable[]; private quickNavigateConfiguration: IQuickNavigateConfiguration; private container: HTMLElement; private treeElement: HTMLElement; @@ -120,8 +120,9 @@ export class QuickOpenWidget implements IModelProvider { private renderer: Renderer; constructor(container: HTMLElement, callbacks: IQuickOpenCallbacks, options: IQuickOpenOptions) { + super(); + this.isDisposed = false; - this.toUnbind = []; this.container = container; this.callbacks = callbacks; this.options = options; @@ -130,19 +131,19 @@ export class QuickOpenWidget implements IModelProvider { this.model = null; } - public getElement(): HTMLElement { + getElement(): HTMLElement { return $(this.builder).getHTMLElement(); } - public getModel(): IModel { + getModel(): IModel { return this.model; } - public setCallbacks(callbacks: IQuickOpenCallbacks): void { + setCallbacks(callbacks: IQuickOpenCallbacks): void { this.callbacks = callbacks; } - public create(): HTMLElement { + create(): HTMLElement { this.builder = $().div(div => { // Eventing @@ -152,6 +153,15 @@ export class QuickOpenWidget implements IModelProvider { DOM.EventHelper.stop(e, true); this.hide(HideReason.CANCELED); + } else if (keyboardEvent.keyCode === KeyCode.Tab && !keyboardEvent.altKey && !keyboardEvent.ctrlKey && !keyboardEvent.metaKey) { + const stops = e.currentTarget.querySelectorAll('input, .monaco-tree, .monaco-tree-row.focused .action-label.icon'); + if (keyboardEvent.shiftKey && keyboardEvent.target === stops[0]) { + DOM.EventHelper.stop(e, true); + stops[stops.length - 1].focus(); + } else if (!keyboardEvent.shiftKey && keyboardEvent.target === stops[stops.length - 1]) { + DOM.EventHelper.stop(e, true); + stops[0].focus(); + } } }) .on(DOM.EventType.CONTEXT_MENU, (e: Event) => DOM.EventHelper.stop(e, true)) // Do this to fix an issue on Mac where the menu goes into the way @@ -159,13 +169,13 @@ export class QuickOpenWidget implements IModelProvider { .on(DOM.EventType.BLUR, (e: FocusEvent) => this.loosingFocus(e), null, true); // Progress Bar - this.progressBar = new ProgressBar(div.clone(), { progressBarBackground: this.styles.progressBarBackground }); + this.progressBar = this._register(new ProgressBar(div.clone(), { progressBarBackground: this.styles.progressBarBackground })); this.progressBar.hide(); // Input Field div.div({ 'class': 'quick-open-input' }, inputContainer => { this.inputContainer = inputContainer; - this.inputBox = new InputBox(inputContainer.getHTMLElement(), null, { + this.inputBox = this._register(new InputBox(inputContainer.getHTMLElement(), null, { placeholder: this.options.inputPlaceHolder || '', ariaLabel: DEFAULT_INPUT_ARIA_LABEL, inputBackground: this.styles.inputBackground, @@ -177,7 +187,7 @@ export class QuickOpenWidget implements IModelProvider { inputValidationWarningBorder: this.styles.inputValidationWarningBorder, inputValidationErrorBackground: this.styles.inputValidationErrorBackground, inputValidationErrorBorder: this.styles.inputValidationErrorBorder - }); + })); // ARIA this.inputElement = this.inputBox.inputElement; @@ -223,13 +233,19 @@ export class QuickOpenWidget implements IModelProvider { }); }); + // Result count for screen readers + this.resultCount = div.div({ + 'class': 'quick-open-result-count', + 'aria-live': 'polite' + }).clone(); + // Tree this.treeContainer = div.div({ 'class': 'quick-open-tree' }, div => { const createTree = this.options.treeCreator || ((container, config, opts) => new Tree(container, config, opts)); - this.tree = createTree(div.getHTMLElement(), { + this.tree = this._register(createTree(div.getHTMLElement(), { dataSource: new DataSource(this), controller: new QuickOpenController({ clickBehavior: ClickBehavior.ON_MOUSE_UP, keyboardSupport: this.options.keyboardSupport }), renderer: (this.renderer = new Renderer(this, this.styles)), @@ -243,17 +259,17 @@ export class QuickOpenWidget implements IModelProvider { horizontalScrollMode: ScrollbarVisibility.Hidden, ariaLabel: nls.localize('treeAriaLabel', "Quick Picker"), keyboardSupport: this.options.keyboardSupport, - preventRootFocus: true - }); + preventRootFocus: false + })); this.treeElement = this.tree.getHTMLElement(); // Handle Focus and Selection event - this.toUnbind.push(this.tree.onDidChangeFocus(event => { + this._register(this.tree.onDidChangeFocus(event => { this.elementFocused(event.focus, event); })); - this.toUnbind.push(this.tree.onDidChangeSelection(event => { + this._register(this.tree.onDidChangeSelection(event => { if (event.selection && event.selection.length > 0) { const mouseEvent: StandardMouseEvent = event.payload && event.payload.originalEvent instanceof StandardMouseEvent ? event.payload.originalEvent : void 0; const shouldOpenInBackground = mouseEvent ? this.shouldOpenInBackground(mouseEvent) : false; @@ -348,13 +364,13 @@ export class QuickOpenWidget implements IModelProvider { if (keyboardEvent.keyCode === KeyCode.DownArrow || keyboardEvent.keyCode === KeyCode.UpArrow || keyboardEvent.keyCode === KeyCode.PageDown || keyboardEvent.keyCode === KeyCode.PageUp) { DOM.EventHelper.stop(e, true); this.navigateInTree(keyboardEvent.keyCode, keyboardEvent.shiftKey); - this.inputBox.inputElement.focus(); + this.treeElement.focus(); } }); return this.builder.getHTMLElement(); } - public style(styles: IQuickOpenStyles): void { + style(styles: IQuickOpenStyles): void { this.styles = styles; this.applyStyles(); @@ -442,7 +458,7 @@ export class QuickOpenWidget implements IModelProvider { this.callbacks.onType(value); } - public navigate(next: boolean, quickNavigate?: IQuickNavigateConfiguration): void { + navigate(next: boolean, quickNavigate?: IQuickNavigateConfiguration): void { if (this.isVisible()) { // Transition into quick navigate mode if not yet done @@ -548,9 +564,9 @@ export class QuickOpenWidget implements IModelProvider { }; } - public show(prefix: string, options?: IShowOptions): void; - public show(input: IModel, options?: IShowOptions): void; - public show(param: any, options?: IShowOptions): void { + show(prefix: string, options?: IShowOptions): void; + show(input: IModel, options?: IShowOptions): void; + show(param: any, options?: IShowOptions): void { this.visible = true; this.isLoosingFocus = false; this.quickNavigateConfiguration = options ? options.quickNavigateConfiguration : void 0; @@ -619,9 +635,12 @@ export class QuickOpenWidget implements IModelProvider { // Indicate entries to tree this.tree.layout(); + const entries = input ? input.entries.filter(e => this.isElementVisible(input, e)) : []; + this.updateResultCount(entries.length); + // Handle auto focus - if (input && input.entries.some(e => this.isElementVisible(input, e))) { - this.autoFocus(input, autoFocus); + if (entries.length) { + this.autoFocus(input, entries, autoFocus); } }, errors.onUnexpectedError); } @@ -634,8 +653,7 @@ export class QuickOpenWidget implements IModelProvider { return input.filter.isVisible(e); } - private autoFocus(input: IModel, autoFocus: IAutoFocus = {}): void { - const entries = input.entries.filter(e => this.isElementVisible(input, e)); + private autoFocus(input: IModel, entries: any[], autoFocus: IAutoFocus = {}): void { // First check for auto focus of prefix matches if (autoFocus.autoFocusPrefixMatch) { @@ -696,7 +714,7 @@ export class QuickOpenWidget implements IModelProvider { } } - public refresh(input?: IModel, autoFocus?: IAutoFocus): void { + refresh(input?: IModel, autoFocus?: IAutoFocus): void { if (!this.isVisible()) { return; } @@ -716,11 +734,13 @@ export class QuickOpenWidget implements IModelProvider { // Indicate entries to tree this.tree.layout(); + const entries = input ? input.entries.filter(e => this.isElementVisible(input, e)) : []; + this.updateResultCount(entries.length); + // Handle auto focus if (autoFocus) { - let doAutoFocus = autoFocus && input && input.entries.some(e => this.isElementVisible(input, e)); - if (doAutoFocus) { - this.autoFocus(input, autoFocus); + if (entries.length) { + this.autoFocus(input, entries, autoFocus); } } }, errors.onUnexpectedError); @@ -760,7 +780,11 @@ export class QuickOpenWidget implements IModelProvider { return height; } - public hide(reason?: HideReason): void { + updateResultCount(count: number) { + this.resultCount.text(nls.localize({ key: 'quickInput.visibleCount', comment: ['This tells the user how many items are shown in a list of items to select from. The items can be anything. Currently not visible, but read by screen readers.'] }, "{0} Results", count)); + } + + hide(reason?: HideReason): void { if (!this.isVisible()) { return; } @@ -801,17 +825,17 @@ export class QuickOpenWidget implements IModelProvider { } } - public getQuickNavigateConfiguration(): IQuickNavigateConfiguration { + getQuickNavigateConfiguration(): IQuickNavigateConfiguration { return this.quickNavigateConfiguration; } - public setPlaceHolder(placeHolder: string): void { + setPlaceHolder(placeHolder: string): void { if (this.inputBox) { this.inputBox.setPlaceHolder(placeHolder); } } - public setValue(value: string, selectionOrStableHint?: [number, number] | null): void { + setValue(value: string, selectionOrStableHint?: [number, number] | null): void { if (this.inputBox) { this.inputBox.value = value; if (selectionOrStableHint === null) { @@ -825,13 +849,13 @@ export class QuickOpenWidget implements IModelProvider { } } - public setPassword(isPassword: boolean): void { + setPassword(isPassword: boolean): void { if (this.inputBox) { this.inputBox.inputElement.type = isPassword ? 'password' : 'text'; } } - public setInput(input: IModel, autoFocus: IAutoFocus, ariaLabel?: string): void { + setInput(input: IModel, autoFocus: IAutoFocus, ariaLabel?: string): void { if (!this.isVisible()) { return; } @@ -864,29 +888,29 @@ export class QuickOpenWidget implements IModelProvider { }, 500); } - public getInput(): IModel { + getInput(): IModel { return this.tree.getInput(); } - public showInputDecoration(decoration: Severity): void { + showInputDecoration(decoration: Severity): void { if (this.inputBox) { this.inputBox.showMessage({ type: decoration === Severity.Info ? MessageType.INFO : decoration === Severity.Warning ? MessageType.WARNING : MessageType.ERROR, content: '' }); } } - public clearInputDecoration(): void { + clearInputDecoration(): void { if (this.inputBox) { this.inputBox.hideMessage(); } } - public focus(): void { + focus(): void { if (this.isVisible() && this.inputBox) { this.inputBox.focus(); } } - public accept(): void { + accept(): void { if (this.isVisible()) { const focus = this.tree.getFocus(); if (focus) { @@ -895,15 +919,15 @@ export class QuickOpenWidget implements IModelProvider { } } - public getProgressBar(): ProgressBar { + getProgressBar(): ProgressBar { return this.progressBar; } - public getInputBox(): InputBox { + getInputBox(): InputBox { return this.inputBox; } - public setExtraClass(clazz: string): void { + setExtraClass(clazz: string): void { const previousClass = this.builder.getProperty('extra-class'); if (previousClass) { this.builder.removeClass(previousClass); @@ -917,11 +941,11 @@ export class QuickOpenWidget implements IModelProvider { } } - public isVisible(): boolean { + isVisible(): boolean { return this.visible; } - public layout(dimension: DOM.Dimension): void { + layout(dimension: DOM.Dimension): void { this.layoutDimensions = dimension; // Apply to quick open width (height is dynamic by number of items to show) @@ -971,12 +995,9 @@ export class QuickOpenWidget implements IModelProvider { }); } - public dispose(): void { - this.isDisposed = true; - this.toUnbind = dispose(this.toUnbind); + dispose(): void { + super.dispose(); - this.progressBar.dispose(); - this.inputBox.dispose(); - this.tree.dispose(); + this.isDisposed = true; } } diff --git a/src/vs/base/parts/quickopen/browser/quickopen.css b/src/vs/base/parts/quickopen/browser/quickopen.css index 17db2704bb..c0aa02169e 100644 --- a/src/vs/base/parts/quickopen/browser/quickopen.css +++ b/src/vs/base/parts/quickopen/browser/quickopen.css @@ -35,6 +35,11 @@ height: 25px; } +.monaco-quick-open-widget .quick-open-result-count { + position: absolute; + left: -10000px; +} + .monaco-quick-open-widget .quick-open-tree { line-height: 22px; } diff --git a/src/vs/base/parts/tree/browser/tree.ts b/src/vs/base/parts/tree/browser/tree.ts index de1b8e7426..064c33341f 100644 --- a/src/vs/base/parts/tree/browser/tree.ts +++ b/src/vs/base/parts/tree/browser/tree.ts @@ -25,6 +25,7 @@ export interface ITree { onDidExpandItem: Event; onDidCollapseItem: Event; onDidDispose: Event; + onDidScroll: Event; /** * Returns the tree's DOM element. @@ -108,13 +109,6 @@ export interface ITree { */ collapseAll(elements?: any[], recursive?: boolean): WinJS.Promise; - /** - * Collapses several elements. - * Collapses all elements at the greatest tree depth that has expanded elements. - * The returned promise returns a boolean for whether the elements were collapsed or not. - */ - collapseDeepestExpandedLevel(): WinJS.Promise; - /** * Toggles an element's expansion state. */ @@ -148,6 +142,11 @@ export interface ITree { */ getRelativeTop(element: any): number; + /** + * Returns the top-most visible element. + */ + getFirstVisibleElement(): any; + /** * Returns a number between 0 and 1 representing how much the tree is scroll down. 0 means all the way * to the top; 1 means all the way down. @@ -695,6 +694,7 @@ export interface ITreeOptions extends ITreeStyles { ariaLabel?: string; keyboardSupport?: boolean; preventRootFocus?: boolean; + showLoading?: boolean; } export interface ITreeStyler { diff --git a/src/vs/base/parts/tree/browser/treeDefaults.ts b/src/vs/base/parts/tree/browser/treeDefaults.ts index 64f2793361..0987603da4 100644 --- a/src/vs/base/parts/tree/browser/treeDefaults.ts +++ b/src/vs/base/parts/tree/browser/treeDefaults.ts @@ -14,7 +14,7 @@ import * as dom from 'vs/base/browser/dom'; import * as mouse from 'vs/base/browser/mouseEvent'; import { IKeyboardEvent } from 'vs/base/browser/keyboardEvent'; import * as _ from 'vs/base/parts/tree/browser/tree'; -import { KeyCode, KeyMod, Keybinding, createKeybinding, SimpleKeybinding } from 'vs/base/common/keyCodes'; +import { KeyCode, KeyMod, Keybinding, createKeybinding, SimpleKeybinding, createSimpleKeybinding } from 'vs/base/common/keyCodes'; export interface IKeyBindingCallback { (tree: _.ITree, event: IKeyboardEvent): void; @@ -62,7 +62,17 @@ export class KeybindingDispatcher { this._arr = []; } - public set(keybinding: number, callback: IKeyBindingCallback) { + public has(keybinding: KeyCode): boolean { + let target = createSimpleKeybinding(keybinding, platform.OS); + for (const a of this._arr) { + if (target.equals(a.keybinding)) { + return true; + } + } + return false; + } + + public set(keybinding: KeyCode, callback: IKeyBindingCallback) { this._arr.push({ keybinding: createKeybinding(keybinding, platform.OS), callback: callback @@ -124,6 +134,10 @@ export class DefaultController implements _.IController { return false; // Ignore event if target is a form input field (avoids browser specific issues) } + if (dom.findParentWithClass(event.target, 'scrollbar', 'monaco-tree')) { + return false; + } + if (dom.findParentWithClass(event.target, 'monaco-action-bar', 'row')) { // TODO@Joao not very nice way of checking for the action bar (implicit knowledge) return false; // Ignore event if target is over an action bar of the row } @@ -158,17 +172,16 @@ export class DefaultController implements _.IController { } protected onLeftClick(tree: _.ITree, element: any, eventish: ICancelableEvent, origin: string = 'mouse'): boolean { - const payload = { origin: origin, originalEvent: eventish }; const event = eventish; - const isDoubleClick = (origin === 'mouse' && event.detail === 2); + const payload = { origin: origin, originalEvent: eventish, didClickOnTwistie: this.isClickOnTwistie(event) }; if (tree.getInput() === element) { tree.clearFocus(payload); tree.clearSelection(payload); } else { - const isMouseDown = eventish && event.browserEvent && event.browserEvent.type === 'mousedown'; - if (!isMouseDown) { - eventish.preventDefault(); // we cannot preventDefault onMouseDown because this would break DND otherwise + const isSingleMouseDown = eventish && event.browserEvent && event.browserEvent.type === 'mousedown' && event.browserEvent.detail === 1; + if (!isSingleMouseDown) { + eventish.preventDefault(); // we cannot preventDefault onMouseDown with single click because this would break DND otherwise } eventish.stopPropagation(); @@ -176,7 +189,7 @@ export class DefaultController implements _.IController { tree.setSelection([element], payload); tree.setFocus(element, payload); - if (this.openOnSingleClick || isDoubleClick || this.isClickOnTwistie(event)) { + if (this.shouldToggleExpansion(element, event, origin)) { if (tree.isExpanded(element)) { tree.collapse(element).done(null, errors.onUnexpectedError); } else { @@ -188,6 +201,11 @@ export class DefaultController implements _.IController { return true; } + protected shouldToggleExpansion(element: any, event: mouse.IMouseEvent, origin: string): boolean { + const isDoubleClick = (origin === 'mouse' && event.detail === 2); + return this.openOnSingleClick || isDoubleClick || this.isClickOnTwistie(event); + } + protected setOpenMode(openMode: OpenMode) { this.options.openMode = openMode; } @@ -197,13 +215,20 @@ export class DefaultController implements _.IController { } protected isClickOnTwistie(event: mouse.IMouseEvent): boolean { - const target = event.target as HTMLElement; + let element = event.target as HTMLElement; - // There is no way to find out if the ::before element is clicked where - // the twistie is drawn, but the
    element in the - // tree item is the only thing we get back as target when the user clicks - // on the twistie. - return target && target.className === 'content' && dom.hasClass(target.parentElement, 'monaco-tree-row'); + if (!dom.hasClass(element, 'content')) { + return false; + } + + const twistieStyle = window.getComputedStyle(element, ':before'); + + if (twistieStyle.backgroundImage === 'none' || twistieStyle.display === 'none') { + return false; + } + + const twistieWidth = parseInt(twistieStyle.width) + parseInt(twistieStyle.paddingRight); + return event.browserEvent.offsetX <= twistieWidth; } public onContextMenu(tree: _.ITree, element: any, event: _.ContextMenuEvent): boolean { diff --git a/src/vs/base/parts/tree/browser/treeImpl.ts b/src/vs/base/parts/tree/browser/treeImpl.ts index 2170e0c6b9..9967ae80e7 100644 --- a/src/vs/base/parts/tree/browser/treeImpl.ts +++ b/src/vs/base/parts/tree/browser/treeImpl.ts @@ -92,6 +92,7 @@ export class Tree implements _.ITree { options.alwaysFocused = options.alwaysFocused === true ? true : false; options.useShadows = options.useShadows === false ? false : true; options.paddingOnRow = options.paddingOnRow === false ? false : true; + options.showLoading = options.showLoading === false ? false : true; this.context = new TreeContext(this, configuration, options); this.model = new Model.TreeModel(this.context); @@ -118,6 +119,10 @@ export class Tree implements _.ITree { return this.view && this.view.onDOMBlur; } + get onDidScroll(): Event { + return this.view && this.view.onDidScroll; + } + public getHTMLElement(): HTMLElement { return this.view.getHTMLElement(); } @@ -179,10 +184,6 @@ export class Tree implements _.ITree { return this.model.collapseAll(elements, recursive); } - public collapseDeepestExpandedLevel(): WinJS.Promise { - return this.model.collapseDeepestExpandedLevel(); - } - public toggleExpansion(element: any, recursive: boolean = false): WinJS.Promise { return this.model.toggleExpansion(element, recursive); } @@ -208,6 +209,11 @@ export class Tree implements _.ITree { return this.view.getRelativeTop(item); } + public getFirstVisibleElement(): any { + return this.view.getFirstVisibleElement(); + + } + public getScrollPosition(): number { return this.view.getScrollPosition(); } diff --git a/src/vs/base/parts/tree/browser/treeModel.ts b/src/vs/base/parts/tree/browser/treeModel.ts index 4802c70cff..2aa115ed62 100644 --- a/src/vs/base/parts/tree/browser/treeModel.ts +++ b/src/vs/base/parts/tree/browser/treeModel.ts @@ -507,6 +507,7 @@ export class Item { return child.doRefresh(recursive, true); })); } else { + this.mapEachChild(child => child.updateVisibility()); return WinJS.TPromise.as(null); } }); @@ -522,13 +523,17 @@ export class Item { private doRefresh(recursive: boolean, safe: boolean = false): WinJS.Promise { this.doesHaveChildren = this.context.dataSource.hasChildren(this.context.tree, this.element); this.height = this._getHeight(); - this.setVisible(this._isVisible()); + this.updateVisibility(); this._onDidRefresh.fire(this); return this.refreshChildren(recursive, safe); } + private updateVisibility(): void { + this.setVisible(this._isVisible()); + } + public refresh(recursive: boolean): WinJS.Promise { return this.doRefresh(recursive); } @@ -554,17 +559,6 @@ export class Item { return result; } - public getChildren(): Item[] { - var child = this.firstChild; - var results = []; - while (child) { - results.push(child); - child = child.next; - } - - return results; - } - private isAncestorOf(item: Item): boolean { while (item) { if (item.id === this.id) { @@ -1035,27 +1029,6 @@ export class TreeModel { return WinJS.Promise.join(promises); } - public collapseDeepestExpandedLevel(): WinJS.Promise { - var levelToCollapse = this.findDeepestExpandedLevel(this.input, 0); - - var items = [this.input]; - for (var i = 0; i < levelToCollapse; i++) { - items = arrays.flatten(items.map(node => node.getChildren())); - } - - var promises = items.map(child => this.collapse(child, false)); - return WinJS.Promise.join(promises); - } - - private findDeepestExpandedLevel(item: Item, currentLevel: number): number { - var expandedChildren = item.getChildren().filter(child => child.isExpanded()); - if (!expandedChildren.length) { - return currentLevel; - } - - return Math.max(...expandedChildren.map(child => this.findDeepestExpandedLevel(child, currentLevel + 1))); - } - public toggleExpansion(element: any, recursive: boolean = false): WinJS.Promise { return this.isExpanded(element) ? this.collapse(element, recursive) : this.expand(element); } diff --git a/src/vs/base/parts/tree/browser/treeUtils.ts b/src/vs/base/parts/tree/browser/treeUtils.ts new file mode 100644 index 0000000000..5d7e63424a --- /dev/null +++ b/src/vs/base/parts/tree/browser/treeUtils.ts @@ -0,0 +1,37 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the Source EULA. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +'use strict'; + +import * as _ from 'vs/base/parts/tree/browser/tree'; + +export function collapseAll(tree: _.ITree, except?: any): void { + const nav = tree.getNavigator(); + let cur; + while (cur = nav.next()) { + if (!except || !isEqualOrParent(tree, except, cur)) { + tree.collapse(cur); + } + } +} + +export function isEqualOrParent(tree: _.ITree, element: any, candidateParent: any): boolean { + const nav = tree.getNavigator(element); + + do { + if (element === candidateParent) { + return true; + } + } while (element = nav.parent()); + + return false; +} + +export function expandAll(tree: _.ITree): void { + const nav = tree.getNavigator(); + let cur; + while (cur = nav.next()) { + tree.expand(cur); + } +} diff --git a/src/vs/base/parts/tree/browser/treeView.ts b/src/vs/base/parts/tree/browser/treeView.ts index e47932f6bb..0efaca93ef 100644 --- a/src/vs/base/parts/tree/browser/treeView.ts +++ b/src/vs/base/parts/tree/browser/treeView.ts @@ -220,7 +220,7 @@ export class ViewItem implements IViewItem { this.element.removeAttribute('id'); } if (this.model.hasChildren()) { - this.element.setAttribute('aria-expanded', String(!!this.model.isExpanded())); + this.element.setAttribute('aria-expanded', String(!!this._styles['expanded'])); } else { this.element.removeAttribute('aria-expanded'); } @@ -445,6 +445,9 @@ export class TreeView extends HeightMap { private readonly _onDOMBlur: Emitter = new Emitter(); get onDOMBlur(): Event { return this._onDOMBlur.event; } + private readonly _onDidScroll: Emitter = new Emitter(); + get onDidScroll(): Event { return this._onDidScroll.event; } + constructor(context: _.ITreeContext, container: HTMLElement) { super(); @@ -510,6 +513,7 @@ export class TreeView extends HeightMap { }); this.scrollableElement.onScroll((e) => { this.render(e.scrollTop, e.height, e.scrollLeft, e.width, e.scrollWidth); + this._onDidScroll.fire(); }); if (Browser.isIE) { @@ -649,6 +653,11 @@ export class TreeView extends HeightMap { } } + public getFirstVisibleElement(): any { + const item = this.itemAtIndex(this.indexAt(this.lastRenderTop)); + return item && item.model.getElement(); + } + private render(scrollTop: number, viewHeight: number, scrollLeft: number, viewWidth: number, scrollWidth: number): void { var i: number; var stop: number; @@ -867,7 +876,7 @@ export class TreeView extends HeightMap { var item = e.item; var viewItem = this.items[item.id]; - if (viewItem) { + if (viewItem && this.context.options.showLoading) { viewItem.loadingTimer = setTimeout(() => { viewItem.loadingTimer = 0; viewItem.loading = true; @@ -915,13 +924,16 @@ export class TreeView extends HeightMap { let doToInsertItemsAlreadyExist: boolean; if (!skipDiff) { - const lcs = new Diff.LcsDiff({ - getLength: () => previousChildrenIds.length, - getElementHash: (i: number) => previousChildrenIds[i] - }, { + const lcs = new Diff.LcsDiff( + { + getLength: () => previousChildrenIds.length, + getElementAtIndex: (i: number) => previousChildrenIds[i] + }, { getLength: () => afterModelItems.length, - getElementHash: (i: number) => afterModelItems[i].id - }, null); + getElementAtIndex: (i: number) => afterModelItems[i].id + }, + null + ); diff = lcs.ComputeDiff(false); diff --git a/src/vs/base/parts/tree/test/browser/treeModel.test.ts b/src/vs/base/parts/tree/test/browser/treeModel.test.ts index 0fe88e0d52..6bb198da29 100644 --- a/src/vs/base/parts/tree/test/browser/treeModel.test.ts +++ b/src/vs/base/parts/tree/test/browser/treeModel.test.ts @@ -613,23 +613,6 @@ suite('TreeModel - Expansion', () => { }); }); - test('collapseDeepestExpandedLevel', () => { - return model.setInput(SAMPLE.DEEP2).then(() => { - return model.expand(SAMPLE.DEEP2.children[0]).then(() => { - return model.expand(SAMPLE.DEEP2.children[0].children[0]).then(() => { - - assert(model.isExpanded(SAMPLE.DEEP2.children[0])); - assert(model.isExpanded(SAMPLE.DEEP2.children[0].children[0])); - - return model.collapseDeepestExpandedLevel().then(() => { - assert(model.isExpanded(SAMPLE.DEEP2.children[0])); - assert(!model.isExpanded(SAMPLE.DEEP2.children[0].children[0])); - }); - }); - }); - }); - }); - test('auto expand single child folders', () => { return model.setInput(SAMPLE.DEEP).then(() => { return model.expand(SAMPLE.DEEP.children[0]).then(() => { @@ -1695,4 +1678,42 @@ suite('TreeModel - bugs', () => { assert.equal(counter.count, 0); }); }); + + test('collapsed resolved parent should also update all children visibility on refresh', async function () { + const counter = new EventCounter(); + const dataModel = new DynamicModel(); + + let isSonVisible = true; + const filter: _.IFilter = { + isVisible(_, element) { + return element !== 'son' || isSonVisible; + } + }; + + const model = new TreeModel({ dataSource: dataModel, filter }); + + dataModel.addChild('root', 'father'); + dataModel.addChild('father', 'son'); + + await model.setInput('root'); + await model.expand('father'); + + let nav = model.getNavigator(); + assert.equal(nav.next().id, 'father'); + assert.equal(nav.next().id, 'son'); + assert.equal(nav.next(), null); + + await model.collapse('father'); + isSonVisible = false; + + await model.refresh(undefined, true); + await model.expand('father'); + + nav = model.getNavigator(); + assert.equal(nav.next().id, 'father'); + assert.equal(nav.next(), null); + + counter.dispose(); + model.dispose(); + }); }); diff --git a/src/vs/base/test/browser/builder.test.ts b/src/vs/base/test/browser/builder.test.ts index 2e3ce33a8b..0a520143a2 100644 --- a/src/vs/base/test/browser/builder.test.ts +++ b/src/vs/base/test/browser/builder.test.ts @@ -54,6 +54,7 @@ function select(builder: Builder, selector: string, offdom?: boolean): MultiBuil return new MultiBuilder(builders); } +// {{SQL CARBON EDIT}} disable broken tests suite('Builder', () => { test('Binding', function () { }); diff --git a/src/vs/base/test/browser/dom.test.ts b/src/vs/base/test/browser/dom.test.ts index 95d8a124e6..9aecc44627 100644 --- a/src/vs/base/test/browser/dom.test.ts +++ b/src/vs/base/test/browser/dom.test.ts @@ -8,6 +8,7 @@ import * as assert from 'assert'; import * as dom from 'vs/base/browser/dom'; const $ = dom.$; +// {{SQL CARBON EDIT}} disable broken tests suite('dom', () => { test('hasClass', () => { }); diff --git a/src/vs/base/test/browser/highlightedLabel.test.ts b/src/vs/base/test/browser/highlightedLabel.test.ts index c5f083fece..0f63777cf1 100644 --- a/src/vs/base/test/browser/highlightedLabel.test.ts +++ b/src/vs/base/test/browser/highlightedLabel.test.ts @@ -52,4 +52,18 @@ suite('HighlightedLabel', () => { label.set('foobarfoo', [{ start: 3, end: 6 }]); assert.equal(label.element.innerHTML, 'foobarfoo'); }); -}); \ No newline at end of file + + test('escapeNewLines', function () { + + let highlights = [{ start: 0, end: 5 }, { start: 7, end: 9 }, { start: 11, end: 12 }];// before,after,after + let escaped = HighlightedLabel.escapeNewLines('ACTION\r\n_TYPE2', highlights); + assert.equal(escaped, 'ACTION\u23CE_TYPE2'); + assert.deepEqual(highlights, [{ start: 0, end: 5 }, { start: 6, end: 8 }, { start: 10, end: 11 }]); + + highlights = [{ start: 5, end: 9 }, { start: 11, end: 12 }];//overlap,after + escaped = HighlightedLabel.escapeNewLines('ACTION\r\n_TYPE2', highlights); + assert.equal(escaped, 'ACTION\u23CE_TYPE2'); + assert.deepEqual(highlights, [{ start: 5, end: 8 }, { start: 10, end: 11 }]); + + }); +}); diff --git a/src/vs/base/test/browser/progressBar.test.ts b/src/vs/base/test/browser/progressBar.test.ts index 61c7b2e435..b73e46f942 100644 --- a/src/vs/base/test/browser/progressBar.test.ts +++ b/src/vs/base/test/browser/progressBar.test.ts @@ -24,7 +24,8 @@ suite('ProgressBar', () => { assert(bar.infinite()); assert(bar.total(100)); assert(bar.worked(50)); - assert(bar.worked(50)); + assert(bar.setWorked(70)); + assert(bar.worked(30)); assert(bar.done()); bar.dispose(); diff --git a/src/vs/base/test/browser/ui/contextview/contextview.test.ts b/src/vs/base/test/browser/ui/contextview/contextview.test.ts new file mode 100644 index 0000000000..d30d349ad4 --- /dev/null +++ b/src/vs/base/test/browser/ui/contextview/contextview.test.ts @@ -0,0 +1,28 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the Source EULA. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import * as assert from 'assert'; +import { layout, LayoutAnchorPosition } from 'vs/base/browser/ui/contextview/contextview'; + +suite('Contextview', function () { + + test('layout', function () { + assert.equal(layout(200, 20, { offset: 0, size: 0, position: LayoutAnchorPosition.Before }), 0); + assert.equal(layout(200, 20, { offset: 50, size: 0, position: LayoutAnchorPosition.Before }), 50); + assert.equal(layout(200, 20, { offset: 200, size: 0, position: LayoutAnchorPosition.Before }), 180); + + assert.equal(layout(200, 20, { offset: 0, size: 0, position: LayoutAnchorPosition.After }), 0); + assert.equal(layout(200, 20, { offset: 50, size: 0, position: LayoutAnchorPosition.After }), 30); + assert.equal(layout(200, 20, { offset: 200, size: 0, position: LayoutAnchorPosition.After }), 180); + + assert.equal(layout(200, 20, { offset: 0, size: 50, position: LayoutAnchorPosition.Before }), 50); + assert.equal(layout(200, 20, { offset: 50, size: 50, position: LayoutAnchorPosition.Before }), 100); + assert.equal(layout(200, 20, { offset: 150, size: 50, position: LayoutAnchorPosition.Before }), 130); + + assert.equal(layout(200, 20, { offset: 0, size: 50, position: LayoutAnchorPosition.After }), 50); + assert.equal(layout(200, 20, { offset: 50, size: 50, position: LayoutAnchorPosition.After }), 30); + assert.equal(layout(200, 20, { offset: 150, size: 50, position: LayoutAnchorPosition.After }), 130); + }); +}); diff --git a/src/vs/base/test/browser/ui/grid/grid.test.ts b/src/vs/base/test/browser/ui/grid/grid.test.ts new file mode 100644 index 0000000000..cdd8043c68 --- /dev/null +++ b/src/vs/base/test/browser/ui/grid/grid.test.ts @@ -0,0 +1,12 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the Source EULA. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import * as assert from 'assert'; + +suite('Grid', function () { + test('getRelativeLocation', function () { + assert.equal(0, 0); + }); +}); diff --git a/src/vs/base/test/browser/ui/grid/gridview.test.ts b/src/vs/base/test/browser/ui/grid/gridview.test.ts new file mode 100644 index 0000000000..e23aea246f --- /dev/null +++ b/src/vs/base/test/browser/ui/grid/gridview.test.ts @@ -0,0 +1,230 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the Source EULA. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import * as assert from 'assert'; +import { $ } from 'vs/base/browser/dom'; +import { GridView, IView, Sizing } from 'vs/base/browser/ui/grid/gridview'; +import { nodesToArrays, TestView } from './util'; + +suite('Gridview', function () { + let gridview: GridView; + + setup(function () { + gridview = new GridView(); + const container = $('.container'); + + container.style.position = 'absolute'; + container.style.width = `${200}px`; + container.style.height = `${200}px`; + container.appendChild(gridview.element); + }); + + teardown(function () { + gridview = null; + }); + + test('empty gridview is empty', function () { + assert.deepEqual(nodesToArrays(gridview.getViews()), []); + gridview.dispose(); + }); + + test('gridview addView', function () { + + const view = new TestView(20, 20, 20, 20); + assert.throws(() => gridview.addView(view, 200, []), 'empty location'); + assert.throws(() => gridview.addView(view, 200, [1]), 'index overflow'); + assert.throws(() => gridview.addView(view, 200, [0, 0]), 'hierarchy overflow'); + + const views = [ + new TestView(20, 20, 20, 20), + new TestView(20, 20, 20, 20), + new TestView(20, 20, 20, 20) + ]; + + gridview.addView(views[0], 200, [0]); + gridview.addView(views[1], 200, [1]); + gridview.addView(views[2], 200, [2]); + + assert.deepEqual(nodesToArrays(gridview.getViews()), views); + + gridview.dispose(); + }); + + test('gridview addView nested', function () { + + const views = [ + new TestView(20, 20, 20, 20), + [ + new TestView(20, 20, 20, 20), + new TestView(20, 20, 20, 20) + ] + ]; + + gridview.addView(views[0] as IView, 200, [0]); + gridview.addView(views[1][0] as IView, 200, [1]); + gridview.addView(views[1][1] as IView, 200, [1, 1]); + + assert.deepEqual(nodesToArrays(gridview.getViews()), views); + + gridview.dispose(); + }); + + test('gridview addView deep nested', function () { + + const view1 = new TestView(20, 20, 20, 20); + gridview.addView(view1 as IView, 200, [0]); + assert.deepEqual(nodesToArrays(gridview.getViews()), [view1]); + + const view2 = new TestView(20, 20, 20, 20); + gridview.addView(view2 as IView, 200, [1]); + assert.deepEqual(nodesToArrays(gridview.getViews()), [view1, view2]); + + const view3 = new TestView(20, 20, 20, 20); + gridview.addView(view3 as IView, 200, [1, 0]); + assert.deepEqual(nodesToArrays(gridview.getViews()), [view1, [view3, view2]]); + + const view4 = new TestView(20, 20, 20, 20); + gridview.addView(view4 as IView, 200, [1, 0, 0]); + assert.deepEqual(nodesToArrays(gridview.getViews()), [view1, [[view4, view3], view2]]); + + const view5 = new TestView(20, 20, 20, 20); + gridview.addView(view5 as IView, 200, [1, 0]); + assert.deepEqual(nodesToArrays(gridview.getViews()), [view1, [view5, [view4, view3], view2]]); + + const view6 = new TestView(20, 20, 20, 20); + gridview.addView(view6 as IView, 200, [2]); + assert.deepEqual(nodesToArrays(gridview.getViews()), [view1, [view5, [view4, view3], view2], view6]); + + const view7 = new TestView(20, 20, 20, 20); + gridview.addView(view7 as IView, 200, [1, 1]); + assert.deepEqual(nodesToArrays(gridview.getViews()), [view1, [view5, view7, [view4, view3], view2], view6]); + + const view8 = new TestView(20, 20, 20, 20); + gridview.addView(view8 as IView, 200, [1, 1, 0]); + assert.deepEqual(nodesToArrays(gridview.getViews()), [view1, [view5, [view8, view7], [view4, view3], view2], view6]); + + gridview.dispose(); + }); + + test('simple layout', function () { + gridview.layout(800, 600); + + const view1 = new TestView(50, Number.MAX_VALUE, 50, Number.MAX_VALUE); + gridview.addView(view1, 200, [0]); + assert.deepEqual(view1.size, [800, 600]); + assert.deepEqual(gridview.getViewSize([0]), { width: 800, height: 600 }); + + const view2 = new TestView(50, Number.MAX_VALUE, 50, Number.MAX_VALUE); + gridview.addView(view2, 200, [0]); + assert.deepEqual(view1.size, [800, 400]); + assert.deepEqual(gridview.getViewSize([1]), { width: 800, height: 400 }); + assert.deepEqual(view2.size, [800, 200]); + assert.deepEqual(gridview.getViewSize([0]), { width: 800, height: 200 }); + + const view3 = new TestView(50, Number.MAX_VALUE, 50, Number.MAX_VALUE); + gridview.addView(view3, 200, [1, 1]); + assert.deepEqual(view1.size, [600, 400]); + assert.deepEqual(gridview.getViewSize([1, 0]), { width: 600, height: 400 }); + assert.deepEqual(view2.size, [800, 200]); + assert.deepEqual(gridview.getViewSize([0]), { width: 800, height: 200 }); + assert.deepEqual(view3.size, [200, 400]); + assert.deepEqual(gridview.getViewSize([1, 1]), { width: 200, height: 400 }); + + const view4 = new TestView(50, Number.MAX_VALUE, 50, Number.MAX_VALUE); + gridview.addView(view4, 200, [0, 0]); + assert.deepEqual(view1.size, [600, 400]); + assert.deepEqual(gridview.getViewSize([1, 0]), { width: 600, height: 400 }); + assert.deepEqual(view2.size, [600, 200]); + assert.deepEqual(gridview.getViewSize([0, 1]), { width: 600, height: 200 }); + assert.deepEqual(view3.size, [200, 400]); + assert.deepEqual(gridview.getViewSize([1, 1]), { width: 200, height: 400 }); + assert.deepEqual(view4.size, [200, 200]); + assert.deepEqual(gridview.getViewSize([0, 0]), { width: 200, height: 200 }); + + const view5 = new TestView(50, Number.MAX_VALUE, 50, Number.MAX_VALUE); + gridview.addView(view5, 100, [1, 0, 1]); + assert.deepEqual(view1.size, [600, 300]); + assert.deepEqual(gridview.getViewSize([1, 0, 0]), { width: 600, height: 300 }); + assert.deepEqual(view2.size, [600, 200]); + assert.deepEqual(gridview.getViewSize([0, 1]), { width: 600, height: 200 }); + assert.deepEqual(view3.size, [200, 400]); + assert.deepEqual(gridview.getViewSize([1, 1]), { width: 200, height: 400 }); + assert.deepEqual(view4.size, [200, 200]); + assert.deepEqual(gridview.getViewSize([0, 0]), { width: 200, height: 200 }); + assert.deepEqual(view5.size, [600, 100]); + assert.deepEqual(gridview.getViewSize([1, 0, 1]), { width: 600, height: 100 }); + }); + + test('simple layout with automatic size distribution', function () { + gridview.layout(800, 600); + + const view1 = new TestView(50, Number.MAX_VALUE, 50, Number.MAX_VALUE); + gridview.addView(view1, Sizing.Distribute, [0]); + assert.deepEqual(view1.size, [800, 600]); + assert.deepEqual(gridview.getViewSize([0]), { width: 800, height: 600 }); + + const view2 = new TestView(50, Number.MAX_VALUE, 50, Number.MAX_VALUE); + gridview.addView(view2, Sizing.Distribute, [0]); + assert.deepEqual(view1.size, [800, 300]); + assert.deepEqual(view2.size, [800, 300]); + + const view3 = new TestView(50, Number.MAX_VALUE, 50, Number.MAX_VALUE); + gridview.addView(view3, Sizing.Distribute, [1, 1]); + assert.deepEqual(view1.size, [400, 300]); + assert.deepEqual(view2.size, [800, 300]); + assert.deepEqual(view3.size, [400, 300]); + + const view4 = new TestView(50, Number.MAX_VALUE, 50, Number.MAX_VALUE); + gridview.addView(view4, Sizing.Distribute, [0, 0]); + assert.deepEqual(view1.size, [400, 300]); + assert.deepEqual(view2.size, [400, 300]); + assert.deepEqual(view3.size, [400, 300]); + assert.deepEqual(view4.size, [400, 300]); + + const view5 = new TestView(50, Number.MAX_VALUE, 50, Number.MAX_VALUE); + gridview.addView(view5, Sizing.Distribute, [1, 0, 1]); + assert.deepEqual(view1.size, [400, 150]); + assert.deepEqual(view2.size, [400, 300]); + assert.deepEqual(view3.size, [400, 300]); + assert.deepEqual(view4.size, [400, 300]); + assert.deepEqual(view5.size, [400, 150]); + }); + + test('addviews before layout call 1', function () { + + const view1 = new TestView(50, Number.MAX_VALUE, 50, Number.MAX_VALUE); + gridview.addView(view1, 200, [0]); + + const view2 = new TestView(50, Number.MAX_VALUE, 50, Number.MAX_VALUE); + gridview.addView(view2, 200, [0]); + + const view3 = new TestView(50, Number.MAX_VALUE, 50, Number.MAX_VALUE); + gridview.addView(view3, 200, [1, 1]); + + gridview.layout(800, 600); + + assert.deepEqual(view1.size, [400, 300]); + assert.deepEqual(view2.size, [800, 300]); + assert.deepEqual(view3.size, [400, 300]); + }); + + test('addviews before layout call 2', function () { + + const view1 = new TestView(50, Number.MAX_VALUE, 50, Number.MAX_VALUE); + gridview.addView(view1, 200, [0]); + + const view2 = new TestView(50, Number.MAX_VALUE, 50, Number.MAX_VALUE); + gridview.addView(view2, 200, [0]); + + const view3 = new TestView(50, Number.MAX_VALUE, 50, Number.MAX_VALUE); + gridview.addView(view3, 200, [0, 0]); + + gridview.layout(800, 600); + + assert.deepEqual(view1.size, [800, 300]); + assert.deepEqual(view2.size, [400, 300]); + assert.deepEqual(view3.size, [400, 300]); + }); +}); diff --git a/src/vs/base/test/browser/ui/grid/util.ts b/src/vs/base/test/browser/ui/grid/util.ts new file mode 100644 index 0000000000..44154ad89b --- /dev/null +++ b/src/vs/base/test/browser/ui/grid/util.ts @@ -0,0 +1,81 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the Source EULA. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import * as assert from 'assert'; +import { Emitter, Event } from 'vs/base/common/event'; +import { IView, GridNode, isGridBranchNode, } from 'vs/base/browser/ui/grid/gridview'; + +export class TestView implements IView { + + private _onDidChange = new Emitter<{ width: number; height: number; }>(); + readonly onDidChange = this._onDidChange.event; + + get minimumWidth(): number { return this._minimumWidth; } + set minimumWidth(size: number) { this._minimumWidth = size; this._onDidChange.fire(); } + + get maximumWidth(): number { return this._maximumWidth; } + set maximumWidth(size: number) { this._maximumWidth = size; this._onDidChange.fire(); } + + get minimumHeight(): number { return this._minimumHeight; } + set minimumHeight(size: number) { this._minimumHeight = size; this._onDidChange.fire(); } + + get maximumHeight(): number { return this._maximumHeight; } + set maximumHeight(size: number) { this._maximumHeight = size; this._onDidChange.fire(); } + + private _element: HTMLElement = document.createElement('div'); + get element(): HTMLElement { this._onDidGetElement.fire(); return this._element; } + + private _onDidGetElement = new Emitter(); + readonly onDidGetElement = this._onDidGetElement.event; + + private _width = 0; + get width(): number { return this._width; } + + private _height = 0; + get height(): number { return this._height; } + + get size(): [number, number] { return [this.width, this.height]; } + + private _onDidLayout = new Emitter<{ width: number; height: number; }>(); + readonly onDidLayout: Event<{ width: number; height: number; }> = this._onDidLayout.event; + + private _onDidFocus = new Emitter(); + readonly onDidFocus: Event = this._onDidFocus.event; + + constructor( + private _minimumWidth: number, + private _maximumWidth: number, + private _minimumHeight: number, + private _maximumHeight: number + ) { + assert(_minimumWidth <= _maximumWidth, 'gridview view minimum width must be <= maximum width'); + assert(_minimumHeight <= _maximumHeight, 'gridview view minimum height must be <= maximum height'); + } + + layout(width: number, height: number): void { + this._width = width; + this._height = height; + this._onDidLayout.fire({ width, height }); + } + + focus(): void { + this._onDidFocus.fire(); + } + + dispose(): void { + this._onDidChange.dispose(); + this._onDidGetElement.dispose(); + this._onDidLayout.dispose(); + this._onDidFocus.dispose(); + } +} + +export function nodesToArrays(node: GridNode): any { + if (isGridBranchNode(node)) { + return node.children.map(nodesToArrays); + } else { + return node.view; + } +} \ No newline at end of file diff --git a/src/vs/base/test/browser/ui/list/listView.test.ts b/src/vs/base/test/browser/ui/list/listView.test.ts new file mode 100644 index 0000000000..cd8711a01f --- /dev/null +++ b/src/vs/base/test/browser/ui/list/listView.test.ts @@ -0,0 +1,41 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the Source EULA. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import * as assert from 'assert'; +import { ListView } from 'vs/base/browser/ui/list/listView'; +import { IVirtualDelegate, IRenderer } from 'vs/base/browser/ui/list/list'; +import { range } from 'vs/base/common/arrays'; + +suite('ListView', function () { + test('all rows get disposed', function () { + const element = document.createElement('div'); + element.style.height = '200px'; + element.style.width = '200px'; + + const delegate: IVirtualDelegate = { + getHeight() { return 20; }, + getTemplateId() { return 'template'; } + }; + + let templatesCount = 0; + + const renderer: IRenderer = { + templateId: 'template', + renderTemplate() { templatesCount++; }, + renderElement() { }, + disposeElement() { }, + disposeTemplate() { templatesCount--; } + }; + + const listView = new ListView(element, delegate, [renderer]); + listView.layout(200); + + assert.equal(templatesCount, 0, 'no templates have been allocated'); + listView.splice(0, 0, range(100)); + assert.equal(templatesCount, 10, 'some templates have been allocated'); + listView.dispose(); + assert.equal(templatesCount, 0, 'all templates have been disposed'); + }); +}); \ No newline at end of file diff --git a/src/vs/base/test/browser/ui/splitview/splitview.test.ts b/src/vs/base/test/browser/ui/splitview/splitview.test.ts index 70aef4c62e..7784850750 100644 --- a/src/vs/base/test/browser/ui/splitview/splitview.test.ts +++ b/src/vs/base/test/browser/ui/splitview/splitview.test.ts @@ -5,8 +5,8 @@ import * as assert from 'assert'; import { Emitter } from 'vs/base/common/event'; -import { SplitView, IView, Orientation } from 'vs/base/browser/ui/splitview/splitview'; -import { Sash } from 'vs/base/browser/ui/sash/sash'; +import { SplitView, IView, Orientation, Sizing } from 'vs/base/browser/ui/splitview/splitview'; +import { Sash, SashState } from 'vs/base/browser/ui/sash/sash'; class TestView implements IView { @@ -19,8 +19,11 @@ class TestView implements IView { get maximumSize(): number { return this._maximumSize; } set maximumSize(size: number) { this._maximumSize = size; this._onDidChange.fire(); } - private _onDidRender = new Emitter<{ container: HTMLElement; orientation: Orientation }>(); - readonly onDidRender = this._onDidRender.event; + private _element: HTMLElement = document.createElement('div'); + get element(): HTMLElement { this._onDidGetElement.fire(); return this._element; } + + private _onDidGetElement = new Emitter(); + readonly onDidGetElement = this._onDidGetElement.event; private _size = 0; get size(): number { return this._size; } @@ -37,10 +40,6 @@ class TestView implements IView { assert(_minimumSize <= _maximumSize, 'splitview view minimum size must be <= maximum size'); } - render(container: HTMLElement, orientation: Orientation): void { - this._onDidRender.fire({ container, orientation }); - } - layout(size: number, orientation: Orientation): void { this._size = size; this._onDidLayout.fire({ size, orientation }); @@ -52,7 +51,7 @@ class TestView implements IView { dispose(): void { this._onDidChange.dispose(); - this._onDidRender.dispose(); + this._onDidGetElement.dispose(); this._onDidLayout.dispose(); this._onDidFocus.dispose(); } @@ -62,6 +61,7 @@ function getSashes(splitview: SplitView): Sash[] { return (splitview as any).sashItems.map(i => i.sash) as Sash[]; } +// {{SQL CARBON EDIT}} disable broken tests suite('Splitview', () => { test('empty splitview has empty DOM', () => { }); diff --git a/src/vs/base/test/browser/ui/tree/treeModel.test.ts b/src/vs/base/test/browser/ui/tree/treeModel.test.ts new file mode 100644 index 0000000000..944104a247 --- /dev/null +++ b/src/vs/base/test/browser/ui/tree/treeModel.test.ts @@ -0,0 +1,334 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the Source EULA. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import * as assert from 'assert'; +import { TreeModel, ITreeNode } from 'vs/base/browser/ui/tree/treeModel'; +import { ISpliceable } from 'vs/base/common/sequence'; +import { Iterator } from 'vs/base/common/iterator'; + +function toSpliceable(arr: T[]): ISpliceable { + return { + splice(start: number, deleteCount: number, elements: T[]): void { + arr.splice(start, deleteCount, ...elements); + } + }; +} + +function toArray(list: ITreeNode[]): T[] { + return list.map(i => i.element); +} + +suite('TreeModel2', function () { + + test('ctor', function () { + const list = [] as ITreeNode[]; + const model = new TreeModel(toSpliceable(list)); + assert(model); + assert.equal(list.length, 0); + }); + + test('insert', function () { + const list = [] as ITreeNode[]; + const model = new TreeModel(toSpliceable(list)); + + model.splice([0], 0, Iterator.iterate([ + { element: 0 }, + { element: 1 }, + { element: 2 } + ])); + + assert.deepEqual(list.length, 3); + assert.deepEqual(list[0].element, 0); + assert.deepEqual(list[0].collapsed, false); + assert.deepEqual(list[0].depth, 1); + assert.deepEqual(list[1].element, 1); + assert.deepEqual(list[1].collapsed, false); + assert.deepEqual(list[1].depth, 1); + assert.deepEqual(list[2].element, 2); + assert.deepEqual(list[2].collapsed, false); + assert.deepEqual(list[2].depth, 1); + }); + + test('deep insert', function () { + const list = [] as ITreeNode[]; + const model = new TreeModel(toSpliceable(list)); + + model.splice([0], 0, Iterator.iterate([ + { + element: 0, children: Iterator.iterate([ + { element: 10 }, + { element: 11 }, + { element: 12 }, + ]) + }, + { element: 1 }, + { element: 2 } + ])); + + assert.deepEqual(list.length, 6); + assert.deepEqual(list[0].element, 0); + assert.deepEqual(list[0].collapsed, false); + assert.deepEqual(list[0].depth, 1); + assert.deepEqual(list[1].element, 10); + assert.deepEqual(list[1].collapsed, false); + assert.deepEqual(list[1].depth, 2); + assert.deepEqual(list[2].element, 11); + assert.deepEqual(list[2].collapsed, false); + assert.deepEqual(list[2].depth, 2); + assert.deepEqual(list[3].element, 12); + assert.deepEqual(list[3].collapsed, false); + assert.deepEqual(list[3].depth, 2); + assert.deepEqual(list[4].element, 1); + assert.deepEqual(list[4].collapsed, false); + assert.deepEqual(list[4].depth, 1); + assert.deepEqual(list[5].element, 2); + assert.deepEqual(list[5].collapsed, false); + assert.deepEqual(list[5].depth, 1); + }); + + test('deep insert collapsed', function () { + const list = [] as ITreeNode[]; + const model = new TreeModel(toSpliceable(list)); + + model.splice([0], 0, Iterator.iterate([ + { + element: 0, collapsed: true, children: Iterator.iterate([ + { element: 10 }, + { element: 11 }, + { element: 12 }, + ]) + }, + { element: 1 }, + { element: 2 } + ])); + + assert.deepEqual(list.length, 3); + assert.deepEqual(list[0].element, 0); + assert.deepEqual(list[0].collapsed, true); + assert.deepEqual(list[0].depth, 1); + assert.deepEqual(list[1].element, 1); + assert.deepEqual(list[1].collapsed, false); + assert.deepEqual(list[1].depth, 1); + assert.deepEqual(list[2].element, 2); + assert.deepEqual(list[2].collapsed, false); + assert.deepEqual(list[2].depth, 1); + }); + + test('delete', function () { + const list = [] as ITreeNode[]; + const model = new TreeModel(toSpliceable(list)); + + model.splice([0], 0, Iterator.iterate([ + { element: 0 }, + { element: 1 }, + { element: 2 } + ])); + + assert.deepEqual(list.length, 3); + + model.splice([1], 1); + assert.deepEqual(list.length, 2); + assert.deepEqual(list[0].element, 0); + assert.deepEqual(list[0].collapsed, false); + assert.deepEqual(list[0].depth, 1); + assert.deepEqual(list[1].element, 2); + assert.deepEqual(list[1].collapsed, false); + assert.deepEqual(list[1].depth, 1); + + model.splice([0], 2); + assert.deepEqual(list.length, 0); + }); + + test('nested delete', function () { + const list = [] as ITreeNode[]; + const model = new TreeModel(toSpliceable(list)); + + model.splice([0], 0, Iterator.iterate([ + { + element: 0, children: Iterator.iterate([ + { element: 10 }, + { element: 11 }, + { element: 12 }, + ]) + }, + { element: 1 }, + { element: 2 } + ])); + + assert.deepEqual(list.length, 6); + + model.splice([1], 2); + assert.deepEqual(list.length, 4); + assert.deepEqual(list[0].element, 0); + assert.deepEqual(list[0].collapsed, false); + assert.deepEqual(list[0].depth, 1); + assert.deepEqual(list[1].element, 10); + assert.deepEqual(list[1].collapsed, false); + assert.deepEqual(list[1].depth, 2); + assert.deepEqual(list[2].element, 11); + assert.deepEqual(list[2].collapsed, false); + assert.deepEqual(list[2].depth, 2); + assert.deepEqual(list[3].element, 12); + assert.deepEqual(list[3].collapsed, false); + assert.deepEqual(list[3].depth, 2); + }); + + test('deep delete', function () { + const list = [] as ITreeNode[]; + const model = new TreeModel(toSpliceable(list)); + + model.splice([0], 0, Iterator.iterate([ + { + element: 0, children: Iterator.iterate([ + { element: 10 }, + { element: 11 }, + { element: 12 }, + ]) + }, + { element: 1 }, + { element: 2 } + ])); + + assert.deepEqual(list.length, 6); + + model.splice([0], 1); + assert.deepEqual(list.length, 2); + assert.deepEqual(list[0].element, 1); + assert.deepEqual(list[0].collapsed, false); + assert.deepEqual(list[0].depth, 1); + assert.deepEqual(list[1].element, 2); + assert.deepEqual(list[1].collapsed, false); + assert.deepEqual(list[1].depth, 1); + }); + + test('hidden delete', function () { + const list = [] as ITreeNode[]; + const model = new TreeModel(toSpliceable(list)); + + model.splice([0], 0, Iterator.iterate([ + { + element: 0, collapsed: true, children: Iterator.iterate([ + { element: 10 }, + { element: 11 }, + { element: 12 }, + ]) + }, + { element: 1 }, + { element: 2 } + ])); + + assert.deepEqual(list.length, 3); + + model.splice([0, 1], 1); + assert.deepEqual(list.length, 3); + + model.splice([0, 0], 2); + assert.deepEqual(list.length, 3); + }); + + test('collapse', function () { + const list = [] as ITreeNode[]; + const model = new TreeModel(toSpliceable(list)); + + model.splice([0], 0, Iterator.iterate([ + { + element: 0, children: Iterator.iterate([ + { element: 10 }, + { element: 11 }, + { element: 12 }, + ]) + }, + { element: 1 }, + { element: 2 } + ])); + + assert.deepEqual(list.length, 6); + + model.setCollapsed([0], true); + assert.deepEqual(list.length, 3); + assert.deepEqual(list[0].element, 0); + assert.deepEqual(list[0].collapsed, true); + assert.deepEqual(list[0].depth, 1); + assert.deepEqual(list[1].element, 1); + assert.deepEqual(list[1].collapsed, false); + assert.deepEqual(list[1].depth, 1); + assert.deepEqual(list[2].element, 2); + assert.deepEqual(list[2].collapsed, false); + assert.deepEqual(list[2].depth, 1); + }); + + test('expand', function () { + const list = [] as ITreeNode[]; + const model = new TreeModel(toSpliceable(list)); + + model.splice([0], 0, Iterator.iterate([ + { + element: 0, collapsed: true, children: Iterator.iterate([ + { element: 10 }, + { element: 11 }, + { element: 12 }, + ]) + }, + { element: 1 }, + { element: 2 } + ])); + + assert.deepEqual(list.length, 3); + + model.setCollapsed([0], false); + assert.deepEqual(list.length, 6); + assert.deepEqual(list[0].element, 0); + assert.deepEqual(list[0].collapsed, false); + assert.deepEqual(list[0].depth, 1); + assert.deepEqual(list[1].element, 10); + assert.deepEqual(list[1].collapsed, false); + assert.deepEqual(list[1].depth, 2); + assert.deepEqual(list[2].element, 11); + assert.deepEqual(list[2].collapsed, false); + assert.deepEqual(list[2].depth, 2); + assert.deepEqual(list[3].element, 12); + assert.deepEqual(list[3].collapsed, false); + assert.deepEqual(list[3].depth, 2); + assert.deepEqual(list[4].element, 1); + assert.deepEqual(list[4].collapsed, false); + assert.deepEqual(list[4].depth, 1); + assert.deepEqual(list[5].element, 2); + assert.deepEqual(list[5].collapsed, false); + assert.deepEqual(list[5].depth, 1); + }); + + test('collapse should recursively adjust visible count', function () { + const list = [] as ITreeNode[]; + const model = new TreeModel(toSpliceable(list)); + + model.splice([0], 0, Iterator.iterate([ + { + element: 1, children: [ + { + element: 11, children: [ + { element: 111 } + ] + } + ] + }, + { + element: 2, children: [ + { element: 21 } + ] + } + ])); + + assert.deepEqual(list.length, 5); + assert.deepEqual(toArray(list), [1, 11, 111, 2, 21]); + + model.setCollapsed([0, 0], true); + assert.deepEqual(list.length, 4); + assert.deepEqual(toArray(list), [1, 11, 2, 21]); + + model.setCollapsed([1], true); + assert.deepEqual(list.length, 3); + assert.deepEqual(toArray(list), [1, 11, 2]); + }); +}); \ No newline at end of file diff --git a/src/vs/base/test/common/arrays.test.ts b/src/vs/base/test/common/arrays.test.ts index 7f127f93bb..fe6f691cc0 100644 --- a/src/vs/base/test/common/arrays.test.ts +++ b/src/vs/base/test/common/arrays.test.ts @@ -52,6 +52,11 @@ suite('Arrays', () => { assert.deepEqual(data, [1, 2, 3, 4, 5, 6, 7, 8]); }); + test('mergeSort, sorted array', function () { + let data = arrays.mergeSort([1, 2, 3, 4, 5, 6], (a, b) => a - b); + assert.deepEqual(data, [1, 2, 3, 4, 5, 6]); + }); + test('mergeSort, is stable', function () { let numbers = arrays.mergeSort([33, 22, 11, 4, 99, 1], (a, b) => 0); @@ -304,5 +309,43 @@ suite('Arrays', () => { sparse = arrays.coalesce(sparse); assert.equal(sparse.length, 5); }); + + test('coalesce - inplace', function () { + let a = [null, 1, null, 2, 3]; + arrays.coalesce(a, true); + assert.equal(a.length, 3); + assert.equal(a[0], 1); + assert.equal(a[1], 2); + assert.equal(a[2], 3); + + a = [null, 1, null, void 0, undefined, 2, 3]; + arrays.coalesce(a, true); + assert.equal(a.length, 3); + assert.equal(a[0], 1); + assert.equal(a[1], 2); + assert.equal(a[2], 3); + + let b = []; + b[10] = 1; + b[20] = 2; + b[30] = 3; + arrays.coalesce(b, true); + assert.equal(b.length, 3); + assert.equal(b[0], 1); + assert.equal(b[1], 2); + assert.equal(b[2], 3); + + let sparse = []; + sparse[0] = 1; + sparse[1] = 1; + sparse[17] = 1; + sparse[1000] = 1; + sparse[1001] = 1; + + assert.equal(sparse.length, 1002); + + arrays.coalesce(sparse, true); + assert.equal(sparse.length, 5); + }); }); diff --git a/src/vs/base/test/common/async.test.ts b/src/vs/base/test/common/async.test.ts index 95c52e7525..768eb38418 100644 --- a/src/vs/base/test/common/async.test.ts +++ b/src/vs/base/test/common/async.test.ts @@ -5,20 +5,159 @@ 'use strict'; import * as assert from 'assert'; -import { Promise, TPromise } from 'vs/base/common/winjs.base'; -import * as Async from 'vs/base/common/async'; +import { TPromise } from 'vs/base/common/winjs.base'; +import * as async from 'vs/base/common/async'; import URI from 'vs/base/common/uri'; +import { isPromiseCanceledError } from 'vs/base/common/errors'; suite('Async', () => { + + test('cancelablePromise - set token, don\'t wait for inner promise', function () { + let canceled = 0; + let promise = async.createCancelablePromise(token => { + token.onCancellationRequested(_ => { canceled += 1; }); + return new Promise(resolve => { /*never*/ }); + }); + let result = promise.then(_ => assert.ok(false), err => { + assert.equal(canceled, 1); + assert.ok(isPromiseCanceledError(err)); + }); + promise.cancel(); + promise.cancel(); // cancel only once + return result; + }); + + test('cancelablePromise - cancel despite inner promise being resolved', function () { + let canceled = 0; + let promise = async.createCancelablePromise(token => { + token.onCancellationRequested(_ => { canceled += 1; }); + return Promise.resolve(1234); + }); + let result = promise.then(_ => assert.ok(false), err => { + assert.equal(canceled, 1); + assert.ok(isPromiseCanceledError(err)); + }); + promise.cancel(); + return result; + }); + + // Cancelling a sync cancelable promise will fire the cancelled token. + // Also, every `then` callback runs in another execution frame. + test('CancelablePromise execution order (sync)', function () { + const order = []; + + const cancellablePromise = async.createCancelablePromise(token => { + order.push('in callback'); + token.onCancellationRequested(_ => order.push('cancelled')); + return Promise.resolve(1234); + }); + + order.push('afterCreate'); + + const promise = cancellablePromise + .then(null, err => null) + .then(() => order.push('finally')); + + cancellablePromise.cancel(); + order.push('afterCancel'); + + return promise.then(() => assert.deepEqual(order, ['in callback', 'afterCreate', 'cancelled', 'afterCancel', 'finally'])); + }); + + // Cancelling an async cancelable promise is just the same as a sync cancellable promise. + test('CancelablePromise execution order (async)', function () { + const order = []; + + const cancellablePromise = async.createCancelablePromise(token => { + order.push('in callback'); + token.onCancellationRequested(_ => order.push('cancelled')); + return new Promise(c => setTimeout(c(1234), 0)); + }); + + order.push('afterCreate'); + + const promise = cancellablePromise + .then(null, err => null) + .then(() => order.push('finally')); + + cancellablePromise.cancel(); + order.push('afterCancel'); + + return promise.then(() => assert.deepEqual(order, ['in callback', 'afterCreate', 'cancelled', 'afterCancel', 'finally'])); + }); + + // Cancelling a sync tpromise will NOT cancel the promise, since it has resolved already. + // Every `then` callback runs sync in the same execution frame, thus `finally` executes + // before `afterCancel`. + test('TPromise execution order (sync)', function () { + const order = []; + let promise = new TPromise(resolve => { + order.push('in executor'); + resolve(1234); + }, () => order.push('cancelled')); + + order.push('afterCreate'); + + promise = promise + .then(null, err => null) + .then(() => order.push('finally')); + + promise.cancel(); + order.push('afterCancel'); + + return promise.then(() => assert.deepEqual(order, ['in executor', 'afterCreate', 'finally', 'afterCancel'])); + }); + + // Cancelling an async tpromise will cancel the promise. + // Every `then` callback runs sync on the same execution frame as the `cancel` call, + // so finally still executes before `afterCancel`. + test('TPromise execution order (async)', function () { + const order = []; + let promise = new TPromise(resolve => { + order.push('in executor'); + setTimeout(() => resolve(1234)); + }, () => order.push('cancelled')); + + order.push('afterCreate'); + + promise = promise + .then(null, err => null) + .then(() => order.push('finally')); + + promise.cancel(); + order.push('afterCancel'); + + return promise.then(() => assert.deepEqual(order, ['in executor', 'afterCreate', 'cancelled', 'finally', 'afterCancel'])); + }); + + test('cancelablePromise - get inner result', async function () { + let promise = async.createCancelablePromise(token => { + return async.timeout(12).then(_ => 1234); + }); + + let result = await promise; + assert.equal(result, 1234); + }); + + test('asDisposablePromise', async function () { + let value = await async.asDisposablePromise(TPromise.as(1)).promise; + assert.equal(value, 1); + + let disposablePromise = async.asDisposablePromise(TPromise.timeout(1000).then(_ => 1), 2); + disposablePromise.dispose(); + value = await disposablePromise.promise; + assert.equal(value, 2); + }); + test('Throttler - non async', function () { let count = 0; let factory = () => { return TPromise.as(++count); }; - let throttler = new Async.Throttler(); + let throttler = new async.Throttler(); - return Promise.join([ + return TPromise.join([ throttler.queue(factory).then((result) => { assert.equal(result, 1); }), throttler.queue(factory).then((result) => { assert.equal(result, 2); }), throttler.queue(factory).then((result) => { assert.equal(result, 3); }), @@ -35,16 +174,16 @@ suite('Async', () => { }); }; - let throttler = new Async.Throttler(); + let throttler = new async.Throttler(); - return Promise.join([ + return TPromise.join([ throttler.queue(factory).then((result) => { assert.equal(result, 1); }), throttler.queue(factory).then((result) => { assert.equal(result, 2); }), throttler.queue(factory).then((result) => { assert.equal(result, 2); }), throttler.queue(factory).then((result) => { assert.equal(result, 2); }), throttler.queue(factory).then((result) => { assert.equal(result, 2); }) ]).then(() => { - Promise.join([ + TPromise.join([ throttler.queue(factory).then((result) => { assert.equal(result, 3); }), throttler.queue(factory).then((result) => { assert.equal(result, 4); }), throttler.queue(factory).then((result) => { assert.equal(result, 4); }), @@ -62,10 +201,10 @@ suite('Async', () => { }); }; - let throttler = new Async.Throttler(); - let p1: Promise; + let throttler = new async.Throttler(); + let p1: TPromise; - const p = Promise.join([ + const p = TPromise.join([ p1 = throttler.queue(factory).then((result) => { assert(false, 'should not be here, 1'); }, () => { assert(true, 'yes, it was cancelled'); }), throttler.queue(factory).then((result) => { assert.equal(result, 1); }, () => { assert(false, 'should not be here, 2'); }), throttler.queue(factory).then((result) => { assert.equal(result, 1); }, () => { assert(false, 'should not be here, 3'); }), @@ -85,10 +224,10 @@ suite('Async', () => { }); }; - let throttler = new Async.Throttler(); - let p2: Promise; + let throttler = new async.Throttler(); + let p2: TPromise; - const p = Promise.join([ + const p = TPromise.join([ throttler.queue(factory).then((result) => { assert.equal(result, 1); }, () => { assert(false, 'should not be here, 1'); }), p2 = throttler.queue(factory).then((result) => { assert(false, 'should not be here, 2'); }, () => { assert(true, 'yes, it was cancelled'); }), throttler.queue(factory).then((result) => { assert.equal(result, 2); }, () => { assert(false, 'should not be here, 3'); }), @@ -108,10 +247,10 @@ suite('Async', () => { }); }; - let throttler = new Async.Throttler(); - let p3: Promise; + let throttler = new async.Throttler(); + let p3: TPromise; - const p = Promise.join([ + const p = TPromise.join([ throttler.queue(factory).then((result) => { assert.equal(result, 1); }, () => { assert(false, 'should not be here, 1'); }), throttler.queue(factory).then((result) => { assert.equal(result, 2); }, () => { assert(false, 'should not be here, 2'); }), p3 = throttler.queue(factory).then((result) => { assert(false, 'should not be here, 3'); }, () => { assert(true, 'yes, it was cancelled'); }), @@ -128,15 +267,15 @@ suite('Async', () => { return TPromise.timeout(0).then(() => n); }; - let throttler = new Async.Throttler(); + let throttler = new async.Throttler(); - let promises: Promise[] = []; + let promises: TPromise[] = []; promises.push(throttler.queue(factoryFactory(1)).then((n) => { assert.equal(n, 1); })); promises.push(throttler.queue(factoryFactory(2)).then((n) => { assert.equal(n, 3); })); promises.push(throttler.queue(factoryFactory(3)).then((n) => { assert.equal(n, 3); })); - return Promise.join(promises); + return TPromise.join(promises); }); test('Throttler - progress should work', function () { @@ -148,15 +287,15 @@ suite('Async', () => { }); }); - let throttler = new Async.Throttler(); - let promises: Promise[] = []; + let throttler = new async.Throttler(); + let promises: TPromise[] = []; let progresses: any[][] = [[], [], []]; promises.push(throttler.queue(factory).then(null, null, (p) => progresses[0].push(p))); promises.push(throttler.queue(factory).then(null, null, (p) => progresses[1].push(p))); promises.push(throttler.queue(factory).then(null, null, (p) => progresses[2].push(p))); - return Promise.join(promises).then(() => { + return TPromise.join(promises).then(() => { assert.deepEqual(progresses[0], [0]); assert.deepEqual(progresses[1], [0]); assert.deepEqual(progresses[2], [0]); @@ -169,8 +308,8 @@ suite('Async', () => { return TPromise.as(++count); }; - let delayer = new Async.Delayer(0); - let promises: Promise[] = []; + let delayer = new async.Delayer(0); + let promises: TPromise[] = []; assert(!delayer.isTriggered()); @@ -183,7 +322,7 @@ suite('Async', () => { promises.push(delayer.trigger(factory).then((result) => { assert.equal(result, 1); assert(!delayer.isTriggered()); })); assert(delayer.isTriggered()); - return Promise.join(promises).then(() => { + return TPromise.join(promises).then(() => { assert(!delayer.isTriggered()); }); }); @@ -194,7 +333,7 @@ suite('Async', () => { return TPromise.as(++count); }; - let delayer = new Async.Delayer(0); + let delayer = new async.Delayer(0); assert(!delayer.isTriggered()); @@ -217,8 +356,8 @@ suite('Async', () => { return TPromise.as(++count); }; - let delayer = new Async.Delayer(0); - let promises: Promise[] = []; + let delayer = new async.Delayer(0); + let promises: TPromise[] = []; assert(!delayer.isTriggered()); @@ -233,7 +372,7 @@ suite('Async', () => { delayer.cancel(); - return Promise.join(promises).then(() => { + return TPromise.join(promises).then(() => { assert(!delayer.isTriggered()); }); }); @@ -244,8 +383,8 @@ suite('Async', () => { return TPromise.as(++count); }; - let delayer = new Async.Delayer(0); - let promises: Promise[] = []; + let delayer = new async.Delayer(0); + let promises: TPromise[] = []; assert(!delayer.isTriggered()); @@ -261,7 +400,7 @@ suite('Async', () => { delayer.cancel(); - const p = Promise.join(promises).then(() => { + const p = TPromise.join(promises).then(() => { promises = []; assert(!delayer.isTriggered()); @@ -272,7 +411,7 @@ suite('Async', () => { promises.push(delayer.trigger(factory).then(() => { assert.equal(result, 1); assert(!delayer.isTriggered()); })); assert(delayer.isTriggered()); - const p = Promise.join(promises).then(() => { + const p = TPromise.join(promises).then(() => { assert(!delayer.isTriggered()); }); @@ -296,8 +435,8 @@ suite('Async', () => { return TPromise.as(n); }; - let delayer = new Async.Delayer(0); - let promises: Promise[] = []; + let delayer = new async.Delayer(0); + let promises: TPromise[] = []; assert(!delayer.isTriggered()); @@ -305,7 +444,7 @@ suite('Async', () => { promises.push(delayer.trigger(factoryFactory(2)).then((n) => { assert.equal(n, 3); })); promises.push(delayer.trigger(factoryFactory(3)).then((n) => { assert.equal(n, 3); })); - const p = Promise.join(promises).then(() => { + const p = TPromise.join(promises).then(() => { assert(!delayer.isTriggered()); }); @@ -323,15 +462,15 @@ suite('Async', () => { }); }); - let delayer = new Async.Delayer(0); - let promises: Promise[] = []; + let delayer = new async.Delayer(0); + let promises: TPromise[] = []; let progresses: any[][] = [[], [], []]; promises.push(delayer.trigger(factory).then(null, null, (p) => progresses[0].push(p))); promises.push(delayer.trigger(factory).then(null, null, (p) => progresses[1].push(p))); promises.push(delayer.trigger(factory).then(null, null, (p) => progresses[2].push(p))); - return Promise.join(promises).then(() => { + return TPromise.join(promises).then(() => { assert.deepEqual(progresses[0], [0]); assert.deepEqual(progresses[1], [0]); assert.deepEqual(progresses[2], [0]); @@ -347,15 +486,15 @@ suite('Async', () => { }); }); - let delayer = new Async.ThrottledDelayer(0); - let promises: Promise[] = []; + let delayer = new async.ThrottledDelayer(0); + let promises: TPromise[] = []; let progresses: any[][] = [[], [], []]; promises.push(delayer.trigger(factory).then(null, null, (p) => progresses[0].push(p))); promises.push(delayer.trigger(factory).then(null, null, (p) => progresses[1].push(p))); promises.push(delayer.trigger(factory).then(null, null, (p) => progresses[2].push(p))); - return Promise.join(promises).then(() => { + return TPromise.join(promises).then(() => { assert.deepEqual(progresses[0], [0]); assert.deepEqual(progresses[1], [0]); assert.deepEqual(progresses[2], [0]); @@ -367,7 +506,7 @@ suite('Async', () => { return TPromise.as(n); }; - return Async.sequence([ + return async.sequence([ factoryFactory(1), factoryFactory(2), factoryFactory(3), @@ -388,20 +527,20 @@ suite('Async', () => { return TPromise.as(n); }; - let limiter = new Async.Limiter(1); + let limiter = new async.Limiter(1); - let promises: Promise[] = []; + let promises: TPromise[] = []; [0, 1, 2, 3, 4, 5, 6, 7, 8, 9].forEach(n => promises.push(limiter.queue(factoryFactory(n)))); - return Promise.join(promises).then((res) => { + return TPromise.join(promises).then((res) => { assert.equal(10, res.length); - limiter = new Async.Limiter(100); + limiter = new async.Limiter(100); promises = []; [0, 1, 2, 3, 4, 5, 6, 7, 8, 9].forEach(n => promises.push(limiter.queue(factoryFactory(n)))); - return Promise.join(promises).then((res) => { + return TPromise.join(promises).then((res) => { assert.equal(10, res.length); }); }); @@ -412,19 +551,19 @@ suite('Async', () => { return TPromise.timeout(0).then(() => n); }; - let limiter = new Async.Limiter(1); - let promises: Promise[] = []; + let limiter = new async.Limiter(1); + let promises: TPromise[] = []; [0, 1, 2, 3, 4, 5, 6, 7, 8, 9].forEach(n => promises.push(limiter.queue(factoryFactory(n)))); - return Promise.join(promises).then((res) => { + return TPromise.join(promises).then((res) => { assert.equal(10, res.length); - limiter = new Async.Limiter(100); + limiter = new async.Limiter(100); promises = []; [0, 1, 2, 3, 4, 5, 6, 7, 8, 9].forEach(n => promises.push(limiter.queue(factoryFactory(n)))); - return Promise.join(promises).then((res) => { + return TPromise.join(promises).then((res) => { assert.equal(10, res.length); }); }); @@ -438,19 +577,19 @@ suite('Async', () => { return TPromise.timeout(0).then(() => { activePromises--; return n; }); }; - let limiter = new Async.Limiter(5); + let limiter = new async.Limiter(5); - let promises: Promise[] = []; + let promises: TPromise[] = []; [0, 1, 2, 3, 4, 5, 6, 7, 8, 9].forEach(n => promises.push(limiter.queue(factoryFactory(n)))); - return Promise.join(promises).then((res) => { + return TPromise.join(promises).then((res) => { assert.equal(10, res.length); assert.deepEqual([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], res); }); }); test('Queue - simple', function () { - let queue = new Async.Queue(); + let queue = new async.Queue(); let syncPromise = false; let f1 = () => TPromise.as(true).then(() => syncPromise = true); @@ -473,7 +612,7 @@ suite('Async', () => { }); test('Queue - order is kept', function () { - let queue = new Async.Queue(); + let queue = new async.Queue(); let res: number[] = []; @@ -497,7 +636,7 @@ suite('Async', () => { }); test('Queue - errors bubble individually but not cause stop', function () { - let queue = new Async.Queue(); + let queue = new async.Queue(); let res: number[] = []; let error = false; @@ -522,7 +661,7 @@ suite('Async', () => { }); test('Queue - order is kept (chained)', function () { - let queue = new Async.Queue(); + let queue = new async.Queue(); let res: number[] = []; @@ -550,7 +689,7 @@ suite('Async', () => { }); test('Queue - events', function (done) { - let queue = new Async.Queue(); + let queue = new async.Queue(); let finished = false; queue.onFinished(() => { @@ -576,7 +715,7 @@ suite('Async', () => { }); test('ResourceQueue - simple', function () { - let queue = new Async.ResourceQueue(); + let queue = new async.ResourceQueue(); const r1Queue = queue.queueFor(URI.file('/some/path')); const r2Queue = queue.queueFor(URI.file('/some/other/path')); @@ -592,29 +731,4 @@ suite('Async', () => { const r1Queue2 = queue.queueFor(URI.file('/some/path')); assert.notEqual(r1Queue, r1Queue2); // previous one got disposed after finishing }); - - test('ThrottledEmitter', function () { - const emitter = new Async.ThrottledEmitter(); - - const fnThatEmitsEvent = () => { - emitter.fire(); - }; - - const promiseFn = TPromise.timeout(0).then(() => { - fnThatEmitsEvent(); - fnThatEmitsEvent(); - fnThatEmitsEvent(); - }); - - let count = 0; - emitter.event(() => { - count++; - }); - - emitter.throttle(promiseFn); - - promiseFn.then(() => { - assert.equal(count, 1); - }); - }); }); diff --git a/src/vs/base/test/common/diff/diff.test.ts b/src/vs/base/test/common/diff/diff.test.ts index b1ecff4fc6..bbf38fad98 100644 --- a/src/vs/base/test/common/diff/diff.test.ts +++ b/src/vs/base/test/common/diff/diff.test.ts @@ -6,20 +6,19 @@ import * as assert from 'assert'; -import { LcsDiff, IDiffChange } from 'vs/base/common/diff/diff'; +import { LcsDiff, IDiffChange, ISequence } from 'vs/base/common/diff/diff'; -class StringDiffSequence { +class StringDiffSequence implements ISequence { constructor(private source: string) { - } getLength() { return this.source.length; } - getElementHash(i: number) { - return this.source.charAt(i); + getElementAtIndex(i: number) { + return this.source.charCodeAt(i); } } diff --git a/src/vs/base/test/common/event.test.ts b/src/vs/base/test/common/event.test.ts index dc254fa448..3654026549 100644 --- a/src/vs/base/test/common/event.test.ts +++ b/src/vs/base/test/common/event.test.ts @@ -5,10 +5,11 @@ 'use strict'; import * as assert from 'assert'; -import { Event, Emitter, debounceEvent, EventBufferer, once, fromPromise, stopwatch, buffer, echo, EventMultiplexer, latch } from 'vs/base/common/event'; +import { Event, Emitter, debounceEvent, EventBufferer, once, fromPromise, stopwatch, buffer, echo, EventMultiplexer, latch, AsyncEmitter, IWaitUntil } from 'vs/base/common/event'; import { IDisposable } from 'vs/base/common/lifecycle'; import * as Errors from 'vs/base/common/errors'; import { TPromise } from 'vs/base/common/winjs.base'; +import { timeout } from 'vs/base/common/async'; namespace Samples { @@ -238,6 +239,103 @@ suite('Event', function () { }); }); +suite('AsyncEmitter', function () { + + test('event has waitUntil-function', async function () { + + interface E extends IWaitUntil { + foo: boolean; + bar: number; + } + + let emitter = new AsyncEmitter(); + + emitter.event(e => { + assert.equal(e.foo, true); + assert.equal(e.bar, 1); + assert.equal(typeof e.waitUntil, 'function'); + }); + + emitter.fireAsync(thenables => ({ + foo: true, + bar: 1, + waitUntil(t: Thenable) { thenables.push(t); } + })); + emitter.dispose(); + }); + + test('sequential delivery', async function () { + + interface E extends IWaitUntil { + foo: boolean; + } + + let globalState = 0; + let emitter = new AsyncEmitter(); + + emitter.event(e => { + e.waitUntil(timeout(10).then(_ => { + assert.equal(globalState, 0); + globalState += 1; + })); + }); + + emitter.event(e => { + e.waitUntil(timeout(1).then(_ => { + assert.equal(globalState, 1); + globalState += 1; + })); + }); + + await emitter.fireAsync(thenables => ({ + foo: true, + waitUntil(t) { + thenables.push(t); + } + })); + assert.equal(globalState, 2); + }); + + test('sequential, in-order delivery', async function () { + interface E extends IWaitUntil { + foo: number; + } + let events: number[] = []; + let done = false; + let emitter = new AsyncEmitter(); + + // e1 + emitter.event(e => { + e.waitUntil(timeout(10).then(async _ => { + if (e.foo === 1) { + await emitter.fireAsync(thenables => ({ + foo: 2, + waitUntil(t) { + thenables.push(t); + } + })); + assert.deepEqual(events, [1, 2]); + done = true; + } + })); + }); + + // e2 + emitter.event(e => { + events.push(e.foo); + e.waitUntil(timeout(7)); + }); + + await emitter.fireAsync(thenables => ({ + foo: 1, + waitUntil(t) { + thenables.push(t); + } + })); + assert.ok(done); + }); +}); + suite('Event utils', () => { suite('EventBufferer', () => { diff --git a/src/vs/base/test/common/filters.test.ts b/src/vs/base/test/common/filters.test.ts index 75e2d40c66..43c1dc93ab 100644 --- a/src/vs/base/test/common/filters.test.ts +++ b/src/vs/base/test/common/filters.test.ts @@ -298,7 +298,7 @@ suite('Filters', () => { assertMatches('ob', 'foobar', undefined, fuzzyScore); assertMatches('sl', 'SVisualLoggerLogsList', '^SVisual^LoggerLogsList', fuzzyScore); assertMatches('sllll', 'SVisualLoggerLogsList', '^SVisua^l^Logger^Logs^List', fuzzyScore); - assertMatches('Three', 'HTMLHRElement', 'H^TML^H^R^El^ement', fuzzyScore); + assertMatches('Three', 'HTMLHRElement', undefined, fuzzyScore); assertMatches('Three', 'Three', '^T^h^r^e^e', fuzzyScore); assertMatches('fo', 'barfoo', undefined, fuzzyScore); assertMatches('fo', 'bar_foo', 'bar_^f^oo', fuzzyScore); @@ -309,6 +309,14 @@ suite('Filters', () => { assertMatches('fo', 'bar\\foo', 'bar\\^f^oo', fuzzyScore); }); + test('fuzzyScore (first match can be weak)', function () { + let fuzzyScoreWeak = (pattern, word) => fuzzyScore(pattern, word, undefined, true); + assertMatches('Three', 'HTMLHRElement', 'H^TML^H^R^El^ement', fuzzyScoreWeak); + assertMatches('tor', 'constructor', 'construc^t^o^r', fuzzyScoreWeak); + assertMatches('ur', 'constructor', 'constr^ucto^r', fuzzyScoreWeak); + assertTopScore(fuzzyScoreWeak, 'tor', 2, 'constructor', 'Thor', 'cTor'); + }); + test('fuzzyScore, many matches', function () { assertMatches( diff --git a/src/vs/base/test/common/history.test.ts b/src/vs/base/test/common/history.test.ts index a4c45aa2e8..b48f9ce908 100644 --- a/src/vs/base/test/common/history.test.ts +++ b/src/vs/base/test/common/history.test.ts @@ -16,19 +16,18 @@ suite('History Navigator', () => { }); test('create sets the position to last', () => { - const testObject = new HistoryNavigator(['1', '2', '3', '4'], 3); + const testObject = new HistoryNavigator(['1', '2', '3', '4'], 100); - assert.equal('4', testObject.current()); - assert.equal(null, testObject.next()); - assert.equal('3', testObject.previous()); + assert.equal(testObject.current(), null); + assert.equal(testObject.next(), null); + assert.equal(testObject.previous(), '4'); }); test('last returns last element', () => { - const testObject = new HistoryNavigator(['1', '2', '3', '4'], 3); + const testObject = new HistoryNavigator(['1', '2', '3', '4'], 100); - testObject.first(); - - assert.equal('4', testObject.last()); + assert.equal(testObject.first(), '1'); + assert.equal(testObject.last(), '4', ); }); test('first returns first element', () => { @@ -42,17 +41,18 @@ suite('History Navigator', () => { testObject.first(); - assert.equal('3', testObject.next()); - assert.equal('4', testObject.next()); - assert.equal(null, testObject.next()); + assert.equal(testObject.next(), '3'); + assert.equal(testObject.next(), '4'); + assert.equal(testObject.next(), null); }); test('previous returns previous element', () => { const testObject = new HistoryNavigator(['1', '2', '3', '4'], 3); - assert.equal('3', testObject.previous()); - assert.equal('2', testObject.previous()); - assert.equal(null, testObject.previous()); + assert.equal(testObject.previous(), '4'); + assert.equal(testObject.previous(), '3'); + assert.equal(testObject.previous(), '2'); + assert.equal(testObject.previous(), null); }); test('next on last element returs null and remains on last', () => { @@ -61,8 +61,8 @@ suite('History Navigator', () => { testObject.first(); testObject.last(); - assert.equal('4', testObject.current()); - assert.equal(null, testObject.next()); + assert.equal(testObject.current(), '4'); + assert.equal(testObject.next(), null); }); test('previous on first element returs null and remains on first', () => { @@ -70,8 +70,8 @@ suite('History Navigator', () => { testObject.first(); - assert.equal('2', testObject.current()); - assert.equal(null, testObject.previous()); + assert.equal(testObject.current(), '2'); + assert.equal(testObject.previous(), null); }); test('add reduces the input to limit', () => { @@ -79,7 +79,7 @@ suite('History Navigator', () => { testObject.add('5'); - assert.deepEqual(['4', '5'], toArray(testObject)); + assert.deepEqual(toArray(testObject), ['4', '5']); }); test('adding existing element changes the position', () => { @@ -87,7 +87,7 @@ suite('History Navigator', () => { testObject.add('2'); - assert.deepEqual(['1', '3', '4', '2'], toArray(testObject)); + assert.deepEqual(toArray(testObject), ['1', '3', '4', '2']); }); test('add resets the navigator to last', () => { @@ -96,8 +96,8 @@ suite('History Navigator', () => { testObject.first(); testObject.add('5'); - assert.equal('5', testObject.current()); - assert.equal(null, testObject.next()); + assert.equal(testObject.previous(), '5'); + assert.equal(testObject.next(), null); }); test('adding an existing item changes the order', () => { @@ -110,9 +110,9 @@ suite('History Navigator', () => { test('clear', () => { const testObject = new HistoryNavigator(['a', 'b', 'c']); - assert.equal('c', testObject.current()); + assert.equal(testObject.previous(), 'c'); testObject.clear(); - assert.equal(undefined, testObject.current()); + assert.equal(testObject.current(), undefined); }); function toArray(historyNavigator: HistoryNavigator): string[] { @@ -126,4 +126,3 @@ suite('History Navigator', () => { return result; } }); - diff --git a/src/vs/base/test/common/json.test.ts b/src/vs/base/test/common/json.test.ts index 563a775e62..8f81eb4d0a 100644 --- a/src/vs/base/test/common/json.test.ts +++ b/src/vs/base/test/common/json.test.ts @@ -43,9 +43,9 @@ function assertInvalidParse(input: string, expected: any, options?: ParseOptions assert.deepEqual(actual, expected); } -function assertTree(input: string, expected: any, expectedErrors: number[] = []): void { +function assertTree(input: string, expected: any, expectedErrors: number[] = [], options?: ParseOptions): void { var errors: ParseError[] = []; - var actual = parseTree(input, errors); + var actual = parseTree(input, errors, options); assert.deepEqual(errors.map(e => e.error, expected), expectedErrors); let checkParent = (node: Node) => { @@ -203,7 +203,7 @@ suite('JSON', () => { test('parse: objects with errors', () => { assertInvalidParse('{,}', {}); - assertInvalidParse('{ "foo": true, }', { foo: true }); + assertInvalidParse('{ "foo": true, }', { foo: true }, { disallowTrailingComma: true }); assertInvalidParse('{ "bar": 8 "xoo": "foo" }', { bar: 8, xoo: 'foo' }); assertInvalidParse('{ ,"bar": 8 }', { bar: 8 }); assertInvalidParse('{ ,"bar": 8, "foo" }', { bar: 8 }); @@ -213,10 +213,10 @@ suite('JSON', () => { test('parse: array with errors', () => { assertInvalidParse('[,]', []); - assertInvalidParse('[ 1, 2, ]', [1, 2]); + assertInvalidParse('[ 1, 2, ]', [1, 2], { disallowTrailingComma: true }); assertInvalidParse('[ 1 2, 3 ]', [1, 2, 3]); assertInvalidParse('[ ,1, 2, 3 ]', [1, 2, 3]); - assertInvalidParse('[ ,1, 2, 3, ]', [1, 2, 3]); + assertInvalidParse('[ ,1, 2, 3, ]', [1, 2, 3], { disallowTrailingComma: true }); }); test('parse: disallow commments', () => { @@ -229,15 +229,19 @@ suite('JSON', () => { }); test('parse: trailing comma', () => { - let options = { allowTrailingComma: true }; + // default is allow + assertValidParse('{ "hello": [], }', { hello: [] }); + + let options = { disallowTrailingComma: false }; assertValidParse('{ "hello": [], }', { hello: [] }, options); assertValidParse('{ "hello": [] }', { hello: [] }, options); assertValidParse('{ "hello": [], "world": {}, }', { hello: [], world: {} }, options); assertValidParse('{ "hello": [], "world": {} }', { hello: [], world: {} }, options); assertValidParse('{ "hello": [1,] }', { hello: [1] }, options); - assertInvalidParse('{ "hello": [], }', { hello: [] }); - assertInvalidParse('{ "hello": [], "world": {}, }', { hello: [], world: {} }); + options = { disallowTrailingComma: true }; + assertInvalidParse('{ "hello": [], }', { hello: [] }, options); + assertInvalidParse('{ "hello": [], "world": {}, }', { hello: [], world: {} }, options); }); test('tree: literals', () => { @@ -320,6 +324,6 @@ suite('JSON', () => { } ] } - , [ParseErrorCode.PropertyNameExpected, ParseErrorCode.ValueExpected]); + , [ParseErrorCode.PropertyNameExpected, ParseErrorCode.ValueExpected], { disallowTrailingComma: true }); }); }); diff --git a/src/vs/base/test/common/map.test.ts b/src/vs/base/test/common/map.test.ts index 4e6bec9e90..17636c177b 100644 --- a/src/vs/base/test/common/map.test.ts +++ b/src/vs/base/test/common/map.test.ts @@ -8,6 +8,7 @@ import { ResourceMap, TernarySearchTree, PathIterator, StringIterator, LinkedMap, Touch, LRUCache } from 'vs/base/common/map'; import * as assert from 'assert'; import URI from 'vs/base/common/uri'; +import { IteratorResult } from 'vs/base/common/iterator'; suite('Map', () => { @@ -418,17 +419,30 @@ suite('Map', () => { map.set('/user/foo/flip/flop', 3); map.set('/usr/foo', 4); - const elements = map.findSuperstr('/user'); + let item: IteratorResult; + let iter = map.findSuperstr('/user'); - assertTernarySearchTree(elements, ['foo/bar', 1], ['foo', 2], ['foo/flip/flop', 3]); - // assert.equal(elements.length, 3); - assert.equal(elements.get('foo/bar'), 1); - assert.equal(elements.get('foo'), 2); - assert.equal(elements.get('foo/flip/flop'), 3); + item = iter.next(); + assert.equal(item.value, 2); + assert.equal(item.done, false); + item = iter.next(); + assert.equal(item.value, 1); + assert.equal(item.done, false); + item = iter.next(); + assert.equal(item.value, 3); + assert.equal(item.done, false); + item = iter.next(); + assert.equal(item.value, undefined); + assert.equal(item.done, true); - assertTernarySearchTree(map.findSuperstr('/usr'), ['foo', 4]); - assert.equal(map.findSuperstr('/usr/foo'), undefined); - assert.equal(map.get('/usr/foo'), 4); + iter = map.findSuperstr('/usr'); + item = iter.next(); + assert.equal(item.value, 4); + assert.equal(item.done, false); + + item = iter.next(); + assert.equal(item.value, undefined); + assert.equal(item.done, true); assert.equal(map.findSuperstr('/not'), undefined); assert.equal(map.findSuperstr('/us'), undefined); diff --git a/src/vs/base/test/common/network.test.ts b/src/vs/base/test/common/network.test.ts index 57bc2a3444..ecafd878f2 100644 --- a/src/vs/base/test/common/network.test.ts +++ b/src/vs/base/test/common/network.test.ts @@ -36,7 +36,7 @@ suite('Network', () => { ); assertUrl('http://www.test.com:8000#hash', - 'http', 'www.test.com', '8000', '', '', 'hash' + 'http', 'www.test.com', '8000', '/', '', 'hash' ); assertUrl('http://www.test.com/#hash', @@ -44,7 +44,7 @@ suite('Network', () => { ); assertUrl('http://www.test.com#hash', - 'http', 'www.test.com', '', '', '', 'hash' + 'http', 'www.test.com', '', '/', '', 'hash' ); assertUrl('http://www.test.com:8000/this/that/theother.html', @@ -56,7 +56,7 @@ suite('Network', () => { ); assertUrl('http://www.test.com:8000', - 'http', 'www.test.com', '8000', '', '', '' + 'http', 'www.test.com', '8000', '/', '', '' ); assertUrl('http://www.test.com/', diff --git a/src/vs/base/test/common/resources.test.ts b/src/vs/base/test/common/resources.test.ts index 78965e920e..8509702ab6 100644 --- a/src/vs/base/test/common/resources.test.ts +++ b/src/vs/base/test/common/resources.test.ts @@ -5,9 +5,10 @@ 'use strict'; import * as assert from 'assert'; -import URI from 'vs/base/common/uri'; -import { distinctParents, dirname } from 'vs/base/common/resources'; import { normalize } from 'vs/base/common/paths'; +import { dirname, distinctParents, joinPath, isEqual, isEqualOrParent, hasToIgnoreCase } from 'vs/base/common/resources'; +import URI from 'vs/base/common/uri'; +import { isWindows } from 'vs/base/common/platform'; suite('Resources', () => { @@ -50,4 +51,68 @@ suite('Resources', () => { // does not explode (https://github.com/Microsoft/vscode/issues/41987) dirname(URI.from({ scheme: 'file', authority: '/users/someone/portal.h' })); }); + + test('joinPath', () => { + assert.equal( + joinPath(URI.file('/foo/bar'), '/file.js').toString(), + 'file:///foo/bar/file.js'); + + assert.equal( + joinPath(URI.file('/foo/bar/'), '/file.js').toString(), + 'file:///foo/bar/file.js'); + + assert.equal( + joinPath(URI.file('/'), '/file.js').toString(), + 'file:///file.js'); + + assert.equal( + joinPath(URI.from({ scheme: 'myScheme', authority: 'authority', path: '/path', query: 'query', fragment: 'fragment' }), '/file.js').toString(), + 'myScheme://authority/path/file.js?query#fragment'); + }); + + test('isEqual', () => { + let fileURI = URI.file('/foo/bar'); + let fileURI2 = URI.file('/foo/Bar'); + assert.equal(isEqual(fileURI, fileURI, true), true); + assert.equal(isEqual(fileURI, fileURI, false), true); + assert.equal(isEqual(fileURI, fileURI, hasToIgnoreCase(fileURI)), true); + assert.equal(isEqual(fileURI, fileURI2, true), true); + assert.equal(isEqual(fileURI, fileURI2, false), false); + + let fileURI3 = URI.parse('foo://server:453/foo/bar'); + let fileURI4 = URI.parse('foo://server:453/foo/Bar'); + assert.equal(isEqual(fileURI3, fileURI3, true), true); + assert.equal(isEqual(fileURI3, fileURI3, false), true); + assert.equal(isEqual(fileURI3, fileURI3, hasToIgnoreCase(fileURI3)), true); + assert.equal(isEqual(fileURI3, fileURI4, true), true); + assert.equal(isEqual(fileURI3, fileURI4, false), false); + + + assert.equal(isEqual(fileURI, fileURI3, true), false); + }); + + test('isEqualOrParent', () => { + let fileURI = isWindows ? URI.file('c:\\foo\\bar') : URI.file('/foo/bar'); + let fileURI2 = isWindows ? URI.file('c:\\foo') : URI.file('/foo'); + let fileURI2b = isWindows ? URI.file('C:\\Foo\\') : URI.file('/Foo/'); + assert.equal(isEqualOrParent(fileURI, fileURI, true), true, '1'); + assert.equal(isEqualOrParent(fileURI, fileURI, false), true, '2'); + assert.equal(isEqualOrParent(fileURI, fileURI2, true), true, '3'); + assert.equal(isEqualOrParent(fileURI, fileURI2, false), true, '4'); + assert.equal(isEqualOrParent(fileURI, fileURI2b, true), true, '5'); + assert.equal(isEqualOrParent(fileURI, fileURI2b, false), false, '6'); + + assert.equal(isEqualOrParent(fileURI2, fileURI, false), false, '7'); + assert.equal(isEqualOrParent(fileURI2b, fileURI2, true), true, '8'); + + let fileURI3 = URI.parse('foo://server:453/foo/bar/goo'); + let fileURI4 = URI.parse('foo://server:453/foo/'); + let fileURI5 = URI.parse('foo://server:453/foo'); + assert.equal(isEqualOrParent(fileURI3, fileURI3, true), true, '11'); + assert.equal(isEqualOrParent(fileURI3, fileURI3, false), true, '12'); + assert.equal(isEqualOrParent(fileURI3, fileURI4, true), true, '13'); + assert.equal(isEqualOrParent(fileURI3, fileURI4, false), true, '14'); + assert.equal(isEqualOrParent(fileURI3, fileURI, true), false, '15'); + assert.equal(isEqualOrParent(fileURI5, fileURI5, true), true, '16'); + }); }); \ No newline at end of file diff --git a/src/vs/base/test/common/uri.test.ts b/src/vs/base/test/common/uri.test.ts index 0d25c99931..634fe75b91 100644 --- a/src/vs/base/test/common/uri.test.ts +++ b/src/vs/base/test/common/uri.test.ts @@ -51,15 +51,19 @@ suite('URI', () => { test('URI#fsPath - no `fsPath` when no `path`', () => { const value = URI.parse('file://%2Fhome%2Fticino%2Fdesktop%2Fcpluscplus%2Ftest.cpp'); assert.equal(value.authority, '/home/ticino/desktop/cpluscplus/test.cpp'); - assert.equal(value.path, ''); - assert.equal(value.fsPath, ''); + assert.equal(value.path, '/'); + if (isWindows) { + assert.equal(value.fsPath, '\\'); + } else { + assert.equal(value.fsPath, '/'); + } }); test('http#toString', () => { assert.equal(URI.from({ scheme: 'http', authority: 'www.msft.com', path: '/my/path' }).toString(), 'http://www.msft.com/my/path'); assert.equal(URI.from({ scheme: 'http', authority: 'www.msft.com', path: '/my/path' }).toString(), 'http://www.msft.com/my/path'); assert.equal(URI.from({ scheme: 'http', authority: 'www.MSFT.com', path: '/my/path' }).toString(), 'http://www.msft.com/my/path'); - assert.equal(URI.from({ scheme: 'http', authority: '', path: 'my/path' }).toString(), 'http:my/path'); + assert.equal(URI.from({ scheme: 'http', authority: '', path: 'my/path' }).toString(), 'http:/my/path'); assert.equal(URI.from({ scheme: 'http', authority: '', path: '/my/path' }).toString(), 'http:/my/path'); assert.equal(URI.from({ scheme: '', authority: '', path: 'my/path' }).toString(), 'my/path'); assert.equal(URI.from({ scheme: '', authority: '', path: '/my/path' }).toString(), '/my/path'); @@ -213,7 +217,7 @@ suite('URI', () => { value = URI.parse('file:?q'); assert.equal(value.scheme, 'file'); assert.equal(value.authority, ''); - assert.equal(value.path, ''); + assert.equal(value.path, '/'); assert.equal(value.query, 'q'); assert.equal(value.fragment, ''); @@ -227,7 +231,7 @@ suite('URI', () => { value = URI.parse('file:#d'); assert.equal(value.scheme, 'file'); assert.equal(value.authority, ''); - assert.equal(value.path, ''); + assert.equal(value.path, '/'); assert.equal(value.query, ''); assert.equal(value.fragment, 'd'); @@ -428,6 +432,35 @@ suite('URI', () => { }); + test('class URI cannot represent relative file paths #34449', function () { + + let path = '/foo/bar'; + assert.equal(URI.file(path).path, path); + path = 'foo/bar'; + assert.equal(URI.file(path).path, '/foo/bar'); + path = './foo/bar'; + assert.equal(URI.file(path).path, '/./foo/bar'); // todo@joh missing normalization + + const fileUri1 = URI.parse(`file:foo/bar`); + assert.equal(fileUri1.path, '/foo/bar'); + assert.equal(fileUri1.authority, ''); + const uri = fileUri1.toString(); + assert.equal(uri, 'file:///foo/bar'); + const fileUri2 = URI.parse(uri); + assert.equal(fileUri2.path, '/foo/bar'); + assert.equal(fileUri2.authority, ''); + }); + + test('Ctrl click to follow hash query param url gets urlencoded #49628', function () { + let input = 'http://localhost:3000/#/foo?bar=baz'; + let uri = URI.parse(input); + assert.equal(uri.toString(true), input); + + input = 'http://localhost:3000/foo?bar=baz'; + uri = URI.parse(input); + assert.equal(uri.toString(true), input); + }); + test('URI - (de)serialize', function () { var values = [ diff --git a/src/vs/base/test/common/utils.ts b/src/vs/base/test/common/utils.ts index fc1661ae9c..f6d945406d 100644 --- a/src/vs/base/test/common/utils.ts +++ b/src/vs/base/test/common/utils.ts @@ -5,10 +5,9 @@ 'use strict'; -import { TPromise, PPromise, TValueCallback, TProgressCallback, ProgressCallback } from 'vs/base/common/winjs.base'; -import * as errors from 'vs/base/common/errors'; import * as paths from 'vs/base/common/paths'; import URI from 'vs/base/common/uri'; +import { TPromise, TValueCallback } from 'vs/base/common/winjs.base'; export class DeferredTPromise extends TPromise { @@ -16,17 +15,15 @@ export class DeferredTPromise extends TPromise { private completeCallback: TValueCallback; private errorCallback: (err: any) => void; - private progressCallback: ProgressCallback; - constructor() { + constructor(oncancel?: any) { let captured: any; - super((c, e, p) => { - captured = { c, e, p }; - }, () => this.oncancel()); + super((c, e) => { + captured = { c, e }; + }, oncancel ? oncancel : () => this.oncancel); this.canceled = false; this.completeCallback = captured.c; this.errorCallback = captured.e; - this.progressCallback = captured.p; } public complete(value: T) { @@ -37,48 +34,27 @@ export class DeferredTPromise extends TPromise { this.errorCallback(err); } - public progress(p: any) { - this.progressCallback(p); - } - private oncancel(): void { this.canceled = true; } } -export class DeferredPPromise extends PPromise { - - private completeCallback: TValueCallback; - private errorCallback: (err: any) => void; - private progressCallback: TProgressCallback

    ; - - constructor(init: (complete: TValueCallback, error: (err: any) => void, progress: TProgressCallback

    ) => void = (c, e, p) => { }, oncancel?: any) { - let captured: any; - super((c, e, p) => { - captured = { c, e, p }; - }, oncancel ? oncancel : () => this.oncancel); - this.completeCallback = captured.c; - this.errorCallback = captured.e; - this.progressCallback = captured.p; - } - - private oncancel(): void { - this.errorCallback(errors.canceled()); - } - - public complete(c: C) { - this.completeCallback(c); - } - - public progress(p: P) { - this.progressCallback(p); - } - - public error(e: any) { - this.errorCallback(e); - } -} - export function toResource(this: any, path: string) { return URI.file(paths.join('C:\\', Buffer.from(this.test.fullTitle()).toString('base64'), path)); } + +export function suiteRepeat(n: number, description: string, callback: (this: any) => void): void { + for (let i = 0; i < n; i++) { + suite(`${description} (iteration ${i})`, callback); + } +} + +export function testRepeat(n: number, description: string, callback: (this: any, done: MochaDone) => any): void { + for (let i = 0; i < n; i++) { + test(`${description} (iteration ${i})`, callback); + } +} + +export function testRepeatOnly(n: number, description: string, callback: (this: any, done: MochaDone) => any): void { + suite.only('repeat', () => testRepeat(n, description, callback)); +} diff --git a/src/vs/base/test/common/winjs.promise.test.ts b/src/vs/base/test/common/winjs.promise.test.ts new file mode 100644 index 0000000000..b2715fbfaa --- /dev/null +++ b/src/vs/base/test/common/winjs.promise.test.ts @@ -0,0 +1,70 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the Source EULA. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +'use strict'; + +import * as assert from 'assert'; +import * as winjs from 'vs/base/common/winjs.base'; + +suite('WinJS and ES6 Promises', function () { + + test('Promise.resolve', function () { + let resolveTPromise; + const tPromise = new winjs.Promise((c, e) => { + resolveTPromise = c; + }); + + const es6Promise = Promise.resolve(tPromise); + + const done = es6Promise.then(function (result) { + assert.equal(result, 'passed'); + }); + + resolveTPromise('passed'); + + return done; + }); + + test('new Promise', function () { + let resolveTPromise; + const tPromise = new winjs.Promise((c, e) => { + resolveTPromise = c; + }); + + const es6Promise = new Promise(function (c, e) { + c(tPromise); + }); + + const done = es6Promise.then(function (result) { + assert.equal(result, 'passed'); + }); + + resolveTPromise('passed'); + + return done; + }); + + test('1. Uncaught TypeError: this._state.then is not a function', () => { + let p1 = winjs.Promise.wrap(new Promise(function (c, e) { c(1); })); + Promise.all([p1]); + }); + + test('2. Uncaught TypeError: this._state.then is not a function', () => { + let p1 = winjs.Promise.wrap(new Promise(function (c, e) { c(1); })); + let thenFunc = p1.then.bind(p1); + setTimeout(() => { + thenFunc(() => { }); + }, 0); + }); + + test('3. Uncaught TypeError: this._state.then is not a function', () => { + let c; + let p1 = new winjs.Promise(function (_c, e) { c = _c; }); + let thenFunc = p1.then.bind(p1); + setTimeout(() => { + c(1); + thenFunc(() => { }); + }, 0); + }); +}); diff --git a/src/vs/base/test/node/config.test.ts b/src/vs/base/test/node/config.test.ts index ab68c6ab27..a1611efcb2 100644 --- a/src/vs/base/test/node/config.test.ts +++ b/src/vs/base/test/node/config.test.ts @@ -77,70 +77,70 @@ suite('Config', () => { }); }); - test('watching', function (done) { - this.timeout(10000); // watching is timing intense + // test('watching', function (done) { + // this.timeout(10000); // watching is timing intense - testFile('config', 'config.json').then(res => { - fs.writeFileSync(res.testFile, '// my comment\n{ "foo": "bar" }'); + // testFile('config', 'config.json').then(res => { + // fs.writeFileSync(res.testFile, '// my comment\n{ "foo": "bar" }'); - let watcher = new ConfigWatcher<{ foo: string; }>(res.testFile); - watcher.getConfig(); // ensure we are in sync + // let watcher = new ConfigWatcher<{ foo: string; }>(res.testFile); + // watcher.getConfig(); // ensure we are in sync - fs.writeFileSync(res.testFile, '// my comment\n{ "foo": "changed" }'); + // fs.writeFileSync(res.testFile, '// my comment\n{ "foo": "changed" }'); - watcher.onDidUpdateConfiguration(event => { - assert.ok(event); - assert.equal(event.config.foo, 'changed'); - assert.equal(watcher.getValue('foo'), 'changed'); + // watcher.onDidUpdateConfiguration(event => { + // assert.ok(event); + // assert.equal(event.config.foo, 'changed'); + // assert.equal(watcher.getValue('foo'), 'changed'); - watcher.dispose(); + // watcher.dispose(); - res.cleanUp().then(done, done); - }); - }, done); - }); + // res.cleanUp().then(done, done); + // }); + // }, done); + // }); - test('watching also works when file created later', function (done) { - this.timeout(10000); // watching is timing intense + // test('watching also works when file created later', function (done) { + // this.timeout(10000); // watching is timing intense - testFile('config', 'config.json').then(res => { - let watcher = new ConfigWatcher<{ foo: string; }>(res.testFile); - watcher.getConfig(); // ensure we are in sync + // testFile('config', 'config.json').then(res => { + // let watcher = new ConfigWatcher<{ foo: string; }>(res.testFile); + // watcher.getConfig(); // ensure we are in sync - fs.writeFileSync(res.testFile, '// my comment\n{ "foo": "changed" }'); + // fs.writeFileSync(res.testFile, '// my comment\n{ "foo": "changed" }'); - watcher.onDidUpdateConfiguration(event => { - assert.ok(event); - assert.equal(event.config.foo, 'changed'); - assert.equal(watcher.getValue('foo'), 'changed'); + // watcher.onDidUpdateConfiguration(event => { + // assert.ok(event); + // assert.equal(event.config.foo, 'changed'); + // assert.equal(watcher.getValue('foo'), 'changed'); - watcher.dispose(); + // watcher.dispose(); - res.cleanUp().then(done, done); - }); - }, done); - }); + // res.cleanUp().then(done, done); + // }); + // }, done); + // }); - test('watching detects the config file getting deleted', function (done) { - this.timeout(10000); // watching is timing intense + // test('watching detects the config file getting deleted', function (done) { + // this.timeout(10000); // watching is timing intense - testFile('config', 'config.json').then(res => { - fs.writeFileSync(res.testFile, '// my comment\n{ "foo": "bar" }'); + // testFile('config', 'config.json').then(res => { + // fs.writeFileSync(res.testFile, '// my comment\n{ "foo": "bar" }'); - let watcher = new ConfigWatcher<{ foo: string; }>(res.testFile); - watcher.getConfig(); // ensure we are in sync + // let watcher = new ConfigWatcher<{ foo: string; }>(res.testFile); + // watcher.getConfig(); // ensure we are in sync - watcher.onDidUpdateConfiguration(event => { - assert.ok(event); + // watcher.onDidUpdateConfiguration(event => { + // assert.ok(event); - watcher.dispose(); + // watcher.dispose(); - res.cleanUp().then(done, done); - }); + // res.cleanUp().then(done, done); + // }); - fs.unlinkSync(res.testFile); - }, done); - }); + // fs.unlinkSync(res.testFile); + // }, done); + // }); test('reload', function (done) { testFile('config', 'config.json').then(res => { diff --git a/src/vs/base/test/node/extfs/extfs.test.ts b/src/vs/base/test/node/extfs/extfs.test.ts index dec3e0754a..e1200372e8 100644 --- a/src/vs/base/test/node/extfs/extfs.test.ts +++ b/src/vs/base/test/node/extfs/extfs.test.ts @@ -6,16 +6,16 @@ 'use strict'; import * as assert from 'assert'; -import * as os from 'os'; - -import * as path from 'path'; import * as fs from 'fs'; - -import * as uuid from 'vs/base/common/uuid'; -import * as strings from 'vs/base/common/strings'; -import * as extfs from 'vs/base/node/extfs'; +import * as os from 'os'; +import * as path from 'path'; import { Readable } from 'stream'; +import { canNormalize } from 'vs/base/common/normalization'; import { isLinux, isWindows } from 'vs/base/common/platform'; +import * as uuid from 'vs/base/common/uuid'; +import * as extfs from 'vs/base/node/extfs'; + + const ignore = () => { }; @@ -224,7 +224,7 @@ suite('Extfs', () => { }); test('readdir', function (done) { - if (strings.canNormalize && typeof process.versions['electron'] !== 'undefined' /* needs electron */) { + if (canNormalize && typeof process.versions['electron'] !== 'undefined' /* needs electron */) { const id = uuid.generateUuid(); const parentDir = path.join(os.tmpdir(), 'vsctests', id); const newDir = path.join(parentDir, 'extfs', id, 'öäü'); diff --git a/src/vs/base/test/node/glob.test.ts b/src/vs/base/test/node/glob.test.ts index 7384f6da76..da1b3d92a6 100644 --- a/src/vs/base/test/node/glob.test.ts +++ b/src/vs/base/test/node/glob.test.ts @@ -63,354 +63,374 @@ suite('Glob', () => { // console.profileEnd(); // }); + function assertGlobMatch(pattern: string | glob.IRelativePattern, input: string) { + assert(glob.match(pattern, input), `${pattern} should match ${input}`); + } + + function assertNoGlobMatch(pattern: string | glob.IRelativePattern, input: string) { + assert(!glob.match(pattern, input), `${pattern} should not match ${input}`); + } + test('simple', function () { let p = 'node_modules'; - assert(glob.match(p, 'node_modules')); - assert(!glob.match(p, 'node_module')); - assert(!glob.match(p, '/node_modules')); - assert(!glob.match(p, 'test/node_modules')); + assertGlobMatch(p, 'node_modules'); + assertNoGlobMatch(p, 'node_module'); + assertNoGlobMatch(p, '/node_modules'); + assertNoGlobMatch(p, 'test/node_modules'); p = 'test.txt'; - assert(glob.match(p, 'test.txt')); - assert(!glob.match(p, 'test?txt')); - assert(!glob.match(p, '/text.txt')); - assert(!glob.match(p, 'test/test.txt')); + assertGlobMatch(p, 'test.txt'); + assertNoGlobMatch(p, 'test?txt'); + assertNoGlobMatch(p, '/text.txt'); + assertNoGlobMatch(p, 'test/test.txt'); p = 'test(.txt'; - assert(glob.match(p, 'test(.txt')); - assert(!glob.match(p, 'test?txt')); + assertGlobMatch(p, 'test(.txt'); + assertNoGlobMatch(p, 'test?txt'); p = 'qunit'; - assert(glob.match(p, 'qunit')); - assert(!glob.match(p, 'qunit.css')); - assert(!glob.match(p, 'test/qunit')); + assertGlobMatch(p, 'qunit'); + assertNoGlobMatch(p, 'qunit.css'); + assertNoGlobMatch(p, 'test/qunit'); // Absolute p = '/DNXConsoleApp/**/*.cs'; - assert(glob.match(p, '/DNXConsoleApp/Program.cs')); - assert(glob.match(p, '/DNXConsoleApp/foo/Program.cs')); + assertGlobMatch(p, '/DNXConsoleApp/Program.cs'); + assertGlobMatch(p, '/DNXConsoleApp/foo/Program.cs'); p = 'C:/DNXConsoleApp/**/*.cs'; - assert(glob.match(p, 'C:\\DNXConsoleApp\\Program.cs')); - assert(glob.match(p, 'C:\\DNXConsoleApp\\foo\\Program.cs')); + assertGlobMatch(p, 'C:\\DNXConsoleApp\\Program.cs'); + assertGlobMatch(p, 'C:\\DNXConsoleApp\\foo\\Program.cs'); }); test('dot hidden', function () { let p = '.*'; - assert(glob.match(p, '.git')); - assert(glob.match(p, '.hidden.txt')); - assert(!glob.match(p, 'git')); - assert(!glob.match(p, 'hidden.txt')); - assert(!glob.match(p, 'path/.git')); - assert(!glob.match(p, 'path/.hidden.txt')); + assertGlobMatch(p, '.git'); + assertGlobMatch(p, '.hidden.txt'); + assertNoGlobMatch(p, 'git'); + assertNoGlobMatch(p, 'hidden.txt'); + assertNoGlobMatch(p, 'path/.git'); + assertNoGlobMatch(p, 'path/.hidden.txt'); p = '**/.*'; - assert(glob.match(p, '.git')); - assert(glob.match(p, '.hidden.txt')); - assert(!glob.match(p, 'git')); - assert(!glob.match(p, 'hidden.txt')); - assert(glob.match(p, 'path/.git')); - assert(glob.match(p, 'path/.hidden.txt')); - assert(!glob.match(p, 'path/git')); - assert(!glob.match(p, 'pat.h/hidden.txt')); + assertGlobMatch(p, '.git'); + assertGlobMatch(p, '.hidden.txt'); + assertNoGlobMatch(p, 'git'); + assertNoGlobMatch(p, 'hidden.txt'); + assertGlobMatch(p, 'path/.git'); + assertGlobMatch(p, 'path/.hidden.txt'); + assertNoGlobMatch(p, 'path/git'); + assertNoGlobMatch(p, 'pat.h/hidden.txt'); p = '._*'; - assert(glob.match(p, '._git')); - assert(glob.match(p, '._hidden.txt')); - assert(!glob.match(p, 'git')); - assert(!glob.match(p, 'hidden.txt')); - assert(!glob.match(p, 'path/._git')); - assert(!glob.match(p, 'path/._hidden.txt')); + assertGlobMatch(p, '._git'); + assertGlobMatch(p, '._hidden.txt'); + assertNoGlobMatch(p, 'git'); + assertNoGlobMatch(p, 'hidden.txt'); + assertNoGlobMatch(p, 'path/._git'); + assertNoGlobMatch(p, 'path/._hidden.txt'); p = '**/._*'; - assert(glob.match(p, '._git')); - assert(glob.match(p, '._hidden.txt')); - assert(!glob.match(p, 'git')); - assert(!glob.match(p, 'hidden._txt')); - assert(glob.match(p, 'path/._git')); - assert(glob.match(p, 'path/._hidden.txt')); - assert(!glob.match(p, 'path/git')); - assert(!glob.match(p, 'pat.h/hidden._txt')); + assertGlobMatch(p, '._git'); + assertGlobMatch(p, '._hidden.txt'); + assertNoGlobMatch(p, 'git'); + assertNoGlobMatch(p, 'hidden._txt'); + assertGlobMatch(p, 'path/._git'); + assertGlobMatch(p, 'path/._hidden.txt'); + assertNoGlobMatch(p, 'path/git'); + assertNoGlobMatch(p, 'pat.h/hidden._txt'); }); test('file pattern', function () { let p = '*.js'; - assert(glob.match(p, 'foo.js')); - assert(!glob.match(p, 'folder/foo.js')); - assert(!glob.match(p, '/node_modules/foo.js')); - assert(!glob.match(p, 'foo.jss')); - assert(!glob.match(p, 'some.js/test')); + assertGlobMatch(p, 'foo.js'); + assertNoGlobMatch(p, 'folder/foo.js'); + assertNoGlobMatch(p, '/node_modules/foo.js'); + assertNoGlobMatch(p, 'foo.jss'); + assertNoGlobMatch(p, 'some.js/test'); p = 'html.*'; - assert(glob.match(p, 'html.js')); - assert(glob.match(p, 'html.txt')); - assert(!glob.match(p, 'htm.txt')); + assertGlobMatch(p, 'html.js'); + assertGlobMatch(p, 'html.txt'); + assertNoGlobMatch(p, 'htm.txt'); p = '*.*'; - assert(glob.match(p, 'html.js')); - assert(glob.match(p, 'html.txt')); - assert(glob.match(p, 'htm.txt')); - assert(!glob.match(p, 'folder/foo.js')); - assert(!glob.match(p, '/node_modules/foo.js')); + assertGlobMatch(p, 'html.js'); + assertGlobMatch(p, 'html.txt'); + assertGlobMatch(p, 'htm.txt'); + assertNoGlobMatch(p, 'folder/foo.js'); + assertNoGlobMatch(p, '/node_modules/foo.js'); p = 'node_modules/test/*.js'; - assert(glob.match(p, 'node_modules/test/foo.js')); - assert(!glob.match(p, 'folder/foo.js')); - assert(!glob.match(p, '/node_module/test/foo.js')); - assert(!glob.match(p, 'foo.jss')); - assert(!glob.match(p, 'some.js/test')); + assertGlobMatch(p, 'node_modules/test/foo.js'); + assertNoGlobMatch(p, 'folder/foo.js'); + assertNoGlobMatch(p, '/node_module/test/foo.js'); + assertNoGlobMatch(p, 'foo.jss'); + assertNoGlobMatch(p, 'some.js/test'); }); test('star', function () { let p = 'node*modules'; - assert(glob.match(p, 'node_modules')); - assert(glob.match(p, 'node_super_modules')); - assert(!glob.match(p, 'node_module')); - assert(!glob.match(p, '/node_modules')); - assert(!glob.match(p, 'test/node_modules')); + assertGlobMatch(p, 'node_modules'); + assertGlobMatch(p, 'node_super_modules'); + assertNoGlobMatch(p, 'node_module'); + assertNoGlobMatch(p, '/node_modules'); + assertNoGlobMatch(p, 'test/node_modules'); p = '*'; - assert(glob.match(p, 'html.js')); - assert(glob.match(p, 'html.txt')); - assert(glob.match(p, 'htm.txt')); - assert(!glob.match(p, 'folder/foo.js')); - assert(!glob.match(p, '/node_modules/foo.js')); + assertGlobMatch(p, 'html.js'); + assertGlobMatch(p, 'html.txt'); + assertGlobMatch(p, 'htm.txt'); + assertNoGlobMatch(p, 'folder/foo.js'); + assertNoGlobMatch(p, '/node_modules/foo.js'); + }); + + test('file / folder match', function () { + let p = '**/node_modules/**'; + + assertGlobMatch(p, 'node_modules'); + assertGlobMatch(p, 'node_modules/'); + assertGlobMatch(p, 'a/node_modules'); + assertGlobMatch(p, 'a/node_modules/'); + assertGlobMatch(p, 'node_modules/foo'); + assertGlobMatch(p, 'foo/node_modules/foo/bar'); }); test('questionmark', function () { let p = 'node?modules'; - assert(glob.match(p, 'node_modules')); - assert(!glob.match(p, 'node_super_modules')); - assert(!glob.match(p, 'node_module')); - assert(!glob.match(p, '/node_modules')); - assert(!glob.match(p, 'test/node_modules')); + assertGlobMatch(p, 'node_modules'); + assertNoGlobMatch(p, 'node_super_modules'); + assertNoGlobMatch(p, 'node_module'); + assertNoGlobMatch(p, '/node_modules'); + assertNoGlobMatch(p, 'test/node_modules'); p = '?'; - assert(glob.match(p, 'h')); - assert(!glob.match(p, 'html.txt')); - assert(!glob.match(p, 'htm.txt')); - assert(!glob.match(p, 'folder/foo.js')); - assert(!glob.match(p, '/node_modules/foo.js')); + assertGlobMatch(p, 'h'); + assertNoGlobMatch(p, 'html.txt'); + assertNoGlobMatch(p, 'htm.txt'); + assertNoGlobMatch(p, 'folder/foo.js'); + assertNoGlobMatch(p, '/node_modules/foo.js'); }); test('globstar', function () { let p = '**/*.js'; - assert(glob.match(p, 'foo.js')); - assert(glob.match(p, 'folder/foo.js')); - assert(glob.match(p, '/node_modules/foo.js')); - assert(!glob.match(p, 'foo.jss')); - assert(!glob.match(p, 'some.js/test')); - assert(!glob.match(p, '/some.js/test')); - assert(!glob.match(p, '\\some.js\\test')); + assertGlobMatch(p, 'foo.js'); + assertGlobMatch(p, 'folder/foo.js'); + assertGlobMatch(p, '/node_modules/foo.js'); + assertNoGlobMatch(p, 'foo.jss'); + assertNoGlobMatch(p, 'some.js/test'); + assertNoGlobMatch(p, '/some.js/test'); + assertNoGlobMatch(p, '\\some.js\\test'); p = '**/project.json'; - assert(glob.match(p, 'project.json')); - assert(glob.match(p, '/project.json')); - assert(glob.match(p, 'some/folder/project.json')); - assert(!glob.match(p, 'some/folder/file_project.json')); - assert(!glob.match(p, 'some/folder/fileproject.json')); - // assert(!glob.match(p, '/rrproject.json')); TODO@ben this still fails if T1-3 are disabled - assert(!glob.match(p, 'some/rrproject.json')); - // assert(!glob.match(p, 'rrproject.json')); - // assert(!glob.match(p, '\\rrproject.json')); - assert(!glob.match(p, 'some\\rrproject.json')); + assertGlobMatch(p, 'project.json'); + assertGlobMatch(p, '/project.json'); + assertGlobMatch(p, 'some/folder/project.json'); + assertNoGlobMatch(p, 'some/folder/file_project.json'); + assertNoGlobMatch(p, 'some/folder/fileproject.json'); + // assertNoGlobMatch(p, '/rrproject.json'); TODO@ben this still fails if T1-3 are disabled + assertNoGlobMatch(p, 'some/rrproject.json'); + // assertNoGlobMatch(p, 'rrproject.json'); + // assertNoGlobMatch(p, '\\rrproject.json'); + assertNoGlobMatch(p, 'some\\rrproject.json'); p = 'test/**'; - assert(glob.match(p, 'test')); - assert(glob.match(p, 'test/foo.js')); - assert(glob.match(p, 'test/other/foo.js')); - assert(!glob.match(p, 'est/other/foo.js')); + assertGlobMatch(p, 'test'); + assertGlobMatch(p, 'test/foo.js'); + assertGlobMatch(p, 'test/other/foo.js'); + assertNoGlobMatch(p, 'est/other/foo.js'); p = '**'; - assert(glob.match(p, 'foo.js')); - assert(glob.match(p, 'folder/foo.js')); - assert(glob.match(p, '/node_modules/foo.js')); - assert(glob.match(p, 'foo.jss')); - assert(glob.match(p, 'some.js/test')); + assertGlobMatch(p, 'foo.js'); + assertGlobMatch(p, 'folder/foo.js'); + assertGlobMatch(p, '/node_modules/foo.js'); + assertGlobMatch(p, 'foo.jss'); + assertGlobMatch(p, 'some.js/test'); p = 'test/**/*.js'; - assert(glob.match(p, 'test/foo.js')); - assert(glob.match(p, 'test/other/foo.js')); - assert(glob.match(p, 'test/other/more/foo.js')); - assert(!glob.match(p, 'test/foo.ts')); - assert(!glob.match(p, 'test/other/foo.ts')); - assert(!glob.match(p, 'test/other/more/foo.ts')); + assertGlobMatch(p, 'test/foo.js'); + assertGlobMatch(p, 'test/other/foo.js'); + assertGlobMatch(p, 'test/other/more/foo.js'); + assertNoGlobMatch(p, 'test/foo.ts'); + assertNoGlobMatch(p, 'test/other/foo.ts'); + assertNoGlobMatch(p, 'test/other/more/foo.ts'); p = '**/**/*.js'; - assert(glob.match(p, 'foo.js')); - assert(glob.match(p, 'folder/foo.js')); - assert(glob.match(p, '/node_modules/foo.js')); - assert(!glob.match(p, 'foo.jss')); - assert(!glob.match(p, 'some.js/test')); + assertGlobMatch(p, 'foo.js'); + assertGlobMatch(p, 'folder/foo.js'); + assertGlobMatch(p, '/node_modules/foo.js'); + assertNoGlobMatch(p, 'foo.jss'); + assertNoGlobMatch(p, 'some.js/test'); p = '**/node_modules/**/*.js'; - assert(!glob.match(p, 'foo.js')); - assert(!glob.match(p, 'folder/foo.js')); - assert(glob.match(p, 'node_modules/foo.js')); - assert(glob.match(p, 'node_modules/some/folder/foo.js')); - assert(!glob.match(p, 'node_modules/some/folder/foo.ts')); - assert(!glob.match(p, 'foo.jss')); - assert(!glob.match(p, 'some.js/test')); + assertNoGlobMatch(p, 'foo.js'); + assertNoGlobMatch(p, 'folder/foo.js'); + assertGlobMatch(p, 'node_modules/foo.js'); + assertGlobMatch(p, 'node_modules/some/folder/foo.js'); + assertNoGlobMatch(p, 'node_modules/some/folder/foo.ts'); + assertNoGlobMatch(p, 'foo.jss'); + assertNoGlobMatch(p, 'some.js/test'); p = '{**/node_modules/**,**/.git/**,**/bower_components/**}'; - assert(glob.match(p, 'node_modules')); - assert(glob.match(p, '/node_modules')); - assert(glob.match(p, '/node_modules/more')); - assert(glob.match(p, 'some/test/node_modules')); - assert(glob.match(p, 'some\\test\\node_modules')); - assert(glob.match(p, 'C:\\\\some\\test\\node_modules')); - assert(glob.match(p, 'C:\\\\some\\test\\node_modules\\more')); + assertGlobMatch(p, 'node_modules'); + assertGlobMatch(p, '/node_modules'); + assertGlobMatch(p, '/node_modules/more'); + assertGlobMatch(p, 'some/test/node_modules'); + assertGlobMatch(p, 'some\\test\\node_modules'); + assertGlobMatch(p, 'C:\\\\some\\test\\node_modules'); + assertGlobMatch(p, 'C:\\\\some\\test\\node_modules\\more'); - assert(glob.match(p, 'bower_components')); - assert(glob.match(p, 'bower_components/more')); - assert(glob.match(p, '/bower_components')); - assert(glob.match(p, 'some/test/bower_components')); - assert(glob.match(p, 'some\\test\\bower_components')); - assert(glob.match(p, 'C:\\\\some\\test\\bower_components')); - assert(glob.match(p, 'C:\\\\some\\test\\bower_components\\more')); + assertGlobMatch(p, 'bower_components'); + assertGlobMatch(p, 'bower_components/more'); + assertGlobMatch(p, '/bower_components'); + assertGlobMatch(p, 'some/test/bower_components'); + assertGlobMatch(p, 'some\\test\\bower_components'); + assertGlobMatch(p, 'C:\\\\some\\test\\bower_components'); + assertGlobMatch(p, 'C:\\\\some\\test\\bower_components\\more'); - assert(glob.match(p, '.git')); - assert(glob.match(p, '/.git')); - assert(glob.match(p, 'some/test/.git')); - assert(glob.match(p, 'some\\test\\.git')); - assert(glob.match(p, 'C:\\\\some\\test\\.git')); + assertGlobMatch(p, '.git'); + assertGlobMatch(p, '/.git'); + assertGlobMatch(p, 'some/test/.git'); + assertGlobMatch(p, 'some\\test\\.git'); + assertGlobMatch(p, 'C:\\\\some\\test\\.git'); - assert(!glob.match(p, 'tempting')); - assert(!glob.match(p, '/tempting')); - assert(!glob.match(p, 'some/test/tempting')); - assert(!glob.match(p, 'some\\test\\tempting')); - assert(!glob.match(p, 'C:\\\\some\\test\\tempting')); + assertNoGlobMatch(p, 'tempting'); + assertNoGlobMatch(p, '/tempting'); + assertNoGlobMatch(p, 'some/test/tempting'); + assertNoGlobMatch(p, 'some\\test\\tempting'); + assertNoGlobMatch(p, 'C:\\\\some\\test\\tempting'); p = '{**/package.json,**/project.json}'; - assert(glob.match(p, 'package.json')); - assert(glob.match(p, '/package.json')); - assert(!glob.match(p, 'xpackage.json')); - assert(!glob.match(p, '/xpackage.json')); + assertGlobMatch(p, 'package.json'); + assertGlobMatch(p, '/package.json'); + assertNoGlobMatch(p, 'xpackage.json'); + assertNoGlobMatch(p, '/xpackage.json'); }); test('issue 41724', function () { let p = 'some/**/*.js'; - assert(glob.match(p, 'some/foo.js')); - assert(glob.match(p, 'some/folder/foo.js')); - assert(!glob.match(p, 'something/foo.js')); - assert(!glob.match(p, 'something/folder/foo.js')); + assertGlobMatch(p, 'some/foo.js'); + assertGlobMatch(p, 'some/folder/foo.js'); + assertNoGlobMatch(p, 'something/foo.js'); + assertNoGlobMatch(p, 'something/folder/foo.js'); p = 'some/**/*'; - assert(glob.match(p, 'some/foo.js')); - assert(glob.match(p, 'some/folder/foo.js')); - assert(!glob.match(p, 'something/foo.js')); - assert(!glob.match(p, 'something/folder/foo.js')); + assertGlobMatch(p, 'some/foo.js'); + assertGlobMatch(p, 'some/folder/foo.js'); + assertNoGlobMatch(p, 'something/foo.js'); + assertNoGlobMatch(p, 'something/folder/foo.js'); }); test('brace expansion', function () { let p = '*.{html,js}'; - assert(glob.match(p, 'foo.js')); - assert(glob.match(p, 'foo.html')); - assert(!glob.match(p, 'folder/foo.js')); - assert(!glob.match(p, '/node_modules/foo.js')); - assert(!glob.match(p, 'foo.jss')); - assert(!glob.match(p, 'some.js/test')); + assertGlobMatch(p, 'foo.js'); + assertGlobMatch(p, 'foo.html'); + assertNoGlobMatch(p, 'folder/foo.js'); + assertNoGlobMatch(p, '/node_modules/foo.js'); + assertNoGlobMatch(p, 'foo.jss'); + assertNoGlobMatch(p, 'some.js/test'); p = '*.{html}'; - assert(glob.match(p, 'foo.html')); - assert(!glob.match(p, 'foo.js')); - assert(!glob.match(p, 'folder/foo.js')); - assert(!glob.match(p, '/node_modules/foo.js')); - assert(!glob.match(p, 'foo.jss')); - assert(!glob.match(p, 'some.js/test')); + assertGlobMatch(p, 'foo.html'); + assertNoGlobMatch(p, 'foo.js'); + assertNoGlobMatch(p, 'folder/foo.js'); + assertNoGlobMatch(p, '/node_modules/foo.js'); + assertNoGlobMatch(p, 'foo.jss'); + assertNoGlobMatch(p, 'some.js/test'); p = '{node_modules,testing}'; - assert(glob.match(p, 'node_modules')); - assert(glob.match(p, 'testing')); - assert(!glob.match(p, 'node_module')); - assert(!glob.match(p, 'dtesting')); + assertGlobMatch(p, 'node_modules'); + assertGlobMatch(p, 'testing'); + assertNoGlobMatch(p, 'node_module'); + assertNoGlobMatch(p, 'dtesting'); p = '**/{foo,bar}'; - assert(glob.match(p, 'foo')); - assert(glob.match(p, 'bar')); - assert(glob.match(p, 'test/foo')); - assert(glob.match(p, 'test/bar')); - assert(glob.match(p, 'other/more/foo')); - assert(glob.match(p, 'other/more/bar')); + assertGlobMatch(p, 'foo'); + assertGlobMatch(p, 'bar'); + assertGlobMatch(p, 'test/foo'); + assertGlobMatch(p, 'test/bar'); + assertGlobMatch(p, 'other/more/foo'); + assertGlobMatch(p, 'other/more/bar'); p = '{foo,bar}/**'; - assert(glob.match(p, 'foo')); - assert(glob.match(p, 'bar')); - assert(glob.match(p, 'foo/test')); - assert(glob.match(p, 'bar/test')); - assert(glob.match(p, 'foo/other/more')); - assert(glob.match(p, 'bar/other/more')); + assertGlobMatch(p, 'foo'); + assertGlobMatch(p, 'bar'); + assertGlobMatch(p, 'foo/test'); + assertGlobMatch(p, 'bar/test'); + assertGlobMatch(p, 'foo/other/more'); + assertGlobMatch(p, 'bar/other/more'); p = '{**/*.d.ts,**/*.js}'; - assert(glob.match(p, 'foo.js')); - assert(glob.match(p, 'testing/foo.js')); - assert(glob.match(p, 'testing\\foo.js')); - assert(glob.match(p, '/testing/foo.js')); - assert(glob.match(p, '\\testing\\foo.js')); - assert(glob.match(p, 'C:\\testing\\foo.js')); + assertGlobMatch(p, 'foo.js'); + assertGlobMatch(p, 'testing/foo.js'); + assertGlobMatch(p, 'testing\\foo.js'); + assertGlobMatch(p, '/testing/foo.js'); + assertGlobMatch(p, '\\testing\\foo.js'); + assertGlobMatch(p, 'C:\\testing\\foo.js'); - assert(glob.match(p, 'foo.d.ts')); - assert(glob.match(p, 'testing/foo.d.ts')); - assert(glob.match(p, 'testing\\foo.d.ts')); - assert(glob.match(p, '/testing/foo.d.ts')); - assert(glob.match(p, '\\testing\\foo.d.ts')); - assert(glob.match(p, 'C:\\testing\\foo.d.ts')); + assertGlobMatch(p, 'foo.d.ts'); + assertGlobMatch(p, 'testing/foo.d.ts'); + assertGlobMatch(p, 'testing\\foo.d.ts'); + assertGlobMatch(p, '/testing/foo.d.ts'); + assertGlobMatch(p, '\\testing\\foo.d.ts'); + assertGlobMatch(p, 'C:\\testing\\foo.d.ts'); - assert(!glob.match(p, 'foo.d')); - assert(!glob.match(p, 'testing/foo.d')); - assert(!glob.match(p, 'testing\\foo.d')); - assert(!glob.match(p, '/testing/foo.d')); - assert(!glob.match(p, '\\testing\\foo.d')); - assert(!glob.match(p, 'C:\\testing\\foo.d')); + assertNoGlobMatch(p, 'foo.d'); + assertNoGlobMatch(p, 'testing/foo.d'); + assertNoGlobMatch(p, 'testing\\foo.d'); + assertNoGlobMatch(p, '/testing/foo.d'); + assertNoGlobMatch(p, '\\testing\\foo.d'); + assertNoGlobMatch(p, 'C:\\testing\\foo.d'); p = '{**/*.d.ts,**/*.js,path/simple.jgs}'; - assert(glob.match(p, 'foo.js')); - assert(glob.match(p, 'testing/foo.js')); - assert(glob.match(p, 'testing\\foo.js')); - assert(glob.match(p, '/testing/foo.js')); - assert(glob.match(p, 'path/simple.jgs')); - assert(!glob.match(p, '/path/simple.jgs')); - assert(glob.match(p, '\\testing\\foo.js')); - assert(glob.match(p, 'C:\\testing\\foo.js')); + assertGlobMatch(p, 'foo.js'); + assertGlobMatch(p, 'testing/foo.js'); + assertGlobMatch(p, 'testing\\foo.js'); + assertGlobMatch(p, '/testing/foo.js'); + assertGlobMatch(p, 'path/simple.jgs'); + assertNoGlobMatch(p, '/path/simple.jgs'); + assertGlobMatch(p, '\\testing\\foo.js'); + assertGlobMatch(p, 'C:\\testing\\foo.js'); p = '{**/*.d.ts,**/*.js,foo.[0-9]}'; - assert(glob.match(p, 'foo.5')); - assert(glob.match(p, 'foo.8')); - assert(!glob.match(p, 'bar.5')); - assert(!glob.match(p, 'foo.f')); - assert(glob.match(p, 'foo.js')); + assertGlobMatch(p, 'foo.5'); + assertGlobMatch(p, 'foo.8'); + assertNoGlobMatch(p, 'bar.5'); + assertNoGlobMatch(p, 'foo.f'); + assertGlobMatch(p, 'foo.js'); p = 'prefix/{**/*.d.ts,**/*.js,foo.[0-9]}'; - assert(glob.match(p, 'prefix/foo.5')); - assert(glob.match(p, 'prefix/foo.8')); - assert(!glob.match(p, 'prefix/bar.5')); - assert(!glob.match(p, 'prefix/foo.f')); - assert(glob.match(p, 'prefix/foo.js')); + assertGlobMatch(p, 'prefix/foo.5'); + assertGlobMatch(p, 'prefix/foo.8'); + assertNoGlobMatch(p, 'prefix/bar.5'); + assertNoGlobMatch(p, 'prefix/foo.f'); + assertGlobMatch(p, 'prefix/foo.js'); }); test('expression support (single)', function () { let siblings = ['test.html', 'test.txt', 'test.ts', 'test.js']; + let hasSibling = name => siblings.indexOf(name) !== -1; // { "**/*.js": { "when": "$(basename).ts" } } let expression: glob.IExpression = { @@ -419,9 +439,9 @@ suite('Glob', () => { } }; - assert.strictEqual('**/*.js', glob.match(expression, 'test.js', () => siblings)); - assert.strictEqual(glob.match(expression, 'test.js', () => []), null); - assert.strictEqual(glob.match(expression, 'test.js', () => ['te.ts']), null); + assert.strictEqual('**/*.js', glob.match(expression, 'test.js', hasSibling)); + assert.strictEqual(glob.match(expression, 'test.js', () => false), null); + assert.strictEqual(glob.match(expression, 'test.js', name => name === 'te.ts'), null); assert.strictEqual(glob.match(expression, 'test.js'), null); expression = { @@ -430,22 +450,23 @@ suite('Glob', () => { } }; - assert.strictEqual(glob.match(expression, 'test.js', () => siblings), null); + assert.strictEqual(glob.match(expression, 'test.js', hasSibling), null); expression = { '**/*.js': { } }; - assert.strictEqual('**/*.js', glob.match(expression, 'test.js', () => siblings)); + assert.strictEqual('**/*.js', glob.match(expression, 'test.js', hasSibling)); expression = {}; - assert.strictEqual(glob.match(expression, 'test.js', () => siblings), null); + assert.strictEqual(glob.match(expression, 'test.js', hasSibling), null); }); test('expression support (multiple)', function () { let siblings = ['test.html', 'test.txt', 'test.ts', 'test.js']; + let hasSibling = name => siblings.indexOf(name) !== -1; // { "**/*.js": { "when": "$(basename).ts" } } let expression: glob.IExpression = { @@ -455,67 +476,67 @@ suite('Glob', () => { '**/*.bananas': { bananas: true } }; - assert.strictEqual('**/*.js', glob.match(expression, 'test.js', () => siblings)); - assert.strictEqual('**/*.as', glob.match(expression, 'test.as', () => siblings)); - assert.strictEqual('**/*.bananas', glob.match(expression, 'test.bananas', () => siblings)); + assert.strictEqual('**/*.js', glob.match(expression, 'test.js', hasSibling)); + assert.strictEqual('**/*.as', glob.match(expression, 'test.as', hasSibling)); + assert.strictEqual('**/*.bananas', glob.match(expression, 'test.bananas', hasSibling)); assert.strictEqual('**/*.bananas', glob.match(expression, 'test.bananas')); - assert.strictEqual(glob.match(expression, 'test.foo', () => siblings), null); + assert.strictEqual(glob.match(expression, 'test.foo', hasSibling), null); }); test('brackets', function () { let p = 'foo.[0-9]'; - assert(glob.match(p, 'foo.5')); - assert(glob.match(p, 'foo.8')); - assert(!glob.match(p, 'bar.5')); - assert(!glob.match(p, 'foo.f')); + assertGlobMatch(p, 'foo.5'); + assertGlobMatch(p, 'foo.8'); + assertNoGlobMatch(p, 'bar.5'); + assertNoGlobMatch(p, 'foo.f'); p = 'foo.[^0-9]'; - assert(!glob.match(p, 'foo.5')); - assert(!glob.match(p, 'foo.8')); - assert(!glob.match(p, 'bar.5')); - assert(glob.match(p, 'foo.f')); + assertNoGlobMatch(p, 'foo.5'); + assertNoGlobMatch(p, 'foo.8'); + assertNoGlobMatch(p, 'bar.5'); + assertGlobMatch(p, 'foo.f'); p = 'foo.[!0-9]'; - assert(!glob.match(p, 'foo.5')); - assert(!glob.match(p, 'foo.8')); - assert(!glob.match(p, 'bar.5')); - assert(glob.match(p, 'foo.f')); + assertNoGlobMatch(p, 'foo.5'); + assertNoGlobMatch(p, 'foo.8'); + assertNoGlobMatch(p, 'bar.5'); + assertGlobMatch(p, 'foo.f'); p = 'foo.[0!^*?]'; - assert(!glob.match(p, 'foo.5')); - assert(!glob.match(p, 'foo.8')); - assert(glob.match(p, 'foo.0')); - assert(glob.match(p, 'foo.!')); - assert(glob.match(p, 'foo.^')); - assert(glob.match(p, 'foo.*')); - assert(glob.match(p, 'foo.?')); + assertNoGlobMatch(p, 'foo.5'); + assertNoGlobMatch(p, 'foo.8'); + assertGlobMatch(p, 'foo.0'); + assertGlobMatch(p, 'foo.!'); + assertGlobMatch(p, 'foo.^'); + assertGlobMatch(p, 'foo.*'); + assertGlobMatch(p, 'foo.?'); p = 'foo[/]bar'; - assert(!glob.match(p, 'foo/bar')); + assertNoGlobMatch(p, 'foo/bar'); p = 'foo.[[]'; - assert(glob.match(p, 'foo.[')); + assertGlobMatch(p, 'foo.['); p = 'foo.[]]'; - assert(glob.match(p, 'foo.]')); + assertGlobMatch(p, 'foo.]'); p = 'foo.[][!]'; - assert(glob.match(p, 'foo.]')); - assert(glob.match(p, 'foo.[')); - assert(glob.match(p, 'foo.!')); + assertGlobMatch(p, 'foo.]'); + assertGlobMatch(p, 'foo.['); + assertGlobMatch(p, 'foo.!'); p = 'foo.[]-]'; - assert(glob.match(p, 'foo.]')); - assert(glob.match(p, 'foo.-')); + assertGlobMatch(p, 'foo.]'); + assertGlobMatch(p, 'foo.-'); }); test('full path', function () { @@ -527,111 +548,111 @@ suite('Glob', () => { test('prefix agnostic', function () { let p = '**/*.js'; - assert(glob.match(p, 'foo.js')); - assert(glob.match(p, '/foo.js')); - assert(glob.match(p, '\\foo.js')); - assert(glob.match(p, 'testing/foo.js')); - assert(glob.match(p, 'testing\\foo.js')); - assert(glob.match(p, '/testing/foo.js')); - assert(glob.match(p, '\\testing\\foo.js')); - assert(glob.match(p, 'C:\\testing\\foo.js')); + assertGlobMatch(p, 'foo.js'); + assertGlobMatch(p, '/foo.js'); + assertGlobMatch(p, '\\foo.js'); + assertGlobMatch(p, 'testing/foo.js'); + assertGlobMatch(p, 'testing\\foo.js'); + assertGlobMatch(p, '/testing/foo.js'); + assertGlobMatch(p, '\\testing\\foo.js'); + assertGlobMatch(p, 'C:\\testing\\foo.js'); - assert(!glob.match(p, 'foo.ts')); - assert(!glob.match(p, 'testing/foo.ts')); - assert(!glob.match(p, 'testing\\foo.ts')); - assert(!glob.match(p, '/testing/foo.ts')); - assert(!glob.match(p, '\\testing\\foo.ts')); - assert(!glob.match(p, 'C:\\testing\\foo.ts')); + assertNoGlobMatch(p, 'foo.ts'); + assertNoGlobMatch(p, 'testing/foo.ts'); + assertNoGlobMatch(p, 'testing\\foo.ts'); + assertNoGlobMatch(p, '/testing/foo.ts'); + assertNoGlobMatch(p, '\\testing\\foo.ts'); + assertNoGlobMatch(p, 'C:\\testing\\foo.ts'); - assert(!glob.match(p, 'foo.js.txt')); - assert(!glob.match(p, 'testing/foo.js.txt')); - assert(!glob.match(p, 'testing\\foo.js.txt')); - assert(!glob.match(p, '/testing/foo.js.txt')); - assert(!glob.match(p, '\\testing\\foo.js.txt')); - assert(!glob.match(p, 'C:\\testing\\foo.js.txt')); + assertNoGlobMatch(p, 'foo.js.txt'); + assertNoGlobMatch(p, 'testing/foo.js.txt'); + assertNoGlobMatch(p, 'testing\\foo.js.txt'); + assertNoGlobMatch(p, '/testing/foo.js.txt'); + assertNoGlobMatch(p, '\\testing\\foo.js.txt'); + assertNoGlobMatch(p, 'C:\\testing\\foo.js.txt'); - assert(!glob.match(p, 'testing.js/foo')); - assert(!glob.match(p, 'testing.js\\foo')); - assert(!glob.match(p, '/testing.js/foo')); - assert(!glob.match(p, '\\testing.js\\foo')); - assert(!glob.match(p, 'C:\\testing.js\\foo')); + assertNoGlobMatch(p, 'testing.js/foo'); + assertNoGlobMatch(p, 'testing.js\\foo'); + assertNoGlobMatch(p, '/testing.js/foo'); + assertNoGlobMatch(p, '\\testing.js\\foo'); + assertNoGlobMatch(p, 'C:\\testing.js\\foo'); p = '**/foo.js'; - assert(glob.match(p, 'foo.js')); - assert(glob.match(p, '/foo.js')); - assert(glob.match(p, '\\foo.js')); - assert(glob.match(p, 'testing/foo.js')); - assert(glob.match(p, 'testing\\foo.js')); - assert(glob.match(p, '/testing/foo.js')); - assert(glob.match(p, '\\testing\\foo.js')); - assert(glob.match(p, 'C:\\testing\\foo.js')); + assertGlobMatch(p, 'foo.js'); + assertGlobMatch(p, '/foo.js'); + assertGlobMatch(p, '\\foo.js'); + assertGlobMatch(p, 'testing/foo.js'); + assertGlobMatch(p, 'testing\\foo.js'); + assertGlobMatch(p, '/testing/foo.js'); + assertGlobMatch(p, '\\testing\\foo.js'); + assertGlobMatch(p, 'C:\\testing\\foo.js'); }); test('cached properly', function () { let p = '**/*.js'; - assert(glob.match(p, 'foo.js')); - assert(glob.match(p, 'testing/foo.js')); - assert(glob.match(p, 'testing\\foo.js')); - assert(glob.match(p, '/testing/foo.js')); - assert(glob.match(p, '\\testing\\foo.js')); - assert(glob.match(p, 'C:\\testing\\foo.js')); + assertGlobMatch(p, 'foo.js'); + assertGlobMatch(p, 'testing/foo.js'); + assertGlobMatch(p, 'testing\\foo.js'); + assertGlobMatch(p, '/testing/foo.js'); + assertGlobMatch(p, '\\testing\\foo.js'); + assertGlobMatch(p, 'C:\\testing\\foo.js'); - assert(!glob.match(p, 'foo.ts')); - assert(!glob.match(p, 'testing/foo.ts')); - assert(!glob.match(p, 'testing\\foo.ts')); - assert(!glob.match(p, '/testing/foo.ts')); - assert(!glob.match(p, '\\testing\\foo.ts')); - assert(!glob.match(p, 'C:\\testing\\foo.ts')); + assertNoGlobMatch(p, 'foo.ts'); + assertNoGlobMatch(p, 'testing/foo.ts'); + assertNoGlobMatch(p, 'testing\\foo.ts'); + assertNoGlobMatch(p, '/testing/foo.ts'); + assertNoGlobMatch(p, '\\testing\\foo.ts'); + assertNoGlobMatch(p, 'C:\\testing\\foo.ts'); - assert(!glob.match(p, 'foo.js.txt')); - assert(!glob.match(p, 'testing/foo.js.txt')); - assert(!glob.match(p, 'testing\\foo.js.txt')); - assert(!glob.match(p, '/testing/foo.js.txt')); - assert(!glob.match(p, '\\testing\\foo.js.txt')); - assert(!glob.match(p, 'C:\\testing\\foo.js.txt')); + assertNoGlobMatch(p, 'foo.js.txt'); + assertNoGlobMatch(p, 'testing/foo.js.txt'); + assertNoGlobMatch(p, 'testing\\foo.js.txt'); + assertNoGlobMatch(p, '/testing/foo.js.txt'); + assertNoGlobMatch(p, '\\testing\\foo.js.txt'); + assertNoGlobMatch(p, 'C:\\testing\\foo.js.txt'); - assert(!glob.match(p, 'testing.js/foo')); - assert(!glob.match(p, 'testing.js\\foo')); - assert(!glob.match(p, '/testing.js/foo')); - assert(!glob.match(p, '\\testing.js\\foo')); - assert(!glob.match(p, 'C:\\testing.js\\foo')); + assertNoGlobMatch(p, 'testing.js/foo'); + assertNoGlobMatch(p, 'testing.js\\foo'); + assertNoGlobMatch(p, '/testing.js/foo'); + assertNoGlobMatch(p, '\\testing.js\\foo'); + assertNoGlobMatch(p, 'C:\\testing.js\\foo'); // Run again and make sure the regex are properly reused - assert(glob.match(p, 'foo.js')); - assert(glob.match(p, 'testing/foo.js')); - assert(glob.match(p, 'testing\\foo.js')); - assert(glob.match(p, '/testing/foo.js')); - assert(glob.match(p, '\\testing\\foo.js')); - assert(glob.match(p, 'C:\\testing\\foo.js')); + assertGlobMatch(p, 'foo.js'); + assertGlobMatch(p, 'testing/foo.js'); + assertGlobMatch(p, 'testing\\foo.js'); + assertGlobMatch(p, '/testing/foo.js'); + assertGlobMatch(p, '\\testing\\foo.js'); + assertGlobMatch(p, 'C:\\testing\\foo.js'); - assert(!glob.match(p, 'foo.ts')); - assert(!glob.match(p, 'testing/foo.ts')); - assert(!glob.match(p, 'testing\\foo.ts')); - assert(!glob.match(p, '/testing/foo.ts')); - assert(!glob.match(p, '\\testing\\foo.ts')); - assert(!glob.match(p, 'C:\\testing\\foo.ts')); + assertNoGlobMatch(p, 'foo.ts'); + assertNoGlobMatch(p, 'testing/foo.ts'); + assertNoGlobMatch(p, 'testing\\foo.ts'); + assertNoGlobMatch(p, '/testing/foo.ts'); + assertNoGlobMatch(p, '\\testing\\foo.ts'); + assertNoGlobMatch(p, 'C:\\testing\\foo.ts'); - assert(!glob.match(p, 'foo.js.txt')); - assert(!glob.match(p, 'testing/foo.js.txt')); - assert(!glob.match(p, 'testing\\foo.js.txt')); - assert(!glob.match(p, '/testing/foo.js.txt')); - assert(!glob.match(p, '\\testing\\foo.js.txt')); - assert(!glob.match(p, 'C:\\testing\\foo.js.txt')); + assertNoGlobMatch(p, 'foo.js.txt'); + assertNoGlobMatch(p, 'testing/foo.js.txt'); + assertNoGlobMatch(p, 'testing\\foo.js.txt'); + assertNoGlobMatch(p, '/testing/foo.js.txt'); + assertNoGlobMatch(p, '\\testing\\foo.js.txt'); + assertNoGlobMatch(p, 'C:\\testing\\foo.js.txt'); - assert(!glob.match(p, 'testing.js/foo')); - assert(!glob.match(p, 'testing.js\\foo')); - assert(!glob.match(p, '/testing.js/foo')); - assert(!glob.match(p, '\\testing.js\\foo')); - assert(!glob.match(p, 'C:\\testing.js\\foo')); + assertNoGlobMatch(p, 'testing.js/foo'); + assertNoGlobMatch(p, 'testing.js\\foo'); + assertNoGlobMatch(p, '/testing.js/foo'); + assertNoGlobMatch(p, '\\testing.js\\foo'); + assertNoGlobMatch(p, 'C:\\testing.js\\foo'); }); test('invalid glob', function () { let p = '**/*(.js'; - assert(!glob.match(p, 'foo.js')); + assertNoGlobMatch(p, 'foo.js'); }); test('split glob aware', function () { @@ -694,15 +715,16 @@ suite('Glob', () => { '**/*.js': { when: '$(basename).ts' } }; - let sibilings = () => ['foo.ts', 'foo.js', 'foo', 'bar']; + let siblings = ['foo.ts', 'foo.js', 'foo', 'bar']; + let hasSibling = name => siblings.indexOf(name) !== -1; - assert.strictEqual(glob.match(expr, 'bar', sibilings), '**/bar'); - assert.strictEqual(glob.match(expr, 'foo', sibilings), null); - assert.strictEqual(glob.match(expr, 'foo/bar', sibilings), '**/bar'); - assert.strictEqual(glob.match(expr, 'foo\\bar', sibilings), '**/bar'); - assert.strictEqual(glob.match(expr, 'foo/foo', sibilings), null); - assert.strictEqual(glob.match(expr, 'foo.js', sibilings), '**/*.js'); - assert.strictEqual(glob.match(expr, 'bar.js', sibilings), null); + assert.strictEqual(glob.match(expr, 'bar', hasSibling), '**/bar'); + assert.strictEqual(glob.match(expr, 'foo', hasSibling), null); + assert.strictEqual(glob.match(expr, 'foo/bar', hasSibling), '**/bar'); + assert.strictEqual(glob.match(expr, 'foo\\bar', hasSibling), '**/bar'); + assert.strictEqual(glob.match(expr, 'foo/foo', hasSibling), null); + assert.strictEqual(glob.match(expr, 'foo.js', hasSibling), '**/*.js'); + assert.strictEqual(glob.match(expr, 'bar.js', hasSibling), null); }); test('expression with multipe basename globs', function () { @@ -747,10 +769,11 @@ suite('Glob', () => { assert.strictEqual(glob.parse('{**/baz,**/foo}')('baz/foo', 'foo'), true); let expr = { '**/*.js': { when: '$(basename).ts' } }; - let sibilings = () => ['foo.ts', 'foo.js']; + let siblings = ['foo.ts', 'foo.js']; + let hasSibling = name => siblings.indexOf(name) !== -1; - assert.strictEqual(glob.parse(expr)('bar/baz.js', 'baz.js', sibilings), null); - assert.strictEqual(glob.parse(expr)('bar/foo.js', 'foo.js', sibilings), '**/*.js'); + assert.strictEqual(glob.parse(expr)('bar/baz.js', 'baz.js', hasSibling), null); + assert.strictEqual(glob.parse(expr)('bar/foo.js', 'foo.js', hasSibling), '**/*.js'); }); test('expression/pattern basename terms', function () { @@ -790,7 +813,8 @@ suite('Glob', () => { ['bar/nope', null] ]); - const siblingsFn = () => ['baz', 'baz.zip', 'nope']; + const siblings = ['baz', 'baz.zip', 'nope']; + const hasSibling = name => siblings.indexOf(name) !== -1; testOptimizationForBasenames({ '**/foo/**': { when: '$(basename).zip' }, '**/bar/**': true @@ -801,12 +825,12 @@ suite('Glob', () => { ['foo/bar', '**/bar/**'], ], [ null, - siblingsFn, - siblingsFn + hasSibling, + hasSibling ]); }); - function testOptimizationForBasenames(pattern: string | glob.IExpression, basenameTerms: string[], matches: [string, string | boolean][], siblingsFns: (() => string[])[] = []) { + function testOptimizationForBasenames(pattern: string | glob.IExpression, basenameTerms: string[], matches: [string, string | boolean][], siblingsFns: ((name: string) => boolean)[] = []) { const parsed = glob.parse(pattern, { trimForExclusions: true }); assert.deepStrictEqual(glob.getBasenameTerms(parsed), basenameTerms); matches.forEach(([text, result], i) => { @@ -895,7 +919,8 @@ suite('Glob', () => { [nativeSep('/foo/bar/nope'), null] ]); - const siblingsFn = () => ['baz', 'baz.zip', 'nope']; + const siblings = ['baz', 'baz.zip', 'nope']; + let hasSibling = name => siblings.indexOf(name) !== -1; testOptimizationForPaths({ '**/foo/123/**': { when: '$(basename).zip' }, '**/bar/123/**': true @@ -906,12 +931,12 @@ suite('Glob', () => { [nativeSep('foo/bar/123'), '**/bar/123/**'], ], [ null, - siblingsFn, - siblingsFn + hasSibling, + hasSibling ]); }); - function testOptimizationForPaths(pattern: string | glob.IExpression, pathTerms: string[], matches: [string, string | boolean][], siblingsFns: (() => string[])[] = []) { + function testOptimizationForPaths(pattern: string | glob.IExpression, pathTerms: string[], matches: [string, string | boolean][], siblingsFns: ((name: string) => boolean)[] = []) { const parsed = glob.parse(pattern, { trimForExclusions: true }); assert.deepStrictEqual(glob.getPathTerms(parsed), pathTerms); matches.forEach(([text, result], i) => { @@ -926,48 +951,48 @@ suite('Glob', () => { test('relative pattern - glob star', function () { if (isWindows) { let p: glob.IRelativePattern = { base: 'C:\\DNXConsoleApp\\foo', pattern: '**/*.cs', pathToRelative: (from, to) => path.relative(from, to) }; - assert(glob.match(p, 'C:\\DNXConsoleApp\\foo\\Program.cs')); - assert(glob.match(p, 'C:\\DNXConsoleApp\\foo\\bar\\Program.cs')); - assert(!glob.match(p, 'C:\\DNXConsoleApp\\foo\\Program.ts')); - assert(!glob.match(p, 'C:\\DNXConsoleApp\\Program.cs')); - assert(!glob.match(p, 'C:\\other\\DNXConsoleApp\\foo\\Program.ts')); + assertGlobMatch(p, 'C:\\DNXConsoleApp\\foo\\Program.cs'); + assertGlobMatch(p, 'C:\\DNXConsoleApp\\foo\\bar\\Program.cs'); + assertNoGlobMatch(p, 'C:\\DNXConsoleApp\\foo\\Program.ts'); + assertNoGlobMatch(p, 'C:\\DNXConsoleApp\\Program.cs'); + assertNoGlobMatch(p, 'C:\\other\\DNXConsoleApp\\foo\\Program.ts'); } else { let p: glob.IRelativePattern = { base: '/DNXConsoleApp/foo', pattern: '**/*.cs', pathToRelative: (from, to) => path.relative(from, to) }; - assert(glob.match(p, '/DNXConsoleApp/foo/Program.cs')); - assert(glob.match(p, '/DNXConsoleApp/foo/bar/Program.cs')); - assert(!glob.match(p, '/DNXConsoleApp/foo/Program.ts')); - assert(!glob.match(p, '/DNXConsoleApp/Program.cs')); - assert(!glob.match(p, '/other/DNXConsoleApp/foo/Program.ts')); + assertGlobMatch(p, '/DNXConsoleApp/foo/Program.cs'); + assertGlobMatch(p, '/DNXConsoleApp/foo/bar/Program.cs'); + assertNoGlobMatch(p, '/DNXConsoleApp/foo/Program.ts'); + assertNoGlobMatch(p, '/DNXConsoleApp/Program.cs'); + assertNoGlobMatch(p, '/other/DNXConsoleApp/foo/Program.ts'); } }); test('relative pattern - single star', function () { if (isWindows) { let p: glob.IRelativePattern = { base: 'C:\\DNXConsoleApp\\foo', pattern: '*.cs', pathToRelative: (from, to) => path.relative(from, to) }; - assert(glob.match(p, 'C:\\DNXConsoleApp\\foo\\Program.cs')); - assert(!glob.match(p, 'C:\\DNXConsoleApp\\foo\\bar\\Program.cs')); - assert(!glob.match(p, 'C:\\DNXConsoleApp\\foo\\Program.ts')); - assert(!glob.match(p, 'C:\\DNXConsoleApp\\Program.cs')); - assert(!glob.match(p, 'C:\\other\\DNXConsoleApp\\foo\\Program.ts')); + assertGlobMatch(p, 'C:\\DNXConsoleApp\\foo\\Program.cs'); + assertNoGlobMatch(p, 'C:\\DNXConsoleApp\\foo\\bar\\Program.cs'); + assertNoGlobMatch(p, 'C:\\DNXConsoleApp\\foo\\Program.ts'); + assertNoGlobMatch(p, 'C:\\DNXConsoleApp\\Program.cs'); + assertNoGlobMatch(p, 'C:\\other\\DNXConsoleApp\\foo\\Program.ts'); } else { let p: glob.IRelativePattern = { base: '/DNXConsoleApp/foo', pattern: '*.cs', pathToRelative: (from, to) => path.relative(from, to) }; - assert(glob.match(p, '/DNXConsoleApp/foo/Program.cs')); - assert(!glob.match(p, '/DNXConsoleApp/foo/bar/Program.cs')); - assert(!glob.match(p, '/DNXConsoleApp/foo/Program.ts')); - assert(!glob.match(p, '/DNXConsoleApp/Program.cs')); - assert(!glob.match(p, '/other/DNXConsoleApp/foo/Program.ts')); + assertGlobMatch(p, '/DNXConsoleApp/foo/Program.cs'); + assertNoGlobMatch(p, '/DNXConsoleApp/foo/bar/Program.cs'); + assertNoGlobMatch(p, '/DNXConsoleApp/foo/Program.ts'); + assertNoGlobMatch(p, '/DNXConsoleApp/Program.cs'); + assertNoGlobMatch(p, '/other/DNXConsoleApp/foo/Program.ts'); } }); test('relative pattern - single star with path', function () { if (isWindows) { let p: glob.IRelativePattern = { base: 'C:\\DNXConsoleApp\\foo', pattern: 'something/*.cs', pathToRelative: (from, to) => path.relative(from, to) }; - assert(glob.match(p, 'C:\\DNXConsoleApp\\foo\\something\\Program.cs')); - assert(!glob.match(p, 'C:\\DNXConsoleApp\\foo\\Program.cs')); + assertGlobMatch(p, 'C:\\DNXConsoleApp\\foo\\something\\Program.cs'); + assertNoGlobMatch(p, 'C:\\DNXConsoleApp\\foo\\Program.cs'); } else { let p: glob.IRelativePattern = { base: '/DNXConsoleApp/foo', pattern: 'something/*.cs', pathToRelative: (from, to) => path.relative(from, to) }; - assert(glob.match(p, '/DNXConsoleApp/foo/something/Program.cs')); - assert(!glob.match(p, '/DNXConsoleApp/foo/Program.cs')); + assertGlobMatch(p, '/DNXConsoleApp/foo/something/Program.cs'); + assertNoGlobMatch(p, '/DNXConsoleApp/foo/Program.cs'); } }); diff --git a/src/vs/base/test/node/id.test.ts b/src/vs/base/test/node/id.test.ts index 7c8d5395b3..eac4953e54 100644 --- a/src/vs/base/test/node/id.test.ts +++ b/src/vs/base/test/node/id.test.ts @@ -5,6 +5,7 @@ 'use strict'; import * as assert from 'assert'; +import * as getmac from 'getmac'; import { getMachineId } from 'vs/base/node/id'; suite('ID', () => { @@ -14,4 +15,12 @@ suite('ID', () => { assert.ok(id); }); }); + + test('getMac', function () { + return new Promise((resolve, reject) => { + getmac.getMac((err, macAddress) => err ? reject(err) : resolve(macAddress)); + }).then(macAddress => { + assert.ok(/^([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})$/.test(macAddress), `Expected a MAC address, got: ${macAddress}`); + }); + }); }); \ No newline at end of file diff --git a/src/vs/base/test/node/uri.test.data.txt b/src/vs/base/test/node/uri.test.data.txt new file mode 100644 index 0000000000..bb0b5b6295 --- /dev/null +++ b/src/vs/base/test/node/uri.test.data.txt @@ -0,0 +1,3061 @@ +/users/foo/src +/users/foo/src/vs +/users/foo/src/vs/monaco.d.ts +/users/foo/src/vs/nls.d.ts +/users/foo/src/vs/nls.js +/users/foo/src/vs/platform +/users/foo/src/vs/platform/keybinding +/users/foo/src/vs/platform/keybinding/test +/users/foo/src/vs/platform/keybinding/test/common +/users/foo/src/vs/platform/keybinding/test/common/keybindingLabels.test.ts +/users/foo/src/vs/platform/keybinding/test/common/abstractKeybindingService.test.ts +/users/foo/src/vs/platform/keybinding/test/common/mockKeybindingService.ts +/users/foo/src/vs/platform/keybinding/test/common/keybindingResolver.test.ts +/users/foo/src/vs/platform/keybinding/common +/users/foo/src/vs/platform/keybinding/common/keybinding.ts +/users/foo/src/vs/platform/keybinding/common/usLayoutResolvedKeybinding.ts +/users/foo/src/vs/platform/keybinding/common/abstractKeybindingService.ts +/users/foo/src/vs/platform/keybinding/common/resolvedKeybindingItem.ts +/users/foo/src/vs/platform/keybinding/common/keybindingsRegistry.ts +/users/foo/src/vs/platform/keybinding/common/keybindingResolver.ts +/users/foo/src/vs/platform/configuration +/users/foo/src/vs/platform/configuration/test +/users/foo/src/vs/platform/configuration/test/common +/users/foo/src/vs/platform/configuration/test/common/configurationModels.test.ts +/users/foo/src/vs/platform/configuration/test/common/testConfigurationService.ts +/users/foo/src/vs/platform/configuration/test/common/configuration.test.ts +/users/foo/src/vs/platform/configuration/test/node +/users/foo/src/vs/platform/configuration/test/node/configurationService.test.ts +/users/foo/src/vs/platform/configuration/common +/users/foo/src/vs/platform/configuration/common/configurationModels.ts +/users/foo/src/vs/platform/configuration/common/configuration.ts +/users/foo/src/vs/platform/configuration/common/configurationRegistry.ts +/users/foo/src/vs/platform/configuration/node +/users/foo/src/vs/platform/configuration/node/configurationService.ts +/users/foo/src/vs/platform/configuration/node/configuration.ts +/users/foo/src/vs/platform/progress +/users/foo/src/vs/platform/progress/common +/users/foo/src/vs/platform/progress/common/progress.ts +/users/foo/src/vs/platform/update +/users/foo/src/vs/platform/update/common +/users/foo/src/vs/platform/update/common/updateIpc.ts +/users/foo/src/vs/platform/update/common/update.ts +/users/foo/src/vs/platform/update/node +/users/foo/src/vs/platform/update/node/update.config.contribution.ts +/users/foo/src/vs/platform/update/electron-main +/users/foo/src/vs/platform/update/electron-main/abstractUpdateService.ts +/users/foo/src/vs/platform/update/electron-main/updateService.linux.ts +/users/foo/src/vs/platform/update/electron-main/updateService.darwin.ts +/users/foo/src/vs/platform/update/electron-main/updateService.win32.ts +/users/foo/src/vs/platform/markers +/users/foo/src/vs/platform/markers/test +/users/foo/src/vs/platform/markers/test/common +/users/foo/src/vs/platform/markers/test/common/markerService.test.ts +/users/foo/src/vs/platform/markers/common +/users/foo/src/vs/platform/markers/common/markerService.ts +/users/foo/src/vs/platform/markers/common/markers.ts +/users/foo/src/vs/platform/quickOpen +/users/foo/src/vs/platform/quickOpen/common +/users/foo/src/vs/platform/quickOpen/common/quickOpen.ts +/users/foo/src/vs/platform/instantiation +/users/foo/src/vs/platform/instantiation/test +/users/foo/src/vs/platform/instantiation/test/common +/users/foo/src/vs/platform/instantiation/test/common/instantiationService.test.ts +/users/foo/src/vs/platform/instantiation/test/common/instantiationServiceMock.ts +/users/foo/src/vs/platform/instantiation/common +/users/foo/src/vs/platform/instantiation/common/instantiation.ts +/users/foo/src/vs/platform/instantiation/common/extensions.ts +/users/foo/src/vs/platform/instantiation/common/descriptors.ts +/users/foo/src/vs/platform/instantiation/common/instantiationService.ts +/users/foo/src/vs/platform/instantiation/common/serviceCollection.ts +/users/foo/src/vs/platform/driver +/users/foo/src/vs/platform/driver/common +/users/foo/src/vs/platform/driver/common/driver.ts +/users/foo/src/vs/platform/driver/electron-browser +/users/foo/src/vs/platform/driver/electron-browser/driver.ts +/users/foo/src/vs/platform/driver/node +/users/foo/src/vs/platform/driver/node/driver.ts +/users/foo/src/vs/platform/driver/electron-main +/users/foo/src/vs/platform/driver/electron-main/driver.ts +/users/foo/src/vs/platform/notification +/users/foo/src/vs/platform/notification/test +/users/foo/src/vs/platform/notification/test/common +/users/foo/src/vs/platform/notification/test/common/testNotificationService.ts +/users/foo/src/vs/platform/notification/common +/users/foo/src/vs/platform/notification/common/notification.ts +/users/foo/src/vs/platform/statusbar +/users/foo/src/vs/platform/statusbar/common +/users/foo/src/vs/platform/statusbar/common/statusbar.ts +/users/foo/src/vs/platform/localizations +/users/foo/src/vs/platform/localizations/common +/users/foo/src/vs/platform/localizations/common/localizations.ts +/users/foo/src/vs/platform/localizations/common/localizationsIpc.ts +/users/foo/src/vs/platform/localizations/node +/users/foo/src/vs/platform/localizations/node/localizations.ts +/users/foo/src/vs/platform/workspace +/users/foo/src/vs/platform/workspace/test +/users/foo/src/vs/platform/workspace/test/common +/users/foo/src/vs/platform/workspace/test/common/testWorkspace.ts +/users/foo/src/vs/platform/workspace/test/common/workspace.test.ts +/users/foo/src/vs/platform/workspace/common +/users/foo/src/vs/platform/workspace/common/workspace.ts +/users/foo/src/vs/platform/quickinput +/users/foo/src/vs/platform/quickinput/common +/users/foo/src/vs/platform/quickinput/common/quickInput.ts +/users/foo/src/vs/platform/lifecycle +/users/foo/src/vs/platform/lifecycle/common +/users/foo/src/vs/platform/lifecycle/common/lifecycle.ts +/users/foo/src/vs/platform/lifecycle/electron-browser +/users/foo/src/vs/platform/lifecycle/electron-browser/lifecycleService.ts +/users/foo/src/vs/platform/lifecycle/electron-main +/users/foo/src/vs/platform/lifecycle/electron-main/lifecycleMain.ts +/users/foo/src/vs/platform/jsonschemas +/users/foo/src/vs/platform/jsonschemas/common +/users/foo/src/vs/platform/jsonschemas/common/jsonContributionRegistry.ts +/users/foo/src/vs/platform/state +/users/foo/src/vs/platform/state/test +/users/foo/src/vs/platform/state/test/node +/users/foo/src/vs/platform/state/test/node/state.test.ts +/users/foo/src/vs/platform/state/common +/users/foo/src/vs/platform/state/common/state.ts +/users/foo/src/vs/platform/state/node +/users/foo/src/vs/platform/state/node/stateService.ts +/users/foo/src/vs/platform/workspaces +/users/foo/src/vs/platform/workspaces/test +/users/foo/src/vs/platform/workspaces/test/electron-main +/users/foo/src/vs/platform/workspaces/test/electron-main/workspacesMainService.test.ts +/users/foo/src/vs/platform/workspaces/common +/users/foo/src/vs/platform/workspaces/common/workspaces.ts +/users/foo/src/vs/platform/workspaces/common/workspacesIpc.ts +/users/foo/src/vs/platform/workspaces/node +/users/foo/src/vs/platform/workspaces/node/workspaces.ts +/users/foo/src/vs/platform/workspaces/electron-main +/users/foo/src/vs/platform/workspaces/electron-main/workspacesMainService.ts +/users/foo/src/vs/platform/url +/users/foo/src/vs/platform/url/common +/users/foo/src/vs/platform/url/common/urlIpc.ts +/users/foo/src/vs/platform/url/common/url.ts +/users/foo/src/vs/platform/url/common/urlService.ts +/users/foo/src/vs/platform/url/electron-browser +/users/foo/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.ts +/users/foo/src/vs/platform/url/electron-main +/users/foo/src/vs/platform/url/electron-main/electronUrlListener.ts +/users/foo/src/vs/platform/contextview +/users/foo/src/vs/platform/contextview/browser +/users/foo/src/vs/platform/contextview/browser/contextMenuHandler.ts +/users/foo/src/vs/platform/contextview/browser/contextView.ts +/users/foo/src/vs/platform/contextview/browser/contextMenuService.ts +/users/foo/src/vs/platform/contextview/browser/contextViewService.ts +/users/foo/src/vs/platform/contextview/browser/contextMenuHandler.css +/users/foo/src/vs/platform/storage +/users/foo/src/vs/platform/storage/test +/users/foo/src/vs/platform/storage/test/browser +/users/foo/src/vs/platform/storage/test/browser/migration.test.ts +/users/foo/src/vs/platform/storage/test/common +/users/foo/src/vs/platform/storage/test/common/storageService.test.ts +/users/foo/src/vs/platform/storage/common +/users/foo/src/vs/platform/storage/common/migration.ts +/users/foo/src/vs/platform/storage/common/storage.ts +/users/foo/src/vs/platform/storage/common/storageService.ts +/users/foo/src/vs/platform/contextkey +/users/foo/src/vs/platform/contextkey/test +/users/foo/src/vs/platform/contextkey/test/common +/users/foo/src/vs/platform/contextkey/test/common/contextkey.test.ts +/users/foo/src/vs/platform/contextkey/browser +/users/foo/src/vs/platform/contextkey/browser/contextKeyService.ts +/users/foo/src/vs/platform/contextkey/common +/users/foo/src/vs/platform/contextkey/common/contextkey.ts +/users/foo/src/vs/platform/extensions +/users/foo/src/vs/platform/extensions/test +/users/foo/src/vs/platform/extensions/test/node +/users/foo/src/vs/platform/extensions/test/node/extensionValidator.test.ts +/users/foo/src/vs/platform/extensions/common +/users/foo/src/vs/platform/extensions/common/extensions.ts +/users/foo/src/vs/platform/extensions/common/extensionHost.ts +/users/foo/src/vs/platform/extensions/node +/users/foo/src/vs/platform/extensions/node/extensionValidator.ts +/users/foo/src/vs/platform/search +/users/foo/src/vs/platform/search/test +/users/foo/src/vs/platform/search/test/common +/users/foo/src/vs/platform/search/test/common/replace.test.ts +/users/foo/src/vs/platform/search/common +/users/foo/src/vs/platform/search/common/replace.ts +/users/foo/src/vs/platform/search/common/search.ts +/users/foo/src/vs/platform/opener +/users/foo/src/vs/platform/opener/test +/users/foo/src/vs/platform/opener/test/browser +/users/foo/src/vs/platform/opener/test/browser/openerService.test.ts +/users/foo/src/vs/platform/opener/browser +/users/foo/src/vs/platform/opener/browser/opener.contribution.ts +/users/foo/src/vs/platform/opener/browser/openerService.ts +/users/foo/src/vs/platform/opener/common +/users/foo/src/vs/platform/opener/common/opener.ts +/users/foo/src/vs/platform/theme +/users/foo/src/vs/platform/theme/test +/users/foo/src/vs/platform/theme/test/common +/users/foo/src/vs/platform/theme/test/common/testThemeService.ts +/users/foo/src/vs/platform/theme/common +/users/foo/src/vs/platform/theme/common/styler.ts +/users/foo/src/vs/platform/theme/common/themeService.ts +/users/foo/src/vs/platform/theme/common/colorRegistry.ts +/users/foo/src/vs/platform/workbench +/users/foo/src/vs/platform/workbench/common +/users/foo/src/vs/platform/workbench/common/contextkeys.ts +/users/foo/src/vs/platform/issue +/users/foo/src/vs/platform/issue/common +/users/foo/src/vs/platform/issue/common/issue.ts +/users/foo/src/vs/platform/issue/common/issueIpc.ts +/users/foo/src/vs/platform/issue/electron-main +/users/foo/src/vs/platform/issue/electron-main/issueService.ts +/users/foo/src/vs/platform/list +/users/foo/src/vs/platform/list/browser +/users/foo/src/vs/platform/list/browser/listService.ts +/users/foo/src/vs/platform/history +/users/foo/src/vs/platform/history/common +/users/foo/src/vs/platform/history/common/history.ts +/users/foo/src/vs/platform/history/electron-main +/users/foo/src/vs/platform/history/electron-main/historyMainService.ts +/users/foo/src/vs/platform/actions +/users/foo/src/vs/platform/actions/browser +/users/foo/src/vs/platform/actions/browser/menuItemActionItem.ts +/users/foo/src/vs/platform/actions/common +/users/foo/src/vs/platform/actions/common/menu.ts +/users/foo/src/vs/platform/actions/common/actions.ts +/users/foo/src/vs/platform/registry +/users/foo/src/vs/platform/registry/test +/users/foo/src/vs/platform/registry/test/common +/users/foo/src/vs/platform/registry/test/common/platform.test.ts +/users/foo/src/vs/platform/registry/common +/users/foo/src/vs/platform/registry/common/platform.ts +/users/foo/src/vs/platform/files +/users/foo/src/vs/platform/files/test +/users/foo/src/vs/platform/files/test/files.test.ts +/users/foo/src/vs/platform/files/common +/users/foo/src/vs/platform/files/common/files.ts +/users/foo/src/vs/platform/files/node +/users/foo/src/vs/platform/files/node/files.ts +/users/foo/src/vs/platform/environment +/users/foo/src/vs/platform/environment/test +/users/foo/src/vs/platform/environment/test/node +/users/foo/src/vs/platform/environment/test/node/environmentService.test.ts +/users/foo/src/vs/platform/environment/common +/users/foo/src/vs/platform/environment/common/environment.ts +/users/foo/src/vs/platform/environment/node +/users/foo/src/vs/platform/environment/node/argv.ts +/users/foo/src/vs/platform/environment/node/environmentService.ts +/users/foo/src/vs/platform/dialogs +/users/foo/src/vs/platform/dialogs/common +/users/foo/src/vs/platform/dialogs/common/dialogs.ts +/users/foo/src/vs/platform/dialogs/common/dialogIpc.ts +/users/foo/src/vs/platform/dialogs/node +/users/foo/src/vs/platform/dialogs/node/dialogService.ts +/users/foo/src/vs/platform/log +/users/foo/src/vs/platform/log/common +/users/foo/src/vs/platform/log/common/bufferLog.ts +/users/foo/src/vs/platform/log/common/log.ts +/users/foo/src/vs/platform/log/common/logIpc.ts +/users/foo/src/vs/platform/log/node +/users/foo/src/vs/platform/log/node/spdlogService.ts +/users/foo/src/vs/platform/request +/users/foo/src/vs/platform/request/electron-browser +/users/foo/src/vs/platform/request/electron-browser/requestService.ts +/users/foo/src/vs/platform/request/node +/users/foo/src/vs/platform/request/node/requestService.ts +/users/foo/src/vs/platform/request/node/request.ts +/users/foo/src/vs/platform/request/electron-main +/users/foo/src/vs/platform/request/electron-main/requestService.ts +/users/foo/src/vs/platform/integrity +/users/foo/src/vs/platform/integrity/common +/users/foo/src/vs/platform/integrity/common/integrity.ts +/users/foo/src/vs/platform/integrity/node +/users/foo/src/vs/platform/integrity/node/integrityServiceImpl.ts +/users/foo/src/vs/platform/commands +/users/foo/src/vs/platform/commands/test +/users/foo/src/vs/platform/commands/test/commands.test.ts +/users/foo/src/vs/platform/commands/common +/users/foo/src/vs/platform/commands/common/commands.ts +/users/foo/src/vs/platform/telemetry +/users/foo/src/vs/platform/telemetry/test +/users/foo/src/vs/platform/telemetry/test/electron-browser +/users/foo/src/vs/platform/telemetry/test/electron-browser/telemetryService.test.ts +/users/foo/src/vs/platform/telemetry/test/electron-browser/appInsightsAppender.test.ts +/users/foo/src/vs/platform/telemetry/test/electron-browser/commonProperties.test.ts +/users/foo/src/vs/platform/telemetry/browser +/users/foo/src/vs/platform/telemetry/browser/errorTelemetry.ts +/users/foo/src/vs/platform/telemetry/common +/users/foo/src/vs/platform/telemetry/common/telemetryIpc.ts +/users/foo/src/vs/platform/telemetry/common/experiments.ts +/users/foo/src/vs/platform/telemetry/common/telemetryService.ts +/users/foo/src/vs/platform/telemetry/common/telemetry.ts +/users/foo/src/vs/platform/telemetry/common/telemetryUtils.ts +/users/foo/src/vs/platform/telemetry/node +/users/foo/src/vs/platform/telemetry/node/appInsightsAppender.ts +/users/foo/src/vs/platform/telemetry/node/commonProperties.ts +/users/foo/src/vs/platform/telemetry/node/telemetryNodeUtils.ts +/users/foo/src/vs/platform/telemetry/node/workbenchCommonProperties.ts +/users/foo/src/vs/platform/node +/users/foo/src/vs/platform/node/minimalTranslations.ts +/users/foo/src/vs/platform/node/product.ts +/users/foo/src/vs/platform/node/package.ts +/users/foo/src/vs/platform/windows +/users/foo/src/vs/platform/windows/common +/users/foo/src/vs/platform/windows/common/windowsIpc.ts +/users/foo/src/vs/platform/windows/common/windows.ts +/users/foo/src/vs/platform/windows/electron-browser +/users/foo/src/vs/platform/windows/electron-browser/windowService.ts +/users/foo/src/vs/platform/windows/electron-main +/users/foo/src/vs/platform/windows/electron-main/windows.ts +/users/foo/src/vs/platform/windows/electron-main/windowsService.ts +/users/foo/src/vs/platform/backup +/users/foo/src/vs/platform/backup/test +/users/foo/src/vs/platform/backup/test/electron-main +/users/foo/src/vs/platform/backup/test/electron-main/backupMainService.test.ts +/users/foo/src/vs/platform/backup/common +/users/foo/src/vs/platform/backup/common/backup.ts +/users/foo/src/vs/platform/backup/electron-main +/users/foo/src/vs/platform/backup/electron-main/backupMainService.ts +/users/foo/src/vs/platform/extensionManagement +/users/foo/src/vs/platform/extensionManagement/test +/users/foo/src/vs/platform/extensionManagement/test/common +/users/foo/src/vs/platform/extensionManagement/test/common/extensionEnablementService.test.ts +/users/foo/src/vs/platform/extensionManagement/test/common/extensionManagement.test.ts +/users/foo/src/vs/platform/extensionManagement/test/node +/users/foo/src/vs/platform/extensionManagement/test/node/extensionGalleryService.test.ts +/users/foo/src/vs/platform/extensionManagement/common +/users/foo/src/vs/platform/extensionManagement/common/extensionManagement.ts +/users/foo/src/vs/platform/extensionManagement/common/extensionManagementUtil.ts +/users/foo/src/vs/platform/extensionManagement/common/extensionEnablementService.ts +/users/foo/src/vs/platform/extensionManagement/common/extensionManagementIpc.ts +/users/foo/src/vs/platform/extensionManagement/common/extensionNls.ts +/users/foo/src/vs/platform/extensionManagement/node +/users/foo/src/vs/platform/extensionManagement/node/extensionGalleryService.ts +/users/foo/src/vs/platform/extensionManagement/node/extensionLifecycle.ts +/users/foo/src/vs/platform/extensionManagement/node/extensionsManifestCache.ts +/users/foo/src/vs/platform/extensionManagement/node/extensionManagementUtil.ts +/users/foo/src/vs/platform/extensionManagement/node/extensionManagementService.ts +/users/foo/src/vs/platform/extensionManagement/node/media +/users/foo/src/vs/platform/extensionManagement/node/media/defaultIcon.png +/users/foo/src/vs/platform/broadcast +/users/foo/src/vs/platform/broadcast/electron-browser +/users/foo/src/vs/platform/broadcast/electron-browser/broadcastService.ts +/users/foo/src/vs/platform/editor +/users/foo/src/vs/platform/editor/common +/users/foo/src/vs/platform/editor/common/editor.ts +/users/foo/src/vs/platform/credentials +/users/foo/src/vs/platform/credentials/test +/users/foo/src/vs/platform/credentials/test/node +/users/foo/src/vs/platform/credentials/test/node/keytar.test.ts +/users/foo/src/vs/platform/clipboard +/users/foo/src/vs/platform/clipboard/common +/users/foo/src/vs/platform/clipboard/common/clipboardService.ts +/users/foo/src/vs/platform/clipboard/electron-browser +/users/foo/src/vs/platform/clipboard/electron-browser/clipboardService.ts +/users/foo/src/vs/code +/users/foo/src/vs/code/test +/users/foo/src/vs/code/test/node +/users/foo/src/vs/code/test/node/windowsFinder.test.ts +/users/foo/src/vs/code/test/node/argv.test.ts +/users/foo/src/vs/code/test/node/fixtures +/users/foo/src/vs/code/test/node/fixtures/no_vscode_folder +/users/foo/src/vs/code/test/node/fixtures/no_vscode_folder/file.txt +/users/foo/src/vs/code/test/node/fixtures/vscode_folder +/users/foo/src/vs/code/test/node/fixtures/vscode_folder/file.txt +/users/foo/src/vs/code/test/node/fixtures/vscode_folder/_vscode +/users/foo/src/vs/code/test/node/fixtures/vscode_folder/_vscode/settings.json +/users/foo/src/vs/code/test/node/fixtures/vscode_folder/nested_vscode_folder +/users/foo/src/vs/code/test/node/fixtures/vscode_folder/nested_vscode_folder/_vscode +/users/foo/src/vs/code/test/node/fixtures/vscode_folder/nested_vscode_folder/_vscode/settings.json +/users/foo/src/vs/code/test/node/fixtures/vscode_home_folder +/users/foo/src/vs/code/test/node/fixtures/vscode_home_folder/file.txt +/users/foo/src/vs/code/test/node/fixtures/vscode_home_folder/_vscode +/users/foo/src/vs/code/test/node/fixtures/vscode_home_folder/_vscode/settings.json +/users/foo/src/vs/code/electron-browser +/users/foo/src/vs/code/electron-browser/proxy +/users/foo/src/vs/code/electron-browser/proxy/auth.html +/users/foo/src/vs/code/electron-browser/issue +/users/foo/src/vs/code/electron-browser/issue/issueReporterPage.ts +/users/foo/src/vs/code/electron-browser/issue/test +/users/foo/src/vs/code/electron-browser/issue/test/testReporterModel.test.ts +/users/foo/src/vs/code/electron-browser/issue/issueReporterUtil.ts +/users/foo/src/vs/code/electron-browser/issue/issueReporterModel.ts +/users/foo/src/vs/code/electron-browser/issue/issueReporterMain.ts +/users/foo/src/vs/code/electron-browser/issue/issueReporter.js +/users/foo/src/vs/code/electron-browser/issue/issueReporter.html +/users/foo/src/vs/code/electron-browser/issue/media +/users/foo/src/vs/code/electron-browser/issue/media/issueReporter.css +/users/foo/src/vs/code/electron-browser/processExplorer +/users/foo/src/vs/code/electron-browser/processExplorer/processExplorerMain.ts +/users/foo/src/vs/code/electron-browser/processExplorer/processExplorer.js +/users/foo/src/vs/code/electron-browser/processExplorer/processExplorer.html +/users/foo/src/vs/code/electron-browser/processExplorer/media +/users/foo/src/vs/code/electron-browser/processExplorer/media/processExplorer.css +/users/foo/src/vs/code/electron-browser/sharedProcess +/users/foo/src/vs/code/electron-browser/sharedProcess/sharedProcess.js +/users/foo/src/vs/code/electron-browser/sharedProcess/sharedProcessMain.ts +/users/foo/src/vs/code/electron-browser/sharedProcess/contrib +/users/foo/src/vs/code/electron-browser/sharedProcess/contrib/nodeCachedDataCleaner.ts +/users/foo/src/vs/code/electron-browser/sharedProcess/contrib/contributions.ts +/users/foo/src/vs/code/electron-browser/sharedProcess/contrib/languagePackCachedDataCleaner.ts +/users/foo/src/vs/code/electron-browser/sharedProcess/sharedProcess.html +/users/foo/src/vs/code/buildfile.js +/users/foo/src/vs/code/node +/users/foo/src/vs/code/node/shellEnv.ts +/users/foo/src/vs/code/node/cliProcessMain.ts +/users/foo/src/vs/code/node/cli.ts +/users/foo/src/vs/code/node/windowsFinder.ts +/users/foo/src/vs/code/node/paths.ts +/users/foo/src/vs/code/electron-main +/users/foo/src/vs/code/electron-main/keyboard.ts +/users/foo/src/vs/code/electron-main/logUploader.ts +/users/foo/src/vs/code/electron-main/main.ts +/users/foo/src/vs/code/electron-main/menus.ts +/users/foo/src/vs/code/electron-main/windows.ts +/users/foo/src/vs/code/electron-main/contributions.ts +/users/foo/src/vs/code/electron-main/app.ts +/users/foo/src/vs/code/electron-main/launch.ts +/users/foo/src/vs/code/electron-main/sharedProcess.ts +/users/foo/src/vs/code/electron-main/diagnostics.ts +/users/foo/src/vs/code/electron-main/window.ts +/users/foo/src/vs/code/electron-main/auth.ts +/users/foo/src/vs/vscode.d.ts +/users/foo/src/vs/vscode.proposed.d.ts +/users/foo/src/vs/css.build.js +/users/foo/src/vs/buildunit.json +/users/foo/src/vs/workbench +/users/foo/src/vs/workbench/.DS_Store +/users/foo/src/vs/workbench/test +/users/foo/src/vs/workbench/test/browser +/users/foo/src/vs/workbench/test/browser/actionRegistry.test.ts +/users/foo/src/vs/workbench/test/browser/part.test.ts +/users/foo/src/vs/workbench/test/browser/parts +/users/foo/src/vs/workbench/test/browser/parts/views +/users/foo/src/vs/workbench/test/browser/parts/views/contributableViews.test.ts +/users/foo/src/vs/workbench/test/browser/parts/editor +/users/foo/src/vs/workbench/test/browser/parts/editor/editorStacksModel.test.ts +/users/foo/src/vs/workbench/test/browser/parts/editor/rangeDecorations.test.ts +/users/foo/src/vs/workbench/test/browser/parts/editor/baseEditor.test.ts +/users/foo/src/vs/workbench/test/browser/viewlet.test.ts +/users/foo/src/vs/workbench/test/browser/quickopen.test.ts +/users/foo/src/vs/workbench/test/common +/users/foo/src/vs/workbench/test/common/notifications.test.ts +/users/foo/src/vs/workbench/test/common/memento.test.ts +/users/foo/src/vs/workbench/test/common/editor +/users/foo/src/vs/workbench/test/common/editor/editorModel.test.ts +/users/foo/src/vs/workbench/test/common/editor/editorInput.test.ts +/users/foo/src/vs/workbench/test/common/editor/editorOptions.test.ts +/users/foo/src/vs/workbench/test/common/editor/editor.test.ts +/users/foo/src/vs/workbench/test/common/editor/editorDiffModel.test.ts +/users/foo/src/vs/workbench/test/common/editor/resourceEditorInput.test.ts +/users/foo/src/vs/workbench/test/common/editor/untitledEditor.test.ts +/users/foo/src/vs/workbench/test/common/editor/dataUriEditorInput.test.ts +/users/foo/src/vs/workbench/test/electron-browser +/users/foo/src/vs/workbench/test/electron-browser/quickopen.perf.integrationTest.ts +/users/foo/src/vs/workbench/test/electron-browser/textsearch.perf.integrationTest.ts +/users/foo/src/vs/workbench/test/electron-browser/api +/users/foo/src/vs/workbench/test/electron-browser/api/mock.ts +/users/foo/src/vs/workbench/test/electron-browser/api/extHostDocumentData.test.ts +/users/foo/src/vs/workbench/test/electron-browser/api/extHostTextEditor.test.ts +/users/foo/src/vs/workbench/test/electron-browser/api/extHostDiagnostics.test.ts +/users/foo/src/vs/workbench/test/electron-browser/api/extHostTypes.test.ts +/users/foo/src/vs/workbench/test/electron-browser/api/mainThreadSaveParticipant.test.ts +/users/foo/src/vs/workbench/test/electron-browser/api/testRPCProtocol.ts +/users/foo/src/vs/workbench/test/electron-browser/api/extHostDocumentSaveParticipant.test.ts +/users/foo/src/vs/workbench/test/electron-browser/api/extHostCommands.test.ts +/users/foo/src/vs/workbench/test/electron-browser/api/extHostWorkspace.test.ts +/users/foo/src/vs/workbench/test/electron-browser/api/extHostTextEditors.test.ts +/users/foo/src/vs/workbench/test/electron-browser/api/extHostLanguageFeatures.test.ts +/users/foo/src/vs/workbench/test/electron-browser/api/extHostConfiguration.test.ts +/users/foo/src/vs/workbench/test/electron-browser/api/extHostMessagerService.test.ts +/users/foo/src/vs/workbench/test/electron-browser/api/mainThreadDocumentsAndEditors.test.ts +/users/foo/src/vs/workbench/test/electron-browser/api/mainThreadDiagnostics.test.ts +/users/foo/src/vs/workbench/test/electron-browser/api/mainThreadConfiguration.test.ts +/users/foo/src/vs/workbench/test/electron-browser/api/mainThreadCommands.test.ts +/users/foo/src/vs/workbench/test/electron-browser/api/extHostApiCommands.test.ts +/users/foo/src/vs/workbench/test/electron-browser/api/extHostTreeViews.test.ts +/users/foo/src/vs/workbench/test/electron-browser/api/mainThreadEditors.test.ts +/users/foo/src/vs/workbench/test/electron-browser/api/mainThreadDocuments.test.ts +/users/foo/src/vs/workbench/test/electron-browser/api/extHostSearch.test.ts +/users/foo/src/vs/workbench/test/electron-browser/api/extHostWebview.test.ts +/users/foo/src/vs/workbench/test/electron-browser/api/extHostFileSystemEventService.test.ts +/users/foo/src/vs/workbench/test/electron-browser/api/extHostDocumentsAndEditors.test.ts +/users/foo/src/vs/workbench/test/workbenchTestServices.ts +/users/foo/src/vs/workbench/browser +/users/foo/src/vs/workbench/browser/viewlet.ts +/users/foo/src/vs/workbench/browser/panel.ts +/users/foo/src/vs/workbench/browser/part.ts +/users/foo/src/vs/workbench/browser/editor.ts +/users/foo/src/vs/workbench/browser/composite.ts +/users/foo/src/vs/workbench/browser/quickopen.ts +/users/foo/src/vs/workbench/browser/actions.ts +/users/foo/src/vs/workbench/browser/dnd.ts +/users/foo/src/vs/workbench/browser/actions +/users/foo/src/vs/workbench/browser/actions/workspaceActions.ts +/users/foo/src/vs/workbench/browser/actions/toggleZenMode.ts +/users/foo/src/vs/workbench/browser/actions/toggleCenteredLayout.ts +/users/foo/src/vs/workbench/browser/actions/toggleSidebarPosition.ts +/users/foo/src/vs/workbench/browser/actions/toggleStatusbarVisibility.ts +/users/foo/src/vs/workbench/browser/actions/workspaceCommands.ts +/users/foo/src/vs/workbench/browser/actions/toggleTabsVisibility.ts +/users/foo/src/vs/workbench/browser/actions/toggleSidebarVisibility.ts +/users/foo/src/vs/workbench/browser/actions/toggleEditorLayout.ts +/users/foo/src/vs/workbench/browser/actions/toggleActivityBarVisibility.ts +/users/foo/src/vs/workbench/browser/actions/media +/users/foo/src/vs/workbench/browser/actions/media/actions.css +/users/foo/src/vs/workbench/browser/actions/media/editor-layout-inverse.svg +/users/foo/src/vs/workbench/browser/actions/media/editor-layout.svg +/users/foo/src/vs/workbench/browser/layout.ts +/users/foo/src/vs/workbench/browser/parts +/users/foo/src/vs/workbench/browser/parts/compositebar +/users/foo/src/vs/workbench/browser/parts/compositebar/compositeBar.ts +/users/foo/src/vs/workbench/browser/parts/compositebar/compositeBarActions.ts +/users/foo/src/vs/workbench/browser/parts/sidebar +/users/foo/src/vs/workbench/browser/parts/sidebar/sidebarPart.ts +/users/foo/src/vs/workbench/browser/parts/sidebar/media +/users/foo/src/vs/workbench/browser/parts/sidebar/media/sidebarpart.css +/users/foo/src/vs/workbench/browser/parts/panel +/users/foo/src/vs/workbench/browser/parts/panel/panelActions.ts +/users/foo/src/vs/workbench/browser/parts/panel/panelPart.ts +/users/foo/src/vs/workbench/browser/parts/panel/media +/users/foo/src/vs/workbench/browser/parts/panel/media/panel-bottom-inverse.svg +/users/foo/src/vs/workbench/browser/parts/panel/media/ellipsis-inverse.svg +/users/foo/src/vs/workbench/browser/parts/panel/media/right-inverse.svg +/users/foo/src/vs/workbench/browser/parts/panel/media/down.svg +/users/foo/src/vs/workbench/browser/parts/panel/media/up.svg +/users/foo/src/vs/workbench/browser/parts/panel/media/close-inverse.svg +/users/foo/src/vs/workbench/browser/parts/panel/media/panelpart.css +/users/foo/src/vs/workbench/browser/parts/panel/media/panel-right-inverse.svg +/users/foo/src/vs/workbench/browser/parts/panel/media/panel-bottom.svg +/users/foo/src/vs/workbench/browser/parts/panel/media/left-inverse.svg +/users/foo/src/vs/workbench/browser/parts/panel/media/close.svg +/users/foo/src/vs/workbench/browser/parts/panel/media/right.svg +/users/foo/src/vs/workbench/browser/parts/panel/media/down-inverse.svg +/users/foo/src/vs/workbench/browser/parts/panel/media/panel-right.svg +/users/foo/src/vs/workbench/browser/parts/panel/media/up-inverse.svg +/users/foo/src/vs/workbench/browser/parts/panel/media/ellipsis.svg +/users/foo/src/vs/workbench/browser/parts/panel/media/left.svg +/users/foo/src/vs/workbench/browser/parts/quickopen +/users/foo/src/vs/workbench/browser/parts/quickopen/quickopen.ts +/users/foo/src/vs/workbench/browser/parts/quickopen/quickOpenController.ts +/users/foo/src/vs/workbench/browser/parts/quickopen/quickopen.contribution.ts +/users/foo/src/vs/workbench/browser/parts/quickopen/media +/users/foo/src/vs/workbench/browser/parts/quickopen/media/quickopen.css +/users/foo/src/vs/workbench/browser/parts/quickopen/media/dirty.svg +/users/foo/src/vs/workbench/browser/parts/quickopen/media/dirty-inverse.svg +/users/foo/src/vs/workbench/browser/parts/titlebar +/users/foo/src/vs/workbench/browser/parts/titlebar/titlebarPart.ts +/users/foo/src/vs/workbench/browser/parts/titlebar/media +/users/foo/src/vs/workbench/browser/parts/titlebar/media/titlebarpart.css +/users/foo/src/vs/workbench/browser/parts/compositePart.ts +/users/foo/src/vs/workbench/browser/parts/statusbar +/users/foo/src/vs/workbench/browser/parts/statusbar/statusbarPart.ts +/users/foo/src/vs/workbench/browser/parts/statusbar/statusbar.ts +/users/foo/src/vs/workbench/browser/parts/statusbar/media +/users/foo/src/vs/workbench/browser/parts/statusbar/media/statusbarpart.css +/users/foo/src/vs/workbench/browser/parts/quickinput +/users/foo/src/vs/workbench/browser/parts/quickinput/quickInputList.ts +/users/foo/src/vs/workbench/browser/parts/quickinput/quickInputBox.ts +/users/foo/src/vs/workbench/browser/parts/quickinput/quickInput.contribution.ts +/users/foo/src/vs/workbench/browser/parts/quickinput/quickInput.css +/users/foo/src/vs/workbench/browser/parts/quickinput/quickInput.ts +/users/foo/src/vs/workbench/browser/parts/activitybar +/users/foo/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts +/users/foo/src/vs/workbench/browser/parts/activitybar/activitybarActions.ts +/users/foo/src/vs/workbench/browser/parts/activitybar/media +/users/foo/src/vs/workbench/browser/parts/activitybar/media/activityaction.css +/users/foo/src/vs/workbench/browser/parts/activitybar/media/activitybarpart.css +/users/foo/src/vs/workbench/browser/parts/activitybar/media/ellipsis-global.svg +/users/foo/src/vs/workbench/browser/parts/views +/users/foo/src/vs/workbench/browser/parts/views/views.ts +/users/foo/src/vs/workbench/browser/parts/views/contributableViews.ts +/users/foo/src/vs/workbench/browser/parts/views/panelViewlet.ts +/users/foo/src/vs/workbench/browser/parts/views/customViewPanel.ts +/users/foo/src/vs/workbench/browser/parts/views/viewsViewlet.ts +/users/foo/src/vs/workbench/browser/parts/views/media +/users/foo/src/vs/workbench/browser/parts/views/media/collapsed.svg +/users/foo/src/vs/workbench/browser/parts/views/media/expanded-dark.svg +/users/foo/src/vs/workbench/browser/parts/views/media/views.css +/users/foo/src/vs/workbench/browser/parts/views/media/panelviewlet.css +/users/foo/src/vs/workbench/browser/parts/views/media/collapsed-hc.svg +/users/foo/src/vs/workbench/browser/parts/views/media/collapsed-dark.svg +/users/foo/src/vs/workbench/browser/parts/views/media/expanded.svg +/users/foo/src/vs/workbench/browser/parts/views/media/expanded-hc.svg +/users/foo/src/vs/workbench/browser/parts/notifications +/users/foo/src/vs/workbench/browser/parts/notifications/notificationsList.ts +/users/foo/src/vs/workbench/browser/parts/notifications/notificationsToasts.ts +/users/foo/src/vs/workbench/browser/parts/notifications/notificationsActions.ts +/users/foo/src/vs/workbench/browser/parts/notifications/notificationsStatus.ts +/users/foo/src/vs/workbench/browser/parts/notifications/notificationsAlerts.ts +/users/foo/src/vs/workbench/browser/parts/notifications/notificationsViewer.ts +/users/foo/src/vs/workbench/browser/parts/notifications/notificationsCenter.ts +/users/foo/src/vs/workbench/browser/parts/notifications/media +/users/foo/src/vs/workbench/browser/parts/notifications/media/info-inverse.svg +/users/foo/src/vs/workbench/browser/parts/notifications/media/down.svg +/users/foo/src/vs/workbench/browser/parts/notifications/media/notificationsCenter.css +/users/foo/src/vs/workbench/browser/parts/notifications/media/up.svg +/users/foo/src/vs/workbench/browser/parts/notifications/media/close-inverse.svg +/users/foo/src/vs/workbench/browser/parts/notifications/media/error-inverse.svg +/users/foo/src/vs/workbench/browser/parts/notifications/media/closeall.svg +/users/foo/src/vs/workbench/browser/parts/notifications/media/warning.svg +/users/foo/src/vs/workbench/browser/parts/notifications/media/info.svg +/users/foo/src/vs/workbench/browser/parts/notifications/media/close.svg +/users/foo/src/vs/workbench/browser/parts/notifications/media/notificationsActions.css +/users/foo/src/vs/workbench/browser/parts/notifications/media/down-inverse.svg +/users/foo/src/vs/workbench/browser/parts/notifications/media/closeall-inverse.svg +/users/foo/src/vs/workbench/browser/parts/notifications/media/notificationsToasts.css +/users/foo/src/vs/workbench/browser/parts/notifications/media/notificationsList.css +/users/foo/src/vs/workbench/browser/parts/notifications/media/warning-inverse.svg +/users/foo/src/vs/workbench/browser/parts/notifications/media/up-inverse.svg +/users/foo/src/vs/workbench/browser/parts/notifications/media/configure-inverse.svg +/users/foo/src/vs/workbench/browser/parts/notifications/media/error.svg +/users/foo/src/vs/workbench/browser/parts/notifications/media/configure.svg +/users/foo/src/vs/workbench/browser/parts/notifications/notificationsCommands.ts +/users/foo/src/vs/workbench/browser/parts/editor +/users/foo/src/vs/workbench/browser/parts/editor/textDiffEditor.ts +/users/foo/src/vs/workbench/browser/parts/editor/editorCommands.ts +/users/foo/src/vs/workbench/browser/parts/editor/editorActions.ts +/users/foo/src/vs/workbench/browser/parts/editor/editorPicker.ts +/users/foo/src/vs/workbench/browser/parts/editor/tabsTitleControl.ts +/users/foo/src/vs/workbench/browser/parts/editor/editorGroupsControl.ts +/users/foo/src/vs/workbench/browser/parts/editor/editorPart.ts +/users/foo/src/vs/workbench/browser/parts/editor/editor.contribution.ts +/users/foo/src/vs/workbench/browser/parts/editor/binaryEditor.ts +/users/foo/src/vs/workbench/browser/parts/editor/resourceViewer.ts +/users/foo/src/vs/workbench/browser/parts/editor/noTabsTitleControl.ts +/users/foo/src/vs/workbench/browser/parts/editor/baseEditor.ts +/users/foo/src/vs/workbench/browser/parts/editor/binaryDiffEditor.ts +/users/foo/src/vs/workbench/browser/parts/editor/titleControl.ts +/users/foo/src/vs/workbench/browser/parts/editor/textResourceEditor.ts +/users/foo/src/vs/workbench/browser/parts/editor/rangeDecorations.ts +/users/foo/src/vs/workbench/browser/parts/editor/editorStatus.ts +/users/foo/src/vs/workbench/browser/parts/editor/textEditor.ts +/users/foo/src/vs/workbench/browser/parts/editor/sideBySideEditor.ts +/users/foo/src/vs/workbench/browser/parts/editor/media +/users/foo/src/vs/workbench/browser/parts/editor/media/previous-diff-inverse.svg +/users/foo/src/vs/workbench/browser/parts/editor/media/close-dirty-inverse.svg +/users/foo/src/vs/workbench/browser/parts/editor/media/close-inverse.svg +/users/foo/src/vs/workbench/browser/parts/editor/media/split-editor-vertical.svg +/users/foo/src/vs/workbench/browser/parts/editor/media/next-diff.svg +/users/foo/src/vs/workbench/browser/parts/editor/media/editorpicker.css +/users/foo/src/vs/workbench/browser/parts/editor/media/editorpart.css +/users/foo/src/vs/workbench/browser/parts/editor/media/split-editor-horizontal-inverse.svg +/users/foo/src/vs/workbench/browser/parts/editor/media/split-editor-horizontal.svg +/users/foo/src/vs/workbench/browser/parts/editor/media/Paragraph_16x_nohalo_inversep.svg +/users/foo/src/vs/workbench/browser/parts/editor/media/notabstitle.css +/users/foo/src/vs/workbench/browser/parts/editor/media/editorstatus.css +/users/foo/src/vs/workbench/browser/parts/editor/media/Paragraph_16x_nohalo.svg +/users/foo/src/vs/workbench/browser/parts/editor/media/resourceviewer.css +/users/foo/src/vs/workbench/browser/parts/editor/media/split-editor-vertical-inverse.svg +/users/foo/src/vs/workbench/browser/parts/editor/media/close.svg +/users/foo/src/vs/workbench/browser/parts/editor/media/close-big-dark.svg +/users/foo/src/vs/workbench/browser/parts/editor/media/previous-diff.svg +/users/foo/src/vs/workbench/browser/parts/editor/media/forward-tb.png +/users/foo/src/vs/workbench/browser/parts/editor/media/close-dirty.svg +/users/foo/src/vs/workbench/browser/parts/editor/media/editorGroupsControl.css +/users/foo/src/vs/workbench/browser/parts/editor/media/close-big.svg +/users/foo/src/vs/workbench/browser/parts/editor/media/textdiffeditor.css +/users/foo/src/vs/workbench/browser/parts/editor/media/next-diff-inverse.svg +/users/foo/src/vs/workbench/browser/parts/editor/media/stackview.svg +/users/foo/src/vs/workbench/browser/parts/editor/media/titlecontrol.css +/users/foo/src/vs/workbench/browser/parts/editor/media/stackview-inverse.svg +/users/foo/src/vs/workbench/browser/parts/editor/media/tabstitle.css +/users/foo/src/vs/workbench/browser/parts/editor/media/back-tb.png +/users/foo/src/vs/workbench/browser/parts/media +/users/foo/src/vs/workbench/browser/parts/media/compositepart.css +/users/foo/src/vs/workbench/browser/labels.ts +/users/foo/src/vs/workbench/browser/media +/users/foo/src/vs/workbench/browser/media/part.css +/users/foo/src/vs/workbench/common +/users/foo/src/vs/workbench/common/viewlet.ts +/users/foo/src/vs/workbench/common/views.ts +/users/foo/src/vs/workbench/common/component.ts +/users/foo/src/vs/workbench/common/panel.ts +/users/foo/src/vs/workbench/common/editor.ts +/users/foo/src/vs/workbench/common/composite.ts +/users/foo/src/vs/workbench/common/contributions.ts +/users/foo/src/vs/workbench/common/resources.ts +/users/foo/src/vs/workbench/common/notifications.ts +/users/foo/src/vs/workbench/common/actions.ts +/users/foo/src/vs/workbench/common/activity.ts +/users/foo/src/vs/workbench/common/theme.ts +/users/foo/src/vs/workbench/common/editor +/users/foo/src/vs/workbench/common/editor/untitledEditorModel.ts +/users/foo/src/vs/workbench/common/editor/resourceEditorModel.ts +/users/foo/src/vs/workbench/common/editor/resourceEditorInput.ts +/users/foo/src/vs/workbench/common/editor/untitledEditorInput.ts +/users/foo/src/vs/workbench/common/editor/diffEditorModel.ts +/users/foo/src/vs/workbench/common/editor/diffEditorInput.ts +/users/foo/src/vs/workbench/common/editor/textEditorModel.ts +/users/foo/src/vs/workbench/common/editor/editorStacksModel.ts +/users/foo/src/vs/workbench/common/editor/textDiffEditorModel.ts +/users/foo/src/vs/workbench/common/editor/dataUriEditorInput.ts +/users/foo/src/vs/workbench/common/editor/binaryEditorModel.ts +/users/foo/src/vs/workbench/common/memento.ts +/users/foo/src/vs/workbench/workbench.main.css +/users/foo/src/vs/workbench/workbench.main.ts +/users/foo/src/vs/workbench/parts +/users/foo/src/vs/workbench/parts/snippets +/users/foo/src/vs/workbench/parts/snippets/test +/users/foo/src/vs/workbench/parts/snippets/test/electron-browser +/users/foo/src/vs/workbench/parts/snippets/test/electron-browser/snippetsRewrite.test.ts +/users/foo/src/vs/workbench/parts/snippets/test/electron-browser/snippetFile.test.ts +/users/foo/src/vs/workbench/parts/snippets/test/electron-browser/snippetsRegistry.test.ts +/users/foo/src/vs/workbench/parts/snippets/test/electron-browser/snippetsService.test.ts +/users/foo/src/vs/workbench/parts/snippets/electron-browser +/users/foo/src/vs/workbench/parts/snippets/electron-browser/tabCompletion.ts +/users/foo/src/vs/workbench/parts/snippets/electron-browser/snippets.contribution.ts +/users/foo/src/vs/workbench/parts/snippets/electron-browser/snippetsService.ts +/users/foo/src/vs/workbench/parts/snippets/electron-browser/insertSnippet.ts +/users/foo/src/vs/workbench/parts/snippets/electron-browser/snippetsFile.ts +/users/foo/src/vs/workbench/parts/snippets/electron-browser/configureSnippets.ts +/users/foo/src/vs/workbench/parts/preferences +/users/foo/src/vs/workbench/parts/preferences/test +/users/foo/src/vs/workbench/parts/preferences/test/browser +/users/foo/src/vs/workbench/parts/preferences/test/browser/keybindingsEditorContribution.test.ts +/users/foo/src/vs/workbench/parts/preferences/test/browser/settingsTree.test.ts +/users/foo/src/vs/workbench/parts/preferences/test/common +/users/foo/src/vs/workbench/parts/preferences/test/common/smartSnippetInserter.test.ts +/users/foo/src/vs/workbench/parts/preferences/browser +/users/foo/src/vs/workbench/parts/preferences/browser/keybindingWidgets.ts +/users/foo/src/vs/workbench/parts/preferences/browser/preferencesWidgets.ts +/users/foo/src/vs/workbench/parts/preferences/browser/settingsTree.ts +/users/foo/src/vs/workbench/parts/preferences/browser/settingsEditor2.ts +/users/foo/src/vs/workbench/parts/preferences/browser/keybindingsEditor.ts +/users/foo/src/vs/workbench/parts/preferences/browser/preferencesEditor.ts +/users/foo/src/vs/workbench/parts/preferences/browser/preferencesActions.ts +/users/foo/src/vs/workbench/parts/preferences/browser/keybindingsEditorContribution.ts +/users/foo/src/vs/workbench/parts/preferences/browser/preferencesRenderers.ts +/users/foo/src/vs/workbench/parts/preferences/browser/media +/users/foo/src/vs/workbench/parts/preferences/browser/media/collapsed.svg +/users/foo/src/vs/workbench/parts/preferences/browser/media/expanded-dark.svg +/users/foo/src/vs/workbench/parts/preferences/browser/media/add_inverse.svg +/users/foo/src/vs/workbench/parts/preferences/browser/media/keybindingsEditor.css +/users/foo/src/vs/workbench/parts/preferences/browser/media/clean-dark.svg +/users/foo/src/vs/workbench/parts/preferences/browser/media/collapseAll.svg +/users/foo/src/vs/workbench/parts/preferences/browser/media/collapsed-dark.svg +/users/foo/src/vs/workbench/parts/preferences/browser/media/regex.svg +/users/foo/src/vs/workbench/parts/preferences/browser/media/collapseAll_inverse.svg +/users/foo/src/vs/workbench/parts/preferences/browser/media/info.svg +/users/foo/src/vs/workbench/parts/preferences/browser/media/add.svg +/users/foo/src/vs/workbench/parts/preferences/browser/media/expanded.svg +/users/foo/src/vs/workbench/parts/preferences/browser/media/settingsEditor2.css +/users/foo/src/vs/workbench/parts/preferences/browser/media/preferences.css +/users/foo/src/vs/workbench/parts/preferences/browser/media/status-error.svg +/users/foo/src/vs/workbench/parts/preferences/browser/media/edit.svg +/users/foo/src/vs/workbench/parts/preferences/browser/media/edit_inverse.svg +/users/foo/src/vs/workbench/parts/preferences/browser/media/sort_precedence_inverse.svg +/users/foo/src/vs/workbench/parts/preferences/browser/media/sort_precedence.svg +/users/foo/src/vs/workbench/parts/preferences/browser/media/clean.svg +/users/foo/src/vs/workbench/parts/preferences/browser/media/regex-dark.svg +/users/foo/src/vs/workbench/parts/preferences/browser/media/keybindings.css +/users/foo/src/vs/workbench/parts/preferences/common +/users/foo/src/vs/workbench/parts/preferences/common/smartSnippetInserter.ts +/users/foo/src/vs/workbench/parts/preferences/common/preferences.ts +/users/foo/src/vs/workbench/parts/preferences/common/preferencesContribution.ts +/users/foo/src/vs/workbench/parts/preferences/electron-browser +/users/foo/src/vs/workbench/parts/preferences/electron-browser/preferences.contribution.ts +/users/foo/src/vs/workbench/parts/preferences/electron-browser/preferencesSearch.ts +/users/foo/src/vs/workbench/parts/codeEditor +/users/foo/src/vs/workbench/parts/codeEditor/electron-browser +/users/foo/src/vs/workbench/parts/codeEditor/electron-browser/languageConfiguration +/users/foo/src/vs/workbench/parts/codeEditor/electron-browser/languageConfiguration/languageConfigurationExtensionPoint.ts +/users/foo/src/vs/workbench/parts/codeEditor/electron-browser/toggleMinimap.ts +/users/foo/src/vs/workbench/parts/codeEditor/electron-browser/toggleWordWrap.ts +/users/foo/src/vs/workbench/parts/codeEditor/electron-browser/accessibility.ts +/users/foo/src/vs/workbench/parts/codeEditor/electron-browser/selectionClipboard.ts +/users/foo/src/vs/workbench/parts/codeEditor/electron-browser/textMate +/users/foo/src/vs/workbench/parts/codeEditor/electron-browser/textMate/inspectTMScopes.css +/users/foo/src/vs/workbench/parts/codeEditor/electron-browser/textMate/inspectTMScopes.ts +/users/foo/src/vs/workbench/parts/codeEditor/electron-browser/toggleMultiCursorModifier.ts +/users/foo/src/vs/workbench/parts/codeEditor/electron-browser/largeFileOptimizations.ts +/users/foo/src/vs/workbench/parts/codeEditor/electron-browser/inspectKeybindings.ts +/users/foo/src/vs/workbench/parts/codeEditor/electron-browser/workbenchReferenceSearch.ts +/users/foo/src/vs/workbench/parts/codeEditor/electron-browser/toggleRenderControlCharacter.ts +/users/foo/src/vs/workbench/parts/codeEditor/electron-browser/menuPreventer.ts +/users/foo/src/vs/workbench/parts/codeEditor/electron-browser/accessibility.css +/users/foo/src/vs/workbench/parts/codeEditor/electron-browser/toggleRenderWhitespace.ts +/users/foo/src/vs/workbench/parts/codeEditor/electron-browser/media +/users/foo/src/vs/workbench/parts/codeEditor/electron-browser/media/WordWrap_16x.svg +/users/foo/src/vs/workbench/parts/codeEditor/codeEditor.contribution.ts +/users/foo/src/vs/workbench/parts/tasks +/users/foo/src/vs/workbench/parts/tasks/test +/users/foo/src/vs/workbench/parts/tasks/test/common +/users/foo/src/vs/workbench/parts/tasks/test/common/problemMatcher.test.ts +/users/foo/src/vs/workbench/parts/tasks/test/electron-browser +/users/foo/src/vs/workbench/parts/tasks/test/electron-browser/configuration.test.ts +/users/foo/src/vs/workbench/parts/tasks/browser +/users/foo/src/vs/workbench/parts/tasks/browser/taskQuickOpen.ts +/users/foo/src/vs/workbench/parts/tasks/browser/quickOpen.ts +/users/foo/src/vs/workbench/parts/tasks/common +/users/foo/src/vs/workbench/parts/tasks/common/taskTemplates.ts +/users/foo/src/vs/workbench/parts/tasks/common/problemMatcher.ts +/users/foo/src/vs/workbench/parts/tasks/common/taskDefinitionRegistry.ts +/users/foo/src/vs/workbench/parts/tasks/common/taskService.ts +/users/foo/src/vs/workbench/parts/tasks/common/problemCollectors.ts +/users/foo/src/vs/workbench/parts/tasks/common/taskSystem.ts +/users/foo/src/vs/workbench/parts/tasks/common/tasks.ts +/users/foo/src/vs/workbench/parts/tasks/electron-browser +/users/foo/src/vs/workbench/parts/tasks/electron-browser/jsonSchema_v1.ts +/users/foo/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.ts +/users/foo/src/vs/workbench/parts/tasks/electron-browser/task.contribution.ts +/users/foo/src/vs/workbench/parts/tasks/electron-browser/jsonSchema_v2.ts +/users/foo/src/vs/workbench/parts/tasks/electron-browser/jsonSchemaCommon.ts +/users/foo/src/vs/workbench/parts/tasks/electron-browser/media +/users/foo/src/vs/workbench/parts/tasks/electron-browser/media/task.svg +/users/foo/src/vs/workbench/parts/tasks/electron-browser/media/status-error.svg +/users/foo/src/vs/workbench/parts/tasks/electron-browser/media/task.contribution.css +/users/foo/src/vs/workbench/parts/tasks/electron-browser/media/status-info.svg +/users/foo/src/vs/workbench/parts/tasks/electron-browser/media/status-warning.svg +/users/foo/src/vs/workbench/parts/tasks/electron-browser/media/configure-inverse.svg +/users/foo/src/vs/workbench/parts/tasks/electron-browser/media/configure.svg +/users/foo/src/vs/workbench/parts/tasks/node +/users/foo/src/vs/workbench/parts/tasks/node/taskConfiguration.ts +/users/foo/src/vs/workbench/parts/tasks/node/processTaskSystem.ts +/users/foo/src/vs/workbench/parts/tasks/node/processRunnerDetector.ts +/users/foo/src/vs/workbench/parts/.DS_Store +/users/foo/src/vs/workbench/parts/update +/users/foo/src/vs/workbench/parts/update/electron-browser +/users/foo/src/vs/workbench/parts/update/electron-browser/update.contribution.ts +/users/foo/src/vs/workbench/parts/update/electron-browser/releaseNotesEditor.ts +/users/foo/src/vs/workbench/parts/update/electron-browser/update.ts +/users/foo/src/vs/workbench/parts/update/electron-browser/media +/users/foo/src/vs/workbench/parts/update/electron-browser/media/markdown.css +/users/foo/src/vs/workbench/parts/update/electron-browser/media/update.svg +/users/foo/src/vs/workbench/parts/update/electron-browser/media/code-icon.svg +/users/foo/src/vs/workbench/parts/update/electron-browser/media/update.contribution.css +/users/foo/src/vs/workbench/parts/markers +/users/foo/src/vs/workbench/parts/markers/test +/users/foo/src/vs/workbench/parts/markers/test/electron-browser +/users/foo/src/vs/workbench/parts/markers/test/electron-browser/markersModel.test.ts +/users/foo/src/vs/workbench/parts/markers/electron-browser +/users/foo/src/vs/workbench/parts/markers/electron-browser/markers.contribution.ts +/users/foo/src/vs/workbench/parts/markers/electron-browser/markersFileDecorations.ts +/users/foo/src/vs/workbench/parts/markers/electron-browser/markersTreeViewer.ts +/users/foo/src/vs/workbench/parts/markers/electron-browser/messages.ts +/users/foo/src/vs/workbench/parts/markers/electron-browser/markers.ts +/users/foo/src/vs/workbench/parts/markers/electron-browser/markersPanel.ts +/users/foo/src/vs/workbench/parts/markers/electron-browser/markersTreeController.ts +/users/foo/src/vs/workbench/parts/markers/electron-browser/constants.ts +/users/foo/src/vs/workbench/parts/markers/electron-browser/markersModel.ts +/users/foo/src/vs/workbench/parts/markers/electron-browser/markersPanelActions.ts +/users/foo/src/vs/workbench/parts/markers/electron-browser/media +/users/foo/src/vs/workbench/parts/markers/electron-browser/media/excludeSettings.svg +/users/foo/src/vs/workbench/parts/markers/electron-browser/media/markers.css +/users/foo/src/vs/workbench/parts/markers/electron-browser/media/status-info-inverse.svg +/users/foo/src/vs/workbench/parts/markers/electron-browser/media/status-error-inverse.svg +/users/foo/src/vs/workbench/parts/markers/electron-browser/media/status-error.svg +/users/foo/src/vs/workbench/parts/markers/electron-browser/media/excludeSettings-dark.svg +/users/foo/src/vs/workbench/parts/markers/electron-browser/media/status-info.svg +/users/foo/src/vs/workbench/parts/markers/electron-browser/media/status-warning.svg +/users/foo/src/vs/workbench/parts/markers/electron-browser/media/status-warning-inverse.svg +/users/foo/src/vs/workbench/parts/quickopen +/users/foo/src/vs/workbench/parts/quickopen/.DS_Store +/users/foo/src/vs/workbench/parts/quickopen/browser +/users/foo/src/vs/workbench/parts/quickopen/browser/gotoLineHandler.ts +/users/foo/src/vs/workbench/parts/quickopen/browser/commandsHandler.ts +/users/foo/src/vs/workbench/parts/quickopen/browser/gotoSymbolHandler.ts +/users/foo/src/vs/workbench/parts/quickopen/browser/helpHandler.ts +/users/foo/src/vs/workbench/parts/quickopen/browser/viewPickerHandler.ts +/users/foo/src/vs/workbench/parts/quickopen/browser/quickopen.contribution.ts +/users/foo/src/vs/workbench/parts/quickopen/browser/media +/users/foo/src/vs/workbench/parts/quickopen/browser/media/Constant_16x.svg +/users/foo/src/vs/workbench/parts/quickopen/browser/media/symbol-sprite.svg +/users/foo/src/vs/workbench/parts/quickopen/browser/media/EnumItem_inverse_16x.svg +/users/foo/src/vs/workbench/parts/quickopen/browser/media/Template_16x_vscode.svg +/users/foo/src/vs/workbench/parts/quickopen/browser/media/Operator_16x_vscode_inverse.svg +/users/foo/src/vs/workbench/parts/quickopen/browser/media/Structure_16x_vscode.svg +/users/foo/src/vs/workbench/parts/quickopen/browser/media/Event_16x_vscode.svg +/users/foo/src/vs/workbench/parts/quickopen/browser/media/gotoSymbolHandler.css +/users/foo/src/vs/workbench/parts/quickopen/browser/media/Structure_16x_vscode_inverse.svg +/users/foo/src/vs/workbench/parts/quickopen/browser/media/Event_16x_vscode_inverse.svg +/users/foo/src/vs/workbench/parts/quickopen/browser/media/Template_16x_vscode_inverse.svg +/users/foo/src/vs/workbench/parts/quickopen/browser/media/EnumItem_16x.svg +/users/foo/src/vs/workbench/parts/quickopen/browser/media/Operator_16x_vscode.svg +/users/foo/src/vs/workbench/parts/quickopen/browser/media/Constant_16x_inverse.svg +/users/foo/src/vs/workbench/parts/localizations +/users/foo/src/vs/workbench/parts/localizations/electron-browser +/users/foo/src/vs/workbench/parts/localizations/electron-browser/localizationsActions.ts +/users/foo/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.ts +/users/foo/src/vs/workbench/parts/webview +/users/foo/src/vs/workbench/parts/webview/electron-browser +/users/foo/src/vs/workbench/parts/webview/electron-browser/webviewEditorInput.ts +/users/foo/src/vs/workbench/parts/webview/electron-browser/webviewElement.ts +/users/foo/src/vs/workbench/parts/webview/electron-browser/webview-pre.js +/users/foo/src/vs/workbench/parts/webview/electron-browser/baseWebviewEditor.ts +/users/foo/src/vs/workbench/parts/webview/electron-browser/webviewEditor.ts +/users/foo/src/vs/workbench/parts/webview/electron-browser/webview.html +/users/foo/src/vs/workbench/parts/webview/electron-browser/webviewEditorService.ts +/users/foo/src/vs/workbench/parts/webview/electron-browser/webviewFindWidget.ts +/users/foo/src/vs/workbench/parts/webview/electron-browser/webviewEditorInputFactory.ts +/users/foo/src/vs/workbench/parts/webview/electron-browser/webviewCommands.ts +/users/foo/src/vs/workbench/parts/webview/electron-browser/webview.contribution.ts +/users/foo/src/vs/workbench/parts/output +/users/foo/src/vs/workbench/parts/output/test +/users/foo/src/vs/workbench/parts/output/test/outputLinkProvider.test.ts +/users/foo/src/vs/workbench/parts/output/browser +/users/foo/src/vs/workbench/parts/output/browser/outputPanel.ts +/users/foo/src/vs/workbench/parts/output/browser/logViewer.ts +/users/foo/src/vs/workbench/parts/output/browser/outputActions.ts +/users/foo/src/vs/workbench/parts/output/browser/media +/users/foo/src/vs/workbench/parts/output/browser/media/clear_output_inverse.svg +/users/foo/src/vs/workbench/parts/output/browser/media/output_lock_inverse.svg +/users/foo/src/vs/workbench/parts/output/browser/media/open_log_file.svg +/users/foo/src/vs/workbench/parts/output/browser/media/output_unlock.svg +/users/foo/src/vs/workbench/parts/output/browser/media/open_log_file_inverse.svg +/users/foo/src/vs/workbench/parts/output/browser/media/output_lock.svg +/users/foo/src/vs/workbench/parts/output/browser/media/output_unlock_inverse.svg +/users/foo/src/vs/workbench/parts/output/browser/media/output.css +/users/foo/src/vs/workbench/parts/output/browser/media/clear_output.svg +/users/foo/src/vs/workbench/parts/output/common +/users/foo/src/vs/workbench/parts/output/common/output.ts +/users/foo/src/vs/workbench/parts/output/common/outputLinkProvider.ts +/users/foo/src/vs/workbench/parts/output/common/outputLinkComputer.ts +/users/foo/src/vs/workbench/parts/output/electron-browser +/users/foo/src/vs/workbench/parts/output/electron-browser/outputServices.ts +/users/foo/src/vs/workbench/parts/output/electron-browser/output.contribution.ts +/users/foo/src/vs/workbench/parts/terminal +/users/foo/src/vs/workbench/parts/terminal/test +/users/foo/src/vs/workbench/parts/terminal/test/electron-browser +/users/foo/src/vs/workbench/parts/terminal/test/electron-browser/terminalConfigHelper.test.ts +/users/foo/src/vs/workbench/parts/terminal/test/electron-browser/terminalColorRegistry.test.ts +/users/foo/src/vs/workbench/parts/terminal/test/electron-browser/terminalLinkHandler.test.ts +/users/foo/src/vs/workbench/parts/terminal/test/node +/users/foo/src/vs/workbench/parts/terminal/test/node/terminalCommandTracker.test.ts +/users/foo/src/vs/workbench/parts/terminal/test/node/terminalEnvironment.test.ts +/users/foo/src/vs/workbench/parts/terminal/browser +/users/foo/src/vs/workbench/parts/terminal/browser/terminalTab.ts +/users/foo/src/vs/workbench/parts/terminal/browser/terminalQuickOpen.ts +/users/foo/src/vs/workbench/parts/terminal/browser/terminalWidgetManager.ts +/users/foo/src/vs/workbench/parts/terminal/browser/terminalFindWidget.ts +/users/foo/src/vs/workbench/parts/terminal/common +/users/foo/src/vs/workbench/parts/terminal/common/terminalService.ts +/users/foo/src/vs/workbench/parts/terminal/common/terminalCommands.ts +/users/foo/src/vs/workbench/parts/terminal/common/terminalColorRegistry.ts +/users/foo/src/vs/workbench/parts/terminal/common/terminal.ts +/users/foo/src/vs/workbench/parts/terminal/electron-browser +/users/foo/src/vs/workbench/parts/terminal/electron-browser/terminalService.ts +/users/foo/src/vs/workbench/parts/terminal/electron-browser/terminalActions.ts +/users/foo/src/vs/workbench/parts/terminal/electron-browser/terminalConfigHelper.ts +/users/foo/src/vs/workbench/parts/terminal/electron-browser/terminalLinkHandler.ts +/users/foo/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.ts +/users/foo/src/vs/workbench/parts/terminal/electron-browser/terminalPanel.ts +/users/foo/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts +/users/foo/src/vs/workbench/parts/terminal/electron-browser/terminalProcessManager.ts +/users/foo/src/vs/workbench/parts/terminal/electron-browser/media +/users/foo/src/vs/workbench/parts/terminal/electron-browser/media/terminal.css +/users/foo/src/vs/workbench/parts/terminal/electron-browser/media/xterm.css +/users/foo/src/vs/workbench/parts/terminal/electron-browser/media/kill-inverse.svg +/users/foo/src/vs/workbench/parts/terminal/electron-browser/media/widgets.css +/users/foo/src/vs/workbench/parts/terminal/electron-browser/media/new-inverse.svg +/users/foo/src/vs/workbench/parts/terminal/electron-browser/media/split-horizontal.svg +/users/foo/src/vs/workbench/parts/terminal/electron-browser/media/split-inverse.svg +/users/foo/src/vs/workbench/parts/terminal/electron-browser/media/kill.svg +/users/foo/src/vs/workbench/parts/terminal/electron-browser/media/split.svg +/users/foo/src/vs/workbench/parts/terminal/electron-browser/media/scrollbar.css +/users/foo/src/vs/workbench/parts/terminal/electron-browser/media/split-horizontal-inverse.svg +/users/foo/src/vs/workbench/parts/terminal/electron-browser/media/new.svg +/users/foo/src/vs/workbench/parts/terminal/electron-browser/media/configure-inverse.svg +/users/foo/src/vs/workbench/parts/terminal/electron-browser/media/configure.svg +/users/foo/src/vs/workbench/parts/terminal/node +/users/foo/src/vs/workbench/parts/terminal/node/terminalEnvironment.ts +/users/foo/src/vs/workbench/parts/terminal/node/terminalProcessExtHostProxy.ts +/users/foo/src/vs/workbench/parts/terminal/node/terminalCommandTracker.ts +/users/foo/src/vs/workbench/parts/terminal/node/terminalProcess.ts +/users/foo/src/vs/workbench/parts/terminal/node/terminal.ts +/users/foo/src/vs/workbench/parts/terminal/node/windowsShellHelper.ts +/users/foo/src/vs/workbench/parts/html +/users/foo/src/vs/workbench/parts/html/common +/users/foo/src/vs/workbench/parts/html/common/htmlInput.ts +/users/foo/src/vs/workbench/parts/html/electron-browser +/users/foo/src/vs/workbench/parts/html/electron-browser/html.contribution.ts +/users/foo/src/vs/workbench/parts/html/electron-browser/htmlPreviewPart.ts +/users/foo/src/vs/workbench/parts/cli +/users/foo/src/vs/workbench/parts/cli/electron-browser +/users/foo/src/vs/workbench/parts/cli/electron-browser/cli.contribution.ts +/users/foo/src/vs/workbench/parts/welcome +/users/foo/src/vs/workbench/parts/welcome/page +/users/foo/src/vs/workbench/parts/welcome/page/electron-browser +/users/foo/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.contribution.ts +/users/foo/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.ts +/users/foo/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.ts +/users/foo/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.css +/users/foo/src/vs/workbench/parts/welcome/walkThrough +/users/foo/src/vs/workbench/parts/welcome/walkThrough/electron-browser +/users/foo/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughActions.ts +/users/foo/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.ts +/users/foo/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThrough.contribution.ts +/users/foo/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.css +/users/foo/src/vs/workbench/parts/welcome/walkThrough/electron-browser/editor +/users/foo/src/vs/workbench/parts/welcome/walkThrough/electron-browser/editor/editorWalkThrough.ts +/users/foo/src/vs/workbench/parts/welcome/walkThrough/electron-browser/editor/vs_code_editor_walkthrough.md +/users/foo/src/vs/workbench/parts/welcome/walkThrough/node +/users/foo/src/vs/workbench/parts/welcome/walkThrough/node/walkThroughUtils.ts +/users/foo/src/vs/workbench/parts/welcome/walkThrough/node/walkThroughInput.ts +/users/foo/src/vs/workbench/parts/welcome/walkThrough/node/walkThroughContentProvider.ts +/users/foo/src/vs/workbench/parts/welcome/gettingStarted +/users/foo/src/vs/workbench/parts/welcome/gettingStarted/test +/users/foo/src/vs/workbench/parts/welcome/gettingStarted/test/common +/users/foo/src/vs/workbench/parts/welcome/gettingStarted/test/common/gettingStarted.test.ts +/users/foo/src/vs/workbench/parts/welcome/gettingStarted/electron-browser +/users/foo/src/vs/workbench/parts/welcome/gettingStarted/electron-browser/gettingStarted.contribution.ts +/users/foo/src/vs/workbench/parts/welcome/gettingStarted/electron-browser/telemetryOptOut.ts +/users/foo/src/vs/workbench/parts/welcome/gettingStarted/electron-browser/gettingStarted.ts +/users/foo/src/vs/workbench/parts/welcome/code-icon.svg +/users/foo/src/vs/workbench/parts/welcome/overlay +/users/foo/src/vs/workbench/parts/welcome/overlay/browser +/users/foo/src/vs/workbench/parts/welcome/overlay/browser/welcomeOverlay.css +/users/foo/src/vs/workbench/parts/welcome/overlay/browser/welcomeOverlay.ts +/users/foo/src/vs/workbench/parts/welcome/overlay/browser/media +/users/foo/src/vs/workbench/parts/welcome/overlay/browser/media/commandpalette-dark.svg +/users/foo/src/vs/workbench/parts/welcome/overlay/browser/media/commandpalette.svg +/users/foo/src/vs/workbench/parts/url +/users/foo/src/vs/workbench/parts/url/electron-browser +/users/foo/src/vs/workbench/parts/url/electron-browser/url.contribution.ts +/users/foo/src/vs/workbench/parts/emmet +/users/foo/src/vs/workbench/parts/emmet/test +/users/foo/src/vs/workbench/parts/emmet/test/electron-browser +/users/foo/src/vs/workbench/parts/emmet/test/electron-browser/emmetAction.test.ts +/users/foo/src/vs/workbench/parts/emmet/browser +/users/foo/src/vs/workbench/parts/emmet/browser/emmet.browser.contribution.ts +/users/foo/src/vs/workbench/parts/emmet/browser/actions +/users/foo/src/vs/workbench/parts/emmet/browser/actions/showEmmetCommands.ts +/users/foo/src/vs/workbench/parts/emmet/electron-browser +/users/foo/src/vs/workbench/parts/emmet/electron-browser/emmetActions.ts +/users/foo/src/vs/workbench/parts/emmet/electron-browser/actions +/users/foo/src/vs/workbench/parts/emmet/electron-browser/actions/expandAbbreviation.ts +/users/foo/src/vs/workbench/parts/emmet/electron-browser/emmet.contribution.ts +/users/foo/src/vs/workbench/parts/feedback +/users/foo/src/vs/workbench/parts/feedback/electron-browser +/users/foo/src/vs/workbench/parts/feedback/electron-browser/feedback.contribution.ts +/users/foo/src/vs/workbench/parts/feedback/electron-browser/feedback.ts +/users/foo/src/vs/workbench/parts/feedback/electron-browser/feedbackStatusbarItem.ts +/users/foo/src/vs/workbench/parts/feedback/electron-browser/media +/users/foo/src/vs/workbench/parts/feedback/electron-browser/media/close-dark.svg +/users/foo/src/vs/workbench/parts/feedback/electron-browser/media/sad.svg +/users/foo/src/vs/workbench/parts/feedback/electron-browser/media/smiley.svg +/users/foo/src/vs/workbench/parts/feedback/electron-browser/media/happy.svg +/users/foo/src/vs/workbench/parts/feedback/electron-browser/media/info.svg +/users/foo/src/vs/workbench/parts/feedback/electron-browser/media/close.svg +/users/foo/src/vs/workbench/parts/feedback/electron-browser/media/feedback.css +/users/foo/src/vs/workbench/parts/feedback/electron-browser/media/twitter.svg +/users/foo/src/vs/workbench/parts/extensions +/users/foo/src/vs/workbench/parts/extensions/test +/users/foo/src/vs/workbench/parts/extensions/test/common +/users/foo/src/vs/workbench/parts/extensions/test/common/extensionQuery.test.ts +/users/foo/src/vs/workbench/parts/extensions/test/electron-browser +/users/foo/src/vs/workbench/parts/extensions/test/electron-browser/extensionsTipsService.test.ts +/users/foo/src/vs/workbench/parts/extensions/test/electron-browser/extensionsActions.test.ts +/users/foo/src/vs/workbench/parts/extensions/test/electron-browser/extensionsWorkbenchService.test.ts +/users/foo/src/vs/workbench/parts/extensions/browser +/users/foo/src/vs/workbench/parts/extensions/browser/extensionsWidgets.ts +/users/foo/src/vs/workbench/parts/extensions/browser/dependenciesViewer.ts +/users/foo/src/vs/workbench/parts/extensions/browser/extensionsQuickOpen.ts +/users/foo/src/vs/workbench/parts/extensions/browser/extensionsList.ts +/users/foo/src/vs/workbench/parts/extensions/browser/extensionsActions.ts +/users/foo/src/vs/workbench/parts/extensions/browser/media +/users/foo/src/vs/workbench/parts/extensions/browser/media/language-icon.svg +/users/foo/src/vs/workbench/parts/extensions/browser/media/theme-icon.png +/users/foo/src/vs/workbench/parts/extensions/browser/media/clear.svg +/users/foo/src/vs/workbench/parts/extensions/browser/media/HalfStarLight.svg +/users/foo/src/vs/workbench/parts/extensions/browser/media/EmptyStar.svg +/users/foo/src/vs/workbench/parts/extensions/browser/media/loading.svg +/users/foo/src/vs/workbench/parts/extensions/browser/media/manage-inverse.svg +/users/foo/src/vs/workbench/parts/extensions/browser/media/extensionActions.css +/users/foo/src/vs/workbench/parts/extensions/browser/media/FullStarLight.svg +/users/foo/src/vs/workbench/parts/extensions/browser/media/defaultIcon.png +/users/foo/src/vs/workbench/parts/extensions/browser/media/extensionsWidgets.css +/users/foo/src/vs/workbench/parts/extensions/browser/media/clear-inverse.svg +/users/foo/src/vs/workbench/parts/extensions/browser/media/manage.svg +/users/foo/src/vs/workbench/parts/extensions/common +/users/foo/src/vs/workbench/parts/extensions/common/extensionQuery.ts +/users/foo/src/vs/workbench/parts/extensions/common/extensionsFileTemplate.ts +/users/foo/src/vs/workbench/parts/extensions/common/extensionsInput.ts +/users/foo/src/vs/workbench/parts/extensions/common/extensions.ts +/users/foo/src/vs/workbench/parts/extensions/electron-browser +/users/foo/src/vs/workbench/parts/extensions/electron-browser/extensionsViews.ts +/users/foo/src/vs/workbench/parts/extensions/electron-browser/extensions.contribution.ts +/users/foo/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.ts +/users/foo/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.ts +/users/foo/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.ts +/users/foo/src/vs/workbench/parts/extensions/electron-browser/runtimeExtensionsEditor.ts +/users/foo/src/vs/workbench/parts/extensions/electron-browser/extensionsActions.ts +/users/foo/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.ts +/users/foo/src/vs/workbench/parts/extensions/electron-browser/extensionProfileService.ts +/users/foo/src/vs/workbench/parts/extensions/electron-browser/media +/users/foo/src/vs/workbench/parts/extensions/electron-browser/media/markdown.css +/users/foo/src/vs/workbench/parts/extensions/electron-browser/media/runtimeExtensionsEditor.css +/users/foo/src/vs/workbench/parts/extensions/electron-browser/media/profile-start.svg +/users/foo/src/vs/workbench/parts/extensions/electron-browser/media/profile-start-inverse.svg +/users/foo/src/vs/workbench/parts/extensions/electron-browser/media/save.svg +/users/foo/src/vs/workbench/parts/extensions/electron-browser/media/loading.svg +/users/foo/src/vs/workbench/parts/extensions/electron-browser/media/save-inverse.svg +/users/foo/src/vs/workbench/parts/extensions/electron-browser/media/profile-stop-inverse.svg +/users/foo/src/vs/workbench/parts/extensions/electron-browser/media/extensions.css +/users/foo/src/vs/workbench/parts/extensions/electron-browser/media/extensionEditor.css +/users/foo/src/vs/workbench/parts/extensions/electron-browser/media/profile-stop.svg +/users/foo/src/vs/workbench/parts/extensions/electron-browser/media/extensionsViewlet.css +/users/foo/src/vs/workbench/parts/extensions/electron-browser/media/extensions-dark.svg +/users/foo/src/vs/workbench/parts/extensions/node +/users/foo/src/vs/workbench/parts/extensions/node/extensionsWorkbenchService.ts +/users/foo/src/vs/workbench/parts/search +/users/foo/src/vs/workbench/parts/search/test +/users/foo/src/vs/workbench/parts/search/test/browser +/users/foo/src/vs/workbench/parts/search/test/browser/openFileHandler.test.ts +/users/foo/src/vs/workbench/parts/search/test/browser/searchViewlet.test.ts +/users/foo/src/vs/workbench/parts/search/test/browser/searchActions.test.ts +/users/foo/src/vs/workbench/parts/search/test/common +/users/foo/src/vs/workbench/parts/search/test/common/queryBuilder.test.ts +/users/foo/src/vs/workbench/parts/search/test/common/searchResult.test.ts +/users/foo/src/vs/workbench/parts/search/test/common/searchModel.test.ts +/users/foo/src/vs/workbench/parts/search/browser +/users/foo/src/vs/workbench/parts/search/browser/openSymbolHandler.ts +/users/foo/src/vs/workbench/parts/search/browser/replaceContributions.ts +/users/foo/src/vs/workbench/parts/search/browser/patternInputWidget.ts +/users/foo/src/vs/workbench/parts/search/browser/replaceService.ts +/users/foo/src/vs/workbench/parts/search/browser/openFileHandler.ts +/users/foo/src/vs/workbench/parts/search/browser/searchViewLocationUpdater.ts +/users/foo/src/vs/workbench/parts/search/browser/openAnythingHandler.ts +/users/foo/src/vs/workbench/parts/search/browser/searchActions.ts +/users/foo/src/vs/workbench/parts/search/browser/searchView.ts +/users/foo/src/vs/workbench/parts/search/browser/searchResultsView.ts +/users/foo/src/vs/workbench/parts/search/browser/searchWidget.ts +/users/foo/src/vs/workbench/parts/search/browser/media +/users/foo/src/vs/workbench/parts/search/browser/media/expando-expanded.svg +/users/foo/src/vs/workbench/parts/search/browser/media/pattern.svg +/users/foo/src/vs/workbench/parts/search/browser/media/action-remove-focus.svg +/users/foo/src/vs/workbench/parts/search/browser/media/ellipsis-inverse.svg +/users/foo/src/vs/workbench/parts/search/browser/media/clear-search-results.svg +/users/foo/src/vs/workbench/parts/search/browser/media/replace-all.svg +/users/foo/src/vs/workbench/parts/search/browser/media/expando-collapsed.svg +/users/foo/src/vs/workbench/parts/search/browser/media/excludeSettings.svg +/users/foo/src/vs/workbench/parts/search/browser/media/action-query-clear.svg +/users/foo/src/vs/workbench/parts/search/browser/media/CollapseAll.svg +/users/foo/src/vs/workbench/parts/search/browser/media/clear-search-results-dark.svg +/users/foo/src/vs/workbench/parts/search/browser/media/action-remove.svg +/users/foo/src/vs/workbench/parts/search/browser/media/action-remove-dark.svg +/users/foo/src/vs/workbench/parts/search/browser/media/CollapseAll_inverse.svg +/users/foo/src/vs/workbench/parts/search/browser/media/replace-inverse.svg +/users/foo/src/vs/workbench/parts/search/browser/media/stop.svg +/users/foo/src/vs/workbench/parts/search/browser/media/Refresh_inverse.svg +/users/foo/src/vs/workbench/parts/search/browser/media/Refresh.svg +/users/foo/src/vs/workbench/parts/search/browser/media/replace-all-inverse.svg +/users/foo/src/vs/workbench/parts/search/browser/media/excludeSettings-dark.svg +/users/foo/src/vs/workbench/parts/search/browser/media/searchview.css +/users/foo/src/vs/workbench/parts/search/browser/media/expando-expanded-dark.svg +/users/foo/src/vs/workbench/parts/search/browser/media/ellipsis.svg +/users/foo/src/vs/workbench/parts/search/browser/media/configure-inverse.svg +/users/foo/src/vs/workbench/parts/search/browser/media/action-query-clear-dark.svg +/users/foo/src/vs/workbench/parts/search/browser/media/stop-inverse.svg +/users/foo/src/vs/workbench/parts/search/browser/media/replace.svg +/users/foo/src/vs/workbench/parts/search/browser/media/expando-collapsed-dark.svg +/users/foo/src/vs/workbench/parts/search/browser/media/pattern-dark.svg +/users/foo/src/vs/workbench/parts/search/browser/media/configure.svg +/users/foo/src/vs/workbench/parts/search/common +/users/foo/src/vs/workbench/parts/search/common/queryBuilder.ts +/users/foo/src/vs/workbench/parts/search/common/replace.ts +/users/foo/src/vs/workbench/parts/search/common/search.ts +/users/foo/src/vs/workbench/parts/search/common/searchModel.ts +/users/foo/src/vs/workbench/parts/search/common/constants.ts +/users/foo/src/vs/workbench/parts/search/electron-browser +/users/foo/src/vs/workbench/parts/search/electron-browser/search.contribution.ts +/users/foo/src/vs/workbench/parts/search/electron-browser/media +/users/foo/src/vs/workbench/parts/search/electron-browser/media/search.contribution.css +/users/foo/src/vs/workbench/parts/search/electron-browser/media/search-dark.svg +/users/foo/src/vs/workbench/parts/watermark +/users/foo/src/vs/workbench/parts/watermark/electron-browser +/users/foo/src/vs/workbench/parts/watermark/electron-browser/watermark.css +/users/foo/src/vs/workbench/parts/watermark/electron-browser/watermark.ts +/users/foo/src/vs/workbench/parts/logs +/users/foo/src/vs/workbench/parts/logs/common +/users/foo/src/vs/workbench/parts/logs/common/logConstants.ts +/users/foo/src/vs/workbench/parts/logs/electron-browser +/users/foo/src/vs/workbench/parts/logs/electron-browser/logs.contribution.ts +/users/foo/src/vs/workbench/parts/logs/electron-browser/logsActions.ts +/users/foo/src/vs/workbench/parts/outline +/users/foo/src/vs/workbench/parts/outline/electron-browser +/users/foo/src/vs/workbench/parts/outline/electron-browser/outlinePanel.css +/users/foo/src/vs/workbench/parts/outline/electron-browser/outline.contribution.ts +/users/foo/src/vs/workbench/parts/outline/electron-browser/outlineTree.ts +/users/foo/src/vs/workbench/parts/outline/electron-browser/outlinePanel.ts +/users/foo/src/vs/workbench/parts/outline/electron-browser/outlineModel.ts +/users/foo/src/vs/workbench/parts/outline/electron-browser/media +/users/foo/src/vs/workbench/parts/outline/electron-browser/media/Constant_16x.svg +/users/foo/src/vs/workbench/parts/outline/electron-browser/media/symbol-sprite.svg +/users/foo/src/vs/workbench/parts/outline/electron-browser/media/EnumItem_inverse_16x.svg +/users/foo/src/vs/workbench/parts/outline/electron-browser/media/Template_16x_vscode.svg +/users/foo/src/vs/workbench/parts/outline/electron-browser/media/Operator_16x_vscode_inverse.svg +/users/foo/src/vs/workbench/parts/outline/electron-browser/media/Structure_16x_vscode.svg +/users/foo/src/vs/workbench/parts/outline/electron-browser/media/symbol-icons.css +/users/foo/src/vs/workbench/parts/outline/electron-browser/media/Event_16x_vscode.svg +/users/foo/src/vs/workbench/parts/outline/electron-browser/media/Structure_16x_vscode_inverse.svg +/users/foo/src/vs/workbench/parts/outline/electron-browser/media/Event_16x_vscode_inverse.svg +/users/foo/src/vs/workbench/parts/outline/electron-browser/media/Template_16x_vscode_inverse.svg +/users/foo/src/vs/workbench/parts/outline/electron-browser/media/EnumItem_16x.svg +/users/foo/src/vs/workbench/parts/outline/electron-browser/media/Operator_16x_vscode.svg +/users/foo/src/vs/workbench/parts/outline/electron-browser/media/Constant_16x_inverse.svg +/users/foo/src/vs/workbench/parts/execution +/users/foo/src/vs/workbench/parts/execution/test +/users/foo/src/vs/workbench/parts/execution/test/electron-browser +/users/foo/src/vs/workbench/parts/execution/test/electron-browser/terminalService.test.ts +/users/foo/src/vs/workbench/parts/execution/common +/users/foo/src/vs/workbench/parts/execution/common/execution.ts +/users/foo/src/vs/workbench/parts/execution/electron-browser +/users/foo/src/vs/workbench/parts/execution/electron-browser/terminalService.ts +/users/foo/src/vs/workbench/parts/execution/electron-browser/TerminalHelper.scpt +/users/foo/src/vs/workbench/parts/execution/electron-browser/iTermHelper.scpt +/users/foo/src/vs/workbench/parts/execution/electron-browser/execution.contribution.ts +/users/foo/src/vs/workbench/parts/execution/electron-browser/terminal.ts +/users/foo/src/vs/workbench/parts/files +/users/foo/src/vs/workbench/parts/files/test +/users/foo/src/vs/workbench/parts/files/test/browser +/users/foo/src/vs/workbench/parts/files/test/browser/fileEditorInput.test.ts +/users/foo/src/vs/workbench/parts/files/test/browser/fileEditorTracker.test.ts +/users/foo/src/vs/workbench/parts/files/test/electron-browser +/users/foo/src/vs/workbench/parts/files/test/electron-browser/fileActions.test.ts +/users/foo/src/vs/workbench/parts/files/test/electron-browser/explorerModel.test.ts +/users/foo/src/vs/workbench/parts/files/browser +/users/foo/src/vs/workbench/parts/files/browser/editors +/users/foo/src/vs/workbench/parts/files/browser/editors/textFileEditor.ts +/users/foo/src/vs/workbench/parts/files/browser/editors/binaryFileEditor.ts +/users/foo/src/vs/workbench/parts/files/browser/editors/fileEditorTracker.ts +/users/foo/src/vs/workbench/parts/files/browser/files.ts +/users/foo/src/vs/workbench/parts/files/common +/users/foo/src/vs/workbench/parts/files/common/explorerModel.ts +/users/foo/src/vs/workbench/parts/files/common/editors +/users/foo/src/vs/workbench/parts/files/common/editors/fileEditorInput.ts +/users/foo/src/vs/workbench/parts/files/common/dirtyFilesTracker.ts +/users/foo/src/vs/workbench/parts/files/common/files.ts +/users/foo/src/vs/workbench/parts/files/electron-browser +/users/foo/src/vs/workbench/parts/files/electron-browser/fileCommands.ts +/users/foo/src/vs/workbench/parts/files/electron-browser/files.contribution.ts +/users/foo/src/vs/workbench/parts/files/electron-browser/saveErrorHandler.ts +/users/foo/src/vs/workbench/parts/files/electron-browser/fileActions.contribution.ts +/users/foo/src/vs/workbench/parts/files/electron-browser/fileActions.ts +/users/foo/src/vs/workbench/parts/files/electron-browser/views +/users/foo/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.ts +/users/foo/src/vs/workbench/parts/files/electron-browser/views/explorerDecorationsProvider.ts +/users/foo/src/vs/workbench/parts/files/electron-browser/views/emptyView.ts +/users/foo/src/vs/workbench/parts/files/electron-browser/views/openEditorsView.ts +/users/foo/src/vs/workbench/parts/files/electron-browser/views/explorerView.ts +/users/foo/src/vs/workbench/parts/files/electron-browser/explorerViewlet.ts +/users/foo/src/vs/workbench/parts/files/electron-browser/media +/users/foo/src/vs/workbench/parts/files/electron-browser/media/action-close-dirty.svg +/users/foo/src/vs/workbench/parts/files/electron-browser/media/check-inverse.svg +/users/foo/src/vs/workbench/parts/files/electron-browser/media/action-close-focus.svg +/users/foo/src/vs/workbench/parts/files/electron-browser/media/saveall.svg +/users/foo/src/vs/workbench/parts/files/electron-browser/media/action-close.svg +/users/foo/src/vs/workbench/parts/files/electron-browser/media/undo-inverse.svg +/users/foo/src/vs/workbench/parts/files/electron-browser/media/AddFile_inverse.svg +/users/foo/src/vs/workbench/parts/files/electron-browser/media/new-file-tb.png +/users/foo/src/vs/workbench/parts/files/electron-browser/media/CollapseAll.svg +/users/foo/src/vs/workbench/parts/files/electron-browser/media/explorerviewlet.css +/users/foo/src/vs/workbench/parts/files/electron-browser/media/closeall_inverse.svg +/users/foo/src/vs/workbench/parts/files/electron-browser/media/split-editor-vertical.svg +/users/foo/src/vs/workbench/parts/files/electron-browser/media/saveall_inverse.svg +/users/foo/src/vs/workbench/parts/files/electron-browser/media/files-dark.svg +/users/foo/src/vs/workbench/parts/files/electron-browser/media/action-close-dirty-focus.svg +/users/foo/src/vs/workbench/parts/files/electron-browser/media/CollapseAll_inverse.svg +/users/foo/src/vs/workbench/parts/files/electron-browser/media/closeall.svg +/users/foo/src/vs/workbench/parts/files/electron-browser/media/split-editor-horizontal-inverse.svg +/users/foo/src/vs/workbench/parts/files/electron-browser/media/split-editor-horizontal.svg +/users/foo/src/vs/workbench/parts/files/electron-browser/media/Preview.svg +/users/foo/src/vs/workbench/parts/files/electron-browser/media/check.svg +/users/foo/src/vs/workbench/parts/files/electron-browser/media/split-editor-vertical-inverse.svg +/users/foo/src/vs/workbench/parts/files/electron-browser/media/fileactions.css +/users/foo/src/vs/workbench/parts/files/electron-browser/media/Refresh_inverse.svg +/users/foo/src/vs/workbench/parts/files/electron-browser/media/Refresh.svg +/users/foo/src/vs/workbench/parts/files/electron-browser/media/AddFile.svg +/users/foo/src/vs/workbench/parts/files/electron-browser/media/action-close-dirty-dark.svg +/users/foo/src/vs/workbench/parts/files/electron-browser/media/action-close-dark.svg +/users/foo/src/vs/workbench/parts/files/electron-browser/media/undo.svg +/users/foo/src/vs/workbench/parts/files/electron-browser/media/Preview_inverse.svg +/users/foo/src/vs/workbench/parts/files/electron-browser/media/AddFolder_inverse.svg +/users/foo/src/vs/workbench/parts/files/electron-browser/media/AddFolder.svg +/users/foo/src/vs/workbench/parts/surveys +/users/foo/src/vs/workbench/parts/surveys/electron-browser +/users/foo/src/vs/workbench/parts/surveys/electron-browser/languageSurveys.contribution.ts +/users/foo/src/vs/workbench/parts/surveys/electron-browser/nps.contribution.ts +/users/foo/src/vs/workbench/parts/scm +/users/foo/src/vs/workbench/parts/scm/common +/users/foo/src/vs/workbench/parts/scm/common/scm.ts +/users/foo/src/vs/workbench/parts/scm/electron-browser +/users/foo/src/vs/workbench/parts/scm/electron-browser/scmUtil.ts +/users/foo/src/vs/workbench/parts/scm/electron-browser/scmViewlet.ts +/users/foo/src/vs/workbench/parts/scm/electron-browser/scmActivity.ts +/users/foo/src/vs/workbench/parts/scm/electron-browser/scmMenus.ts +/users/foo/src/vs/workbench/parts/scm/electron-browser/scm.contribution.ts +/users/foo/src/vs/workbench/parts/scm/electron-browser/dirtydiffDecorator.ts +/users/foo/src/vs/workbench/parts/scm/electron-browser/media +/users/foo/src/vs/workbench/parts/scm/electron-browser/media/check-inverse.svg +/users/foo/src/vs/workbench/parts/scm/electron-browser/media/icon-dark.svg +/users/foo/src/vs/workbench/parts/scm/electron-browser/media/icon-light.svg +/users/foo/src/vs/workbench/parts/scm/electron-browser/media/check.svg +/users/foo/src/vs/workbench/parts/scm/electron-browser/media/dirtydiffDecorator.css +/users/foo/src/vs/workbench/parts/scm/electron-browser/media/scmViewlet.css +/users/foo/src/vs/workbench/parts/performance +/users/foo/src/vs/workbench/parts/performance/electron-browser +/users/foo/src/vs/workbench/parts/performance/electron-browser/stats.ts +/users/foo/src/vs/workbench/parts/performance/electron-browser/startupTimings.ts +/users/foo/src/vs/workbench/parts/performance/electron-browser/performance.contribution.ts +/users/foo/src/vs/workbench/parts/performance/electron-browser/startupProfiler.ts +/users/foo/src/vs/workbench/parts/backup +/users/foo/src/vs/workbench/parts/backup/common +/users/foo/src/vs/workbench/parts/backup/common/backupRestorer.ts +/users/foo/src/vs/workbench/parts/backup/common/backup.contribution.ts +/users/foo/src/vs/workbench/parts/backup/common/backupModelTracker.ts +/users/foo/src/vs/workbench/parts/themes +/users/foo/src/vs/workbench/parts/themes/test +/users/foo/src/vs/workbench/parts/themes/test/electron-browser +/users/foo/src/vs/workbench/parts/themes/test/electron-browser/themes.test.contribution.ts +/users/foo/src/vs/workbench/parts/themes/test/electron-browser/fixtures +/users/foo/src/vs/workbench/parts/themes/test/electron-browser/fixtures/foo.js +/users/foo/src/vs/workbench/parts/themes/electron-browser +/users/foo/src/vs/workbench/parts/themes/electron-browser/themes.contribution.ts +/users/foo/src/vs/workbench/parts/relauncher +/users/foo/src/vs/workbench/parts/relauncher/electron-browser +/users/foo/src/vs/workbench/parts/relauncher/electron-browser/relauncher.contribution.ts +/users/foo/src/vs/workbench/parts/stats +/users/foo/src/vs/workbench/parts/stats/test +/users/foo/src/vs/workbench/parts/stats/test/workspaceStats.test.ts +/users/foo/src/vs/workbench/parts/stats/node +/users/foo/src/vs/workbench/parts/stats/node/stats.contribution.ts +/users/foo/src/vs/workbench/parts/stats/node/workspaceStats.ts +/users/foo/src/vs/workbench/parts/debug +/users/foo/src/vs/workbench/parts/debug/test +/users/foo/src/vs/workbench/parts/debug/test/browser +/users/foo/src/vs/workbench/parts/debug/test/browser/debugANSIHandling.test.ts +/users/foo/src/vs/workbench/parts/debug/test/browser/baseDebugView.test.ts +/users/foo/src/vs/workbench/parts/debug/test/common +/users/foo/src/vs/workbench/parts/debug/test/common/debugUtils.test.ts +/users/foo/src/vs/workbench/parts/debug/test/common/mockDebug.ts +/users/foo/src/vs/workbench/parts/debug/test/common/replHistory.test.ts +/users/foo/src/vs/workbench/parts/debug/test/common/debugViewModel.test.ts +/users/foo/src/vs/workbench/parts/debug/test/common/debugSource.test.ts +/users/foo/src/vs/workbench/parts/debug/test/node +/users/foo/src/vs/workbench/parts/debug/test/node/debugModel.test.ts +/users/foo/src/vs/workbench/parts/debug/test/node/debugger.test.ts +/users/foo/src/vs/workbench/parts/debug/browser +/users/foo/src/vs/workbench/parts/debug/browser/baseDebugView.ts +/users/foo/src/vs/workbench/parts/debug/browser/debugStatus.ts +/users/foo/src/vs/workbench/parts/debug/browser/debugActionsWidget.ts +/users/foo/src/vs/workbench/parts/debug/browser/debugActionItems.ts +/users/foo/src/vs/workbench/parts/debug/browser/debugEditorActions.ts +/users/foo/src/vs/workbench/parts/debug/browser/debugContentProvider.ts +/users/foo/src/vs/workbench/parts/debug/browser/debugViewlet.ts +/users/foo/src/vs/workbench/parts/debug/browser/debugQuickOpen.ts +/users/foo/src/vs/workbench/parts/debug/browser/debugCommands.ts +/users/foo/src/vs/workbench/parts/debug/browser/debugEditorModelManager.ts +/users/foo/src/vs/workbench/parts/debug/browser/breakpointsView.ts +/users/foo/src/vs/workbench/parts/debug/browser/linkDetector.ts +/users/foo/src/vs/workbench/parts/debug/browser/statusbarColorProvider.ts +/users/foo/src/vs/workbench/parts/debug/browser/debugActions.ts +/users/foo/src/vs/workbench/parts/debug/browser/exceptionWidget.ts +/users/foo/src/vs/workbench/parts/debug/browser/debugANSIHandling.ts +/users/foo/src/vs/workbench/parts/debug/browser/media +/users/foo/src/vs/workbench/parts/debug/browser/media/step-out-inverse.svg +/users/foo/src/vs/workbench/parts/debug/browser/media/debugViewlet.css +/users/foo/src/vs/workbench/parts/debug/browser/media/remove-all.svg +/users/foo/src/vs/workbench/parts/debug/browser/media/restart.svg +/users/foo/src/vs/workbench/parts/debug/browser/media/breakpoint-conditional.svg +/users/foo/src/vs/workbench/parts/debug/browser/media/restart-inverse.svg +/users/foo/src/vs/workbench/parts/debug/browser/media/breakpoint-function.svg +/users/foo/src/vs/workbench/parts/debug/browser/media/breakpoints-activate.svg +/users/foo/src/vs/workbench/parts/debug/browser/media/disconnect.svg +/users/foo/src/vs/workbench/parts/debug/browser/media/breakpoint-conditional-disabled.svg +/users/foo/src/vs/workbench/parts/debug/browser/media/disconnect-inverse.svg +/users/foo/src/vs/workbench/parts/debug/browser/media/drag.svg +/users/foo/src/vs/workbench/parts/debug/browser/media/clear-repl.svg +/users/foo/src/vs/workbench/parts/debug/browser/media/debug.contribution.css +/users/foo/src/vs/workbench/parts/debug/browser/media/breakpoint-hint.svg +/users/foo/src/vs/workbench/parts/debug/browser/media/continue-inverse.svg +/users/foo/src/vs/workbench/parts/debug/browser/media/breakpoint-unsupported.svg +/users/foo/src/vs/workbench/parts/debug/browser/media/clear-repl-inverse.svg +/users/foo/src/vs/workbench/parts/debug/browser/media/exceptionWidget.css +/users/foo/src/vs/workbench/parts/debug/browser/media/breakpoint-log.svg +/users/foo/src/vs/workbench/parts/debug/browser/media/continue.svg +/users/foo/src/vs/workbench/parts/debug/browser/media/debugActionsWidget.css +/users/foo/src/vs/workbench/parts/debug/browser/media/breakpoint-function-disabled.svg +/users/foo/src/vs/workbench/parts/debug/browser/media/stop.svg +/users/foo/src/vs/workbench/parts/debug/browser/media/breakpointWidget.css +/users/foo/src/vs/workbench/parts/debug/browser/media/add.svg +/users/foo/src/vs/workbench/parts/debug/browser/media/breakpoint-log-unverified.svg +/users/foo/src/vs/workbench/parts/debug/browser/media/remove-inverse.svg +/users/foo/src/vs/workbench/parts/debug/browser/media/repl.css +/users/foo/src/vs/workbench/parts/debug/browser/media/current-arrow.svg +/users/foo/src/vs/workbench/parts/debug/browser/media/remove-all-inverse.svg +/users/foo/src/vs/workbench/parts/debug/browser/media/debugHover.css +/users/foo/src/vs/workbench/parts/debug/browser/media/start.svg +/users/foo/src/vs/workbench/parts/debug/browser/media/start-inverse.svg +/users/foo/src/vs/workbench/parts/debug/browser/media/debug-dark.svg +/users/foo/src/vs/workbench/parts/debug/browser/media/repl-inverse.svg +/users/foo/src/vs/workbench/parts/debug/browser/media/add-focus.svg +/users/foo/src/vs/workbench/parts/debug/browser/media/step-over-inverse.svg +/users/foo/src/vs/workbench/parts/debug/browser/media/step-into.svg +/users/foo/src/vs/workbench/parts/debug/browser/media/step-into-inverse.svg +/users/foo/src/vs/workbench/parts/debug/browser/media/repl.svg +/users/foo/src/vs/workbench/parts/debug/browser/media/breakpoint.svg +/users/foo/src/vs/workbench/parts/debug/browser/media/breakpoint-disabled.svg +/users/foo/src/vs/workbench/parts/debug/browser/media/current-and-breakpoint.svg +/users/foo/src/vs/workbench/parts/debug/browser/media/add-inverse.svg +/users/foo/src/vs/workbench/parts/debug/browser/media/remove.svg +/users/foo/src/vs/workbench/parts/debug/browser/media/breakpoint-log-disabled.svg +/users/foo/src/vs/workbench/parts/debug/browser/media/stackframe-and-breakpoint.svg +/users/foo/src/vs/workbench/parts/debug/browser/media/breakpoint-unverified.svg +/users/foo/src/vs/workbench/parts/debug/browser/media/configure-inverse.svg +/users/foo/src/vs/workbench/parts/debug/browser/media/stop-inverse.svg +/users/foo/src/vs/workbench/parts/debug/browser/media/step-over.svg +/users/foo/src/vs/workbench/parts/debug/browser/media/stackframe-arrow.svg +/users/foo/src/vs/workbench/parts/debug/browser/media/pause.svg +/users/foo/src/vs/workbench/parts/debug/browser/media/breakpoint-conditional-unverified.svg +/users/foo/src/vs/workbench/parts/debug/browser/media/step-out.svg +/users/foo/src/vs/workbench/parts/debug/browser/media/remove-focus.svg +/users/foo/src/vs/workbench/parts/debug/browser/media/breakpoint-function-unverified.svg +/users/foo/src/vs/workbench/parts/debug/browser/media/pause-inverse.svg +/users/foo/src/vs/workbench/parts/debug/browser/media/configure.svg +/users/foo/src/vs/workbench/parts/debug/browser/media/breakpoints-activate-inverse.svg +/users/foo/src/vs/workbench/parts/debug/common +/users/foo/src/vs/workbench/parts/debug/common/debugSource.ts +/users/foo/src/vs/workbench/parts/debug/common/debugModel.ts +/users/foo/src/vs/workbench/parts/debug/common/debugUtils.ts +/users/foo/src/vs/workbench/parts/debug/common/debugSchemas.ts +/users/foo/src/vs/workbench/parts/debug/common/debugViewModel.ts +/users/foo/src/vs/workbench/parts/debug/common/debug.ts +/users/foo/src/vs/workbench/parts/debug/common/debugProtocol.d.ts +/users/foo/src/vs/workbench/parts/debug/common/replHistory.ts +/users/foo/src/vs/workbench/parts/debug/electron-browser +/users/foo/src/vs/workbench/parts/debug/electron-browser/terminalSupport.ts +/users/foo/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.ts +/users/foo/src/vs/workbench/parts/debug/electron-browser/debug.contribution.ts +/users/foo/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.ts +/users/foo/src/vs/workbench/parts/debug/electron-browser/rawDebugSession.ts +/users/foo/src/vs/workbench/parts/debug/electron-browser/debugHover.ts +/users/foo/src/vs/workbench/parts/debug/electron-browser/simpleDebugEditor.ts +/users/foo/src/vs/workbench/parts/debug/electron-browser/breakpointWidget.ts +/users/foo/src/vs/workbench/parts/debug/electron-browser/variablesView.ts +/users/foo/src/vs/workbench/parts/debug/electron-browser/electronDebugActions.ts +/users/foo/src/vs/workbench/parts/debug/electron-browser/repl.ts +/users/foo/src/vs/workbench/parts/debug/electron-browser/debugService.ts +/users/foo/src/vs/workbench/parts/debug/electron-browser/watchExpressionsView.ts +/users/foo/src/vs/workbench/parts/debug/electron-browser/replViewer.ts +/users/foo/src/vs/workbench/parts/debug/electron-browser/callStackView.ts +/users/foo/src/vs/workbench/parts/debug/electron-browser/media +/users/foo/src/vs/workbench/parts/debug/electron-browser/media/stop-tb.png +/users/foo/src/vs/workbench/parts/debug/electron-browser/media/stepinto-tb.png +/users/foo/src/vs/workbench/parts/debug/electron-browser/media/continue-tb.png +/users/foo/src/vs/workbench/parts/debug/electron-browser/media/stepover-tb.png +/users/foo/src/vs/workbench/parts/debug/electron-browser/media/restart-tb.png +/users/foo/src/vs/workbench/parts/debug/electron-browser/media/stepout-tb.png +/users/foo/src/vs/workbench/parts/debug/electron-browser/media/pause-tb.png +/users/foo/src/vs/workbench/parts/debug/node +/users/foo/src/vs/workbench/parts/debug/node/debugger.ts +/users/foo/src/vs/workbench/parts/debug/node/telemetryApp.ts +/users/foo/src/vs/workbench/parts/debug/node/terminals.ts +/users/foo/src/vs/workbench/parts/debug/node/debugAdapter.ts +/users/foo/src/vs/workbench/api +/users/foo/src/vs/workbench/api/shared +/users/foo/src/vs/workbench/api/shared/tasks.ts +/users/foo/src/vs/workbench/api/browser +/users/foo/src/vs/workbench/api/browser/viewsExtensionPoint.ts +/users/foo/src/vs/workbench/api/browser/viewsContainersExtensionPoint.ts +/users/foo/src/vs/workbench/api/browser/media +/users/foo/src/vs/workbench/api/browser/media/test.svg +/users/foo/src/vs/workbench/api/electron-browser +/users/foo/src/vs/workbench/api/electron-browser/mainThreadSCM.ts +/users/foo/src/vs/workbench/api/electron-browser/mainThreadSaveParticipant.ts +/users/foo/src/vs/workbench/api/electron-browser/mainThreadTask.ts +/users/foo/src/vs/workbench/api/electron-browser/mainThreadDocuments.ts +/users/foo/src/vs/workbench/api/electron-browser/extHostCustomers.ts +/users/foo/src/vs/workbench/api/electron-browser/mainThreadExtensionService.ts +/users/foo/src/vs/workbench/api/electron-browser/mainThreadDebugService.ts +/users/foo/src/vs/workbench/api/electron-browser/mainThreadConfiguration.ts +/users/foo/src/vs/workbench/api/electron-browser/mainThreadDocumentsAndEditors.ts +/users/foo/src/vs/workbench/api/electron-browser/mainThreadOutputService.ts +/users/foo/src/vs/workbench/api/electron-browser/mainThreadTelemetry.ts +/users/foo/src/vs/workbench/api/electron-browser/mainThreadWindow.ts +/users/foo/src/vs/workbench/api/electron-browser/extensionHost.contribution.ts +/users/foo/src/vs/workbench/api/electron-browser/mainThreadEditors.ts +/users/foo/src/vs/workbench/api/electron-browser/mainThreadDocumentContentProviders.ts +/users/foo/src/vs/workbench/api/electron-browser/mainThreadStatusBar.ts +/users/foo/src/vs/workbench/api/electron-browser/mainThreadFileSystem.ts +/users/foo/src/vs/workbench/api/electron-browser/mainThreadDiagnostics.ts +/users/foo/src/vs/workbench/api/electron-browser/mainThreadWorkspace.ts +/users/foo/src/vs/workbench/api/electron-browser/mainThreadHeapService.ts +/users/foo/src/vs/workbench/api/electron-browser/mainThreadCommands.ts +/users/foo/src/vs/workbench/api/electron-browser/mainThreadWebview.ts +/users/foo/src/vs/workbench/api/electron-browser/mainThreadLanguageFeatures.ts +/users/foo/src/vs/workbench/api/electron-browser/mainThreadDialogs.ts +/users/foo/src/vs/workbench/api/electron-browser/mainThreadDecorations.ts +/users/foo/src/vs/workbench/api/electron-browser/mainThreadTreeViews.ts +/users/foo/src/vs/workbench/api/electron-browser/mainThreadProgress.ts +/users/foo/src/vs/workbench/api/electron-browser/mainThreadLogService.ts +/users/foo/src/vs/workbench/api/electron-browser/mainThreadSearch.ts +/users/foo/src/vs/workbench/api/electron-browser/mainThreadLanguages.ts +/users/foo/src/vs/workbench/api/electron-browser/mainThreadStorage.ts +/users/foo/src/vs/workbench/api/electron-browser/mainThreadUrls.ts +/users/foo/src/vs/workbench/api/electron-browser/mainThreadEditor.ts +/users/foo/src/vs/workbench/api/electron-browser/mainThreadErrors.ts +/users/foo/src/vs/workbench/api/electron-browser/mainThreadFileSystemEventService.ts +/users/foo/src/vs/workbench/api/electron-browser/mainThreadMessageService.ts +/users/foo/src/vs/workbench/api/electron-browser/mainThreadQuickOpen.ts +/users/foo/src/vs/workbench/api/electron-browser/mainThreadTerminalService.ts +/users/foo/src/vs/workbench/api/node +/users/foo/src/vs/workbench/api/node/extHostWorkspace.ts +/users/foo/src/vs/workbench/api/node/apiCommands.ts +/users/foo/src/vs/workbench/api/node/extHostDocumentsAndEditors.ts +/users/foo/src/vs/workbench/api/node/extHostHeapService.ts +/users/foo/src/vs/workbench/api/node/extHostDecorations.ts +/users/foo/src/vs/workbench/api/node/extHostTextEditors.ts +/users/foo/src/vs/workbench/api/node/extHostLanguageFeatures.ts +/users/foo/src/vs/workbench/api/node/extHostLanguages.ts +/users/foo/src/vs/workbench/api/node/extHostLogService.ts +/users/foo/src/vs/workbench/api/node/extHostTreeViews.ts +/users/foo/src/vs/workbench/api/node/extHostExtensionActivator.ts +/users/foo/src/vs/workbench/api/node/extHostWindow.ts +/users/foo/src/vs/workbench/api/node/extHostApiCommands.ts +/users/foo/src/vs/workbench/api/node/extHost.api.impl.ts +/users/foo/src/vs/workbench/api/node/extHostTask.ts +/users/foo/src/vs/workbench/api/node/extHostMessageService.ts +/users/foo/src/vs/workbench/api/node/extHostQuickOpen.ts +/users/foo/src/vs/workbench/api/node/extHostTerminalService.ts +/users/foo/src/vs/workbench/api/node/extHostDebugService.ts +/users/foo/src/vs/workbench/api/node/extHostStorage.ts +/users/foo/src/vs/workbench/api/node/extHostDocumentData.ts +/users/foo/src/vs/workbench/api/node/extHostCommands.ts +/users/foo/src/vs/workbench/api/node/extHostDocumentSaveParticipant.ts +/users/foo/src/vs/workbench/api/node/extHostOutputService.ts +/users/foo/src/vs/workbench/api/node/extHostDocuments.ts +/users/foo/src/vs/workbench/api/node/extHostUrls.ts +/users/foo/src/vs/workbench/api/node/extHostConfiguration.ts +/users/foo/src/vs/workbench/api/node/extHostExtensionService.ts +/users/foo/src/vs/workbench/api/node/extHostSCM.ts +/users/foo/src/vs/workbench/api/node/extHost.protocol.ts +/users/foo/src/vs/workbench/api/node/extHostProgress.ts +/users/foo/src/vs/workbench/api/node/extHostTextEditor.ts +/users/foo/src/vs/workbench/api/node/extHostSearch.ts +/users/foo/src/vs/workbench/api/node/extHostStatusBar.ts +/users/foo/src/vs/workbench/api/node/extHostFileSystemEventService.ts +/users/foo/src/vs/workbench/api/node/extHostDocumentContentProviders.ts +/users/foo/src/vs/workbench/api/node/extHostTypes.ts +/users/foo/src/vs/workbench/api/node/extHostWebview.ts +/users/foo/src/vs/workbench/api/node/extHostDialogs.ts +/users/foo/src/vs/workbench/api/node/extHostFileSystem.ts +/users/foo/src/vs/workbench/api/node/extHostTypeConverters.ts +/users/foo/src/vs/workbench/api/node/extHostDiagnostics.ts +/users/foo/src/vs/workbench/electron-browser +/users/foo/src/vs/workbench/electron-browser/commands.ts +/users/foo/src/vs/workbench/electron-browser/bootstrap +/users/foo/src/vs/workbench/electron-browser/bootstrap/preload.js +/users/foo/src/vs/workbench/electron-browser/bootstrap/index.html +/users/foo/src/vs/workbench/electron-browser/bootstrap/index.js +/users/foo/src/vs/workbench/electron-browser/main.ts +/users/foo/src/vs/workbench/electron-browser/main.contribution.ts +/users/foo/src/vs/workbench/electron-browser/resources.ts +/users/foo/src/vs/workbench/electron-browser/workbench.ts +/users/foo/src/vs/workbench/electron-browser/actions.ts +/users/foo/src/vs/workbench/electron-browser/shell.ts +/users/foo/src/vs/workbench/electron-browser/window.ts +/users/foo/src/vs/workbench/electron-browser/media +/users/foo/src/vs/workbench/electron-browser/media/clear.svg +/users/foo/src/vs/workbench/electron-browser/media/actions.css +/users/foo/src/vs/workbench/electron-browser/media/shell.css +/users/foo/src/vs/workbench/electron-browser/media/remove.svg +/users/foo/src/vs/workbench/electron-browser/media/remove-dark.svg +/users/foo/src/vs/workbench/electron-browser/media/workbench.css +/users/foo/src/vs/workbench/buildfile.js +/users/foo/src/vs/workbench/node +/users/foo/src/vs/workbench/node/extensionHostProcess.ts +/users/foo/src/vs/workbench/node/extensionHostMain.ts +/users/foo/src/vs/workbench/workbench.main.nls.js +/users/foo/src/vs/workbench/services +/users/foo/src/vs/workbench/services/keybinding +/users/foo/src/vs/workbench/services/keybinding/test +/users/foo/src/vs/workbench/services/keybinding/test/linux_en_uk.txt +/users/foo/src/vs/workbench/services/keybinding/test/linux_de_ch.txt +/users/foo/src/vs/workbench/services/keybinding/test/macLinuxKeyboardMapper.test.ts +/users/foo/src/vs/workbench/services/keybinding/test/win_por_ptb.js +/users/foo/src/vs/workbench/services/keybinding/test/linux_en_uk.js +/users/foo/src/vs/workbench/services/keybinding/test/win_ru.js +/users/foo/src/vs/workbench/services/keybinding/test/win_ru.txt +/users/foo/src/vs/workbench/services/keybinding/test/linux_ru.txt +/users/foo/src/vs/workbench/services/keybinding/test/linux_en_us.js +/users/foo/src/vs/workbench/services/keybinding/test/mac_en_us.txt +/users/foo/src/vs/workbench/services/keybinding/test/macLinuxFallbackKeyboardMapper.test.ts +/users/foo/src/vs/workbench/services/keybinding/test/win_en_us.js +/users/foo/src/vs/workbench/services/keybinding/test/win_en_us.txt +/users/foo/src/vs/workbench/services/keybinding/test/mac_en_us.js +/users/foo/src/vs/workbench/services/keybinding/test/mac_de_ch.js +/users/foo/src/vs/workbench/services/keybinding/test/win_de_ch.js +/users/foo/src/vs/workbench/services/keybinding/test/win_de_ch.txt +/users/foo/src/vs/workbench/services/keybinding/test/mac_de_ch.txt +/users/foo/src/vs/workbench/services/keybinding/test/win_por_ptb.txt +/users/foo/src/vs/workbench/services/keybinding/test/linux_de_ch.js +/users/foo/src/vs/workbench/services/keybinding/test/linux_ru.js +/users/foo/src/vs/workbench/services/keybinding/test/keybindingIO.test.ts +/users/foo/src/vs/workbench/services/keybinding/test/mac_zh_hant.js +/users/foo/src/vs/workbench/services/keybinding/test/electron-browser +/users/foo/src/vs/workbench/services/keybinding/test/electron-browser/keybindingEditing.test.ts +/users/foo/src/vs/workbench/services/keybinding/test/windowsKeyboardMapper.test.ts +/users/foo/src/vs/workbench/services/keybinding/test/keyboardMapperTestUtils.ts +/users/foo/src/vs/workbench/services/keybinding/test/linux_en_us.txt +/users/foo/src/vs/workbench/services/keybinding/test/mac_zh_hant.txt +/users/foo/src/vs/workbench/services/keybinding/common +/users/foo/src/vs/workbench/services/keybinding/common/keyboardMapper.ts +/users/foo/src/vs/workbench/services/keybinding/common/windowsKeyboardMapper.ts +/users/foo/src/vs/workbench/services/keybinding/common/keybindingEditing.ts +/users/foo/src/vs/workbench/services/keybinding/common/macLinuxFallbackKeyboardMapper.ts +/users/foo/src/vs/workbench/services/keybinding/common/scanCode.ts +/users/foo/src/vs/workbench/services/keybinding/common/macLinuxKeyboardMapper.ts +/users/foo/src/vs/workbench/services/keybinding/common/keybindingIO.ts +/users/foo/src/vs/workbench/services/keybinding/electron-browser +/users/foo/src/vs/workbench/services/keybinding/electron-browser/keybindingService.ts +/users/foo/src/vs/workbench/services/textmodelResolver +/users/foo/src/vs/workbench/services/textmodelResolver/test +/users/foo/src/vs/workbench/services/textmodelResolver/test/textModelResolverService.test.ts +/users/foo/src/vs/workbench/services/textmodelResolver/common +/users/foo/src/vs/workbench/services/textmodelResolver/common/textModelResolverService.ts +/users/foo/src/vs/workbench/services/configuration +/users/foo/src/vs/workbench/services/configuration/test +/users/foo/src/vs/workbench/services/configuration/test/common +/users/foo/src/vs/workbench/services/configuration/test/common/configurationModels.test.ts +/users/foo/src/vs/workbench/services/configuration/test/electron-browser +/users/foo/src/vs/workbench/services/configuration/test/electron-browser/configurationEditingService.test.ts +/users/foo/src/vs/workbench/services/configuration/test/electron-browser/configurationService.test.ts +/users/foo/src/vs/workbench/services/configuration/common +/users/foo/src/vs/workbench/services/configuration/common/configurationModels.ts +/users/foo/src/vs/workbench/services/configuration/common/jsonEditing.ts +/users/foo/src/vs/workbench/services/configuration/common/configurationExtensionPoint.ts +/users/foo/src/vs/workbench/services/configuration/common/configuration.ts +/users/foo/src/vs/workbench/services/configuration/node +/users/foo/src/vs/workbench/services/configuration/node/configurationService.ts +/users/foo/src/vs/workbench/services/configuration/node/jsonEditingService.ts +/users/foo/src/vs/workbench/services/configuration/node/configurationEditingService.ts +/users/foo/src/vs/workbench/services/configuration/node/configuration.ts +/users/foo/src/vs/workbench/services/preferences +/users/foo/src/vs/workbench/services/preferences/test +/users/foo/src/vs/workbench/services/preferences/test/common +/users/foo/src/vs/workbench/services/preferences/test/common/keybindingsEditorModel.test.ts +/users/foo/src/vs/workbench/services/preferences/browser +/users/foo/src/vs/workbench/services/preferences/browser/preferencesService.ts +/users/foo/src/vs/workbench/services/preferences/common +/users/foo/src/vs/workbench/services/preferences/common/preferencesModels.ts +/users/foo/src/vs/workbench/services/preferences/common/preferencesEditorInput.ts +/users/foo/src/vs/workbench/services/preferences/common/preferences.ts +/users/foo/src/vs/workbench/services/preferences/common/keybindingsEditorModel.ts +/users/foo/src/vs/workbench/services/panel +/users/foo/src/vs/workbench/services/panel/common +/users/foo/src/vs/workbench/services/panel/common/panelService.ts +/users/foo/src/vs/workbench/services/progress +/users/foo/src/vs/workbench/services/progress/test +/users/foo/src/vs/workbench/services/progress/test/progressService.test.ts +/users/foo/src/vs/workbench/services/progress/browser +/users/foo/src/vs/workbench/services/progress/browser/progressService2.ts +/users/foo/src/vs/workbench/services/progress/browser/progressService.ts +/users/foo/src/vs/workbench/services/progress/browser/media +/users/foo/src/vs/workbench/services/progress/browser/media/progressService2.css +/users/foo/src/vs/workbench/services/mode +/users/foo/src/vs/workbench/services/mode/common +/users/foo/src/vs/workbench/services/mode/common/workbenchModeService.ts +/users/foo/src/vs/workbench/services/hash +/users/foo/src/vs/workbench/services/hash/common +/users/foo/src/vs/workbench/services/hash/common/hashService.ts +/users/foo/src/vs/workbench/services/hash/node +/users/foo/src/vs/workbench/services/hash/node/hashService.ts +/users/foo/src/vs/workbench/services/title +/users/foo/src/vs/workbench/services/title/common +/users/foo/src/vs/workbench/services/title/common/titleService.ts +/users/foo/src/vs/workbench/services/group +/users/foo/src/vs/workbench/services/group/common +/users/foo/src/vs/workbench/services/group/common/groupService.ts +/users/foo/src/vs/workbench/services/notification +/users/foo/src/vs/workbench/services/notification/common +/users/foo/src/vs/workbench/services/notification/common/notificationService.ts +/users/foo/src/vs/workbench/services/activity +/users/foo/src/vs/workbench/services/activity/browser +/users/foo/src/vs/workbench/services/activity/browser/activityService.ts +/users/foo/src/vs/workbench/services/activity/common +/users/foo/src/vs/workbench/services/activity/common/activity.ts +/users/foo/src/vs/workbench/services/viewlet +/users/foo/src/vs/workbench/services/viewlet/browser +/users/foo/src/vs/workbench/services/viewlet/browser/viewlet.ts +/users/foo/src/vs/workbench/services/viewlet/browser/viewletService.ts +/users/foo/src/vs/workbench/services/workspace +/users/foo/src/vs/workbench/services/workspace/common +/users/foo/src/vs/workbench/services/workspace/common/workspaceEditing.ts +/users/foo/src/vs/workbench/services/workspace/node +/users/foo/src/vs/workbench/services/workspace/node/workspaceEditingService.ts +/users/foo/src/vs/workbench/services/timer +/users/foo/src/vs/workbench/services/timer/common +/users/foo/src/vs/workbench/services/timer/common/timerService.ts +/users/foo/src/vs/workbench/services/timer/node +/users/foo/src/vs/workbench/services/timer/node/timerService.ts +/users/foo/src/vs/workbench/services/textMate +/users/foo/src/vs/workbench/services/textMate/electron-browser +/users/foo/src/vs/workbench/services/textMate/electron-browser/textMateService.ts +/users/foo/src/vs/workbench/services/textMate/electron-browser/TMGrammars.ts +/users/foo/src/vs/workbench/services/textMate/electron-browser/TMSyntax.ts +/users/foo/src/vs/workbench/services/textMate/electron-browser/TMHelper.ts +/users/foo/src/vs/workbench/services/textMate/electron-browser/OSSREADME.json +/users/foo/src/vs/workbench/services/bulkEdit +/users/foo/src/vs/workbench/services/bulkEdit/electron-browser +/users/foo/src/vs/workbench/services/bulkEdit/electron-browser/bulkEditService.ts +/users/foo/src/vs/workbench/services/jsonschemas +/users/foo/src/vs/workbench/services/jsonschemas/common +/users/foo/src/vs/workbench/services/jsonschemas/common/jsonValidationExtensionPoint.ts +/users/foo/src/vs/workbench/services/contextview +/users/foo/src/vs/workbench/services/contextview/electron-browser +/users/foo/src/vs/workbench/services/contextview/electron-browser/contextmenuService.ts +/users/foo/src/vs/workbench/services/crashReporter +/users/foo/src/vs/workbench/services/crashReporter/electron-browser +/users/foo/src/vs/workbench/services/crashReporter/electron-browser/crashReporterService.ts +/users/foo/src/vs/workbench/services/decorations +/users/foo/src/vs/workbench/services/decorations/test +/users/foo/src/vs/workbench/services/decorations/test/browser +/users/foo/src/vs/workbench/services/decorations/test/browser/decorationsService.test.ts +/users/foo/src/vs/workbench/services/decorations/browser +/users/foo/src/vs/workbench/services/decorations/browser/decorations.ts +/users/foo/src/vs/workbench/services/decorations/browser/decorationsService.ts +/users/foo/src/vs/workbench/services/extensions +/users/foo/src/vs/workbench/services/extensions/common +/users/foo/src/vs/workbench/services/extensions/common/extensionsRegistry.ts +/users/foo/src/vs/workbench/services/extensions/common/extensions.ts +/users/foo/src/vs/workbench/services/extensions/electron-browser +/users/foo/src/vs/workbench/services/extensions/electron-browser/extensionHostProfiler.ts +/users/foo/src/vs/workbench/services/extensions/electron-browser/extensionService.ts +/users/foo/src/vs/workbench/services/extensions/electron-browser/extensionHost.ts +/users/foo/src/vs/workbench/services/extensions/node +/users/foo/src/vs/workbench/services/extensions/node/extensionDescriptionRegistry.ts +/users/foo/src/vs/workbench/services/extensions/node/rpcProtocol.ts +/users/foo/src/vs/workbench/services/extensions/node/lazyPromise.ts +/users/foo/src/vs/workbench/services/extensions/node/extensionPoints.ts +/users/foo/src/vs/workbench/services/extensions/node/proxyIdentifier.ts +/users/foo/src/vs/workbench/services/search +/users/foo/src/vs/workbench/services/search/test +/users/foo/src/vs/workbench/services/search/test/node +/users/foo/src/vs/workbench/services/search/test/node/ripgrepTextSearch.test.ts +/users/foo/src/vs/workbench/services/search/test/node/textSearch.integrationTest.ts +/users/foo/src/vs/workbench/services/search/test/node/searchService.test.ts +/users/foo/src/vs/workbench/services/search/test/node/fixtures2 +/users/foo/src/vs/workbench/services/search/test/node/fixtures2/36438 +/users/foo/src/vs/workbench/services/search/test/node/fixtures2/36438/more +/users/foo/src/vs/workbench/services/search/test/node/fixtures2/36438/more/modules +/users/foo/src/vs/workbench/services/search/test/node/fixtures2/36438/more/modules/find.txt +/users/foo/src/vs/workbench/services/search/test/node/fixtures2/36438/modules +/users/foo/src/vs/workbench/services/search/test/node/fixtures2/36438/modules/do-not-find.txt +/users/foo/src/vs/workbench/services/search/test/node/search.test.ts +/users/foo/src/vs/workbench/services/search/test/node/fixtures +/users/foo/src/vs/workbench/services/search/test/node/fixtures/index.html +/users/foo/src/vs/workbench/services/search/test/node/fixtures/binary.wuff +/users/foo/src/vs/workbench/services/search/test/node/fixtures/üm laut汉语 +/users/foo/src/vs/workbench/services/search/test/node/fixtures/üm laut汉语/汉语.txt +/users/foo/src/vs/workbench/services/search/test/node/fixtures/some_utf16le.css +/users/foo/src/vs/workbench/services/search/test/node/fixtures/more +/users/foo/src/vs/workbench/services/search/test/node/fixtures/more/file.txt +/users/foo/src/vs/workbench/services/search/test/node/fixtures/some_utf16be.css +/users/foo/src/vs/workbench/services/search/test/node/fixtures/examples +/users/foo/src/vs/workbench/services/search/test/node/fixtures/examples/subfolder +/users/foo/src/vs/workbench/services/search/test/node/fixtures/examples/subfolder/subfile.txt +/users/foo/src/vs/workbench/services/search/test/node/fixtures/examples/subfolder/anotherfolder +/users/foo/src/vs/workbench/services/search/test/node/fixtures/examples/subfolder/anotherfolder/anotherfile.txt +/users/foo/src/vs/workbench/services/search/test/node/fixtures/examples/company.js +/users/foo/src/vs/workbench/services/search/test/node/fixtures/examples/NullPoinderException.js +/users/foo/src/vs/workbench/services/search/test/node/fixtures/examples/employee.js +/users/foo/src/vs/workbench/services/search/test/node/fixtures/examples/small.js +/users/foo/src/vs/workbench/services/search/test/node/fixtures/site.css +/users/foo/src/vs/workbench/services/search/test/node/fixtures/site.less +/users/foo/src/vs/workbench/services/search/node +/users/foo/src/vs/workbench/services/search/node/fileSearch.ts +/users/foo/src/vs/workbench/services/search/node/searchIpc.ts +/users/foo/src/vs/workbench/services/search/node/search.ts +/users/foo/src/vs/workbench/services/search/node/ripgrepTextSearch.ts +/users/foo/src/vs/workbench/services/search/node/textSearchWorkerProvider.ts +/users/foo/src/vs/workbench/services/search/node/textSearch.ts +/users/foo/src/vs/workbench/services/search/node/searchService.ts +/users/foo/src/vs/workbench/services/search/node/ripgrepFileSearch.ts +/users/foo/src/vs/workbench/services/search/node/worker +/users/foo/src/vs/workbench/services/search/node/worker/searchWorkerIpc.ts +/users/foo/src/vs/workbench/services/search/node/worker/searchWorkerApp.ts +/users/foo/src/vs/workbench/services/search/node/worker/searchWorker.ts +/users/foo/src/vs/workbench/services/search/node/searchApp.ts +/users/foo/src/vs/workbench/services/search/node/rawSearchService.ts +/users/foo/src/vs/workbench/services/textfile +/users/foo/src/vs/workbench/services/textfile/test +/users/foo/src/vs/workbench/services/textfile/test/textFileService.test.ts +/users/foo/src/vs/workbench/services/textfile/test/textFileEditorModel.test.ts +/users/foo/src/vs/workbench/services/textfile/test/textFileEditorModelManager.test.ts +/users/foo/src/vs/workbench/services/textfile/common +/users/foo/src/vs/workbench/services/textfile/common/textFileEditorModel.ts +/users/foo/src/vs/workbench/services/textfile/common/textFileService.ts +/users/foo/src/vs/workbench/services/textfile/common/textfiles.ts +/users/foo/src/vs/workbench/services/textfile/common/textFileEditorModelManager.ts +/users/foo/src/vs/workbench/services/textfile/electron-browser +/users/foo/src/vs/workbench/services/textfile/electron-browser/textFileService.ts +/users/foo/src/vs/workbench/services/issue +/users/foo/src/vs/workbench/services/issue/common +/users/foo/src/vs/workbench/services/issue/common/issue.ts +/users/foo/src/vs/workbench/services/issue/electron-browser +/users/foo/src/vs/workbench/services/issue/electron-browser/workbenchIssueService.ts +/users/foo/src/vs/workbench/services/history +/users/foo/src/vs/workbench/services/history/common +/users/foo/src/vs/workbench/services/history/common/history.ts +/users/foo/src/vs/workbench/services/history/electron-browser +/users/foo/src/vs/workbench/services/history/electron-browser/history.ts +/users/foo/src/vs/workbench/services/actions +/users/foo/src/vs/workbench/services/actions/test +/users/foo/src/vs/workbench/services/actions/test/common +/users/foo/src/vs/workbench/services/actions/test/common/menuService.test.ts +/users/foo/src/vs/workbench/services/actions/common +/users/foo/src/vs/workbench/services/actions/common/menuService.ts +/users/foo/src/vs/workbench/services/actions/electron-browser +/users/foo/src/vs/workbench/services/actions/electron-browser/menusExtensionPoint.ts +/users/foo/src/vs/workbench/services/files +/users/foo/src/vs/workbench/services/files/test +/users/foo/src/vs/workbench/services/files/test/electron-browser +/users/foo/src/vs/workbench/services/files/test/electron-browser/watcher.test.ts +/users/foo/src/vs/workbench/services/files/test/electron-browser/utils.ts +/users/foo/src/vs/workbench/services/files/test/electron-browser/resolver.test.ts +/users/foo/src/vs/workbench/services/files/test/electron-browser/fileService.test.ts +/users/foo/src/vs/workbench/services/files/test/electron-browser/fixtures +/users/foo/src/vs/workbench/services/files/test/electron-browser/fixtures/service +/users/foo/src/vs/workbench/services/files/test/electron-browser/fixtures/service/index.html +/users/foo/src/vs/workbench/services/files/test/electron-browser/fixtures/service/small_umlaut.txt +/users/foo/src/vs/workbench/services/files/test/electron-browser/fixtures/service/some_utf8_bom.txt +/users/foo/src/vs/workbench/services/files/test/electron-browser/fixtures/service/deep +/users/foo/src/vs/workbench/services/files/test/electron-browser/fixtures/service/deep/company.js +/users/foo/src/vs/workbench/services/files/test/electron-browser/fixtures/service/deep/conway.js +/users/foo/src/vs/workbench/services/files/test/electron-browser/fixtures/service/deep/employee.js +/users/foo/src/vs/workbench/services/files/test/electron-browser/fixtures/service/deep/small.js +/users/foo/src/vs/workbench/services/files/test/electron-browser/fixtures/service/some_utf16le.css +/users/foo/src/vs/workbench/services/files/test/electron-browser/fixtures/service/lorem.txt +/users/foo/src/vs/workbench/services/files/test/electron-browser/fixtures/service/small.txt +/users/foo/src/vs/workbench/services/files/test/electron-browser/fixtures/service/binary.txt +/users/foo/src/vs/workbench/services/files/test/electron-browser/fixtures/resolver +/users/foo/src/vs/workbench/services/files/test/electron-browser/fixtures/resolver/index.html +/users/foo/src/vs/workbench/services/files/test/electron-browser/fixtures/resolver/other +/users/foo/src/vs/workbench/services/files/test/electron-browser/fixtures/resolver/other/deep +/users/foo/src/vs/workbench/services/files/test/electron-browser/fixtures/resolver/other/deep/company.js +/users/foo/src/vs/workbench/services/files/test/electron-browser/fixtures/resolver/other/deep/conway.js +/users/foo/src/vs/workbench/services/files/test/electron-browser/fixtures/resolver/other/deep/employee.js +/users/foo/src/vs/workbench/services/files/test/electron-browser/fixtures/resolver/other/deep/small.js +/users/foo/src/vs/workbench/services/files/test/electron-browser/fixtures/resolver/examples +/users/foo/src/vs/workbench/services/files/test/electron-browser/fixtures/resolver/examples/company.js +/users/foo/src/vs/workbench/services/files/test/electron-browser/fixtures/resolver/examples/conway.js +/users/foo/src/vs/workbench/services/files/test/electron-browser/fixtures/resolver/examples/employee.js +/users/foo/src/vs/workbench/services/files/test/electron-browser/fixtures/resolver/examples/small.js +/users/foo/src/vs/workbench/services/files/test/electron-browser/fixtures/resolver/site.css +/users/foo/src/vs/workbench/services/files/electron-browser +/users/foo/src/vs/workbench/services/files/electron-browser/remoteFileService.ts +/users/foo/src/vs/workbench/services/files/electron-browser/encoding.ts +/users/foo/src/vs/workbench/services/files/electron-browser/streams.ts +/users/foo/src/vs/workbench/services/files/electron-browser/fileService.ts +/users/foo/src/vs/workbench/services/files/node +/users/foo/src/vs/workbench/services/files/node/watcher +/users/foo/src/vs/workbench/services/files/node/watcher/nsfw +/users/foo/src/vs/workbench/services/files/node/watcher/nsfw/nsfwWatcherService.ts +/users/foo/src/vs/workbench/services/files/node/watcher/nsfw/test +/users/foo/src/vs/workbench/services/files/node/watcher/nsfw/test/nsfwWatcherService.test.ts +/users/foo/src/vs/workbench/services/files/node/watcher/nsfw/watcherService.ts +/users/foo/src/vs/workbench/services/files/node/watcher/nsfw/watcher.ts +/users/foo/src/vs/workbench/services/files/node/watcher/nsfw/watcherIpc.ts +/users/foo/src/vs/workbench/services/files/node/watcher/nsfw/watcherApp.ts +/users/foo/src/vs/workbench/services/files/node/watcher/common.ts +/users/foo/src/vs/workbench/services/files/node/watcher/unix +/users/foo/src/vs/workbench/services/files/node/watcher/unix/test +/users/foo/src/vs/workbench/services/files/node/watcher/unix/test/chockidarWatcherService.test.ts +/users/foo/src/vs/workbench/services/files/node/watcher/unix/watcherService.ts +/users/foo/src/vs/workbench/services/files/node/watcher/unix/watcher.ts +/users/foo/src/vs/workbench/services/files/node/watcher/unix/watcherIpc.ts +/users/foo/src/vs/workbench/services/files/node/watcher/unix/watcherApp.ts +/users/foo/src/vs/workbench/services/files/node/watcher/unix/chokidarWatcherService.ts +/users/foo/src/vs/workbench/services/files/node/watcher/win32 +/users/foo/src/vs/workbench/services/files/node/watcher/win32/csharpWatcherService.ts +/users/foo/src/vs/workbench/services/files/node/watcher/win32/watcherService.ts +/users/foo/src/vs/workbench/services/files/node/watcher/win32/CodeHelper.md +/users/foo/src/vs/workbench/services/files/node/watcher/win32/CodeHelper.exe +/users/foo/src/vs/workbench/services/dialogs +/users/foo/src/vs/workbench/services/dialogs/electron-browser +/users/foo/src/vs/workbench/services/dialogs/electron-browser/dialogService.ts +/users/foo/src/vs/workbench/services/commands +/users/foo/src/vs/workbench/services/commands/test +/users/foo/src/vs/workbench/services/commands/test/common +/users/foo/src/vs/workbench/services/commands/test/common/commandService.test.ts +/users/foo/src/vs/workbench/services/commands/common +/users/foo/src/vs/workbench/services/commands/common/commandService.ts +/users/foo/src/vs/workbench/services/part +/users/foo/src/vs/workbench/services/part/common +/users/foo/src/vs/workbench/services/part/common/partService.ts +/users/foo/src/vs/workbench/services/scm +/users/foo/src/vs/workbench/services/scm/common +/users/foo/src/vs/workbench/services/scm/common/scm.ts +/users/foo/src/vs/workbench/services/scm/common/scmService.ts +/users/foo/src/vs/workbench/services/configurationResolver +/users/foo/src/vs/workbench/services/configurationResolver/test +/users/foo/src/vs/workbench/services/configurationResolver/test/electron-browser +/users/foo/src/vs/workbench/services/configurationResolver/test/electron-browser/configurationResolverService.test.ts +/users/foo/src/vs/workbench/services/configurationResolver/common +/users/foo/src/vs/workbench/services/configurationResolver/common/configurationResolver.ts +/users/foo/src/vs/workbench/services/configurationResolver/electron-browser +/users/foo/src/vs/workbench/services/configurationResolver/electron-browser/configurationResolverService.ts +/users/foo/src/vs/workbench/services/configurationResolver/node +/users/foo/src/vs/workbench/services/configurationResolver/node/variableResolver.ts +/users/foo/src/vs/workbench/services/untitled +/users/foo/src/vs/workbench/services/untitled/common +/users/foo/src/vs/workbench/services/untitled/common/untitledEditorService.ts +/users/foo/src/vs/workbench/services/backup +/users/foo/src/vs/workbench/services/backup/test +/users/foo/src/vs/workbench/services/backup/test/electron-browser +/users/foo/src/vs/workbench/services/backup/test/electron-browser/backupFileService.test.ts +/users/foo/src/vs/workbench/services/backup/common +/users/foo/src/vs/workbench/services/backup/common/backup.ts +/users/foo/src/vs/workbench/services/backup/node +/users/foo/src/vs/workbench/services/backup/node/backupFileService.ts +/users/foo/src/vs/workbench/services/themes +/users/foo/src/vs/workbench/services/themes/common +/users/foo/src/vs/workbench/services/themes/common/fileIconThemeSchema.ts +/users/foo/src/vs/workbench/services/themes/common/colorThemeSchema.ts +/users/foo/src/vs/workbench/services/themes/common/workbenchThemeService.ts +/users/foo/src/vs/workbench/services/themes/common/colorExtensionPoint.ts +/users/foo/src/vs/workbench/services/themes/electron-browser +/users/foo/src/vs/workbench/services/themes/electron-browser/colorThemeStore.ts +/users/foo/src/vs/workbench/services/themes/electron-browser/colorThemeData.ts +/users/foo/src/vs/workbench/services/themes/electron-browser/fileIconThemeStore.ts +/users/foo/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.ts +/users/foo/src/vs/workbench/services/themes/electron-browser/fileIconThemeData.ts +/users/foo/src/vs/workbench/services/themes/electron-browser/themeCompatibility.ts +/users/foo/src/vs/workbench/services/editor +/users/foo/src/vs/workbench/services/editor/test +/users/foo/src/vs/workbench/services/editor/test/browser +/users/foo/src/vs/workbench/services/editor/test/browser/editorService.test.ts +/users/foo/src/vs/workbench/services/editor/common +/users/foo/src/vs/workbench/services/editor/common/editorService.ts +/users/foo/src/vs/css.d.ts +/users/foo/src/vs/nls.mock.ts +/users/foo/src/vs/css.js +/users/foo/src/vs/nls.build.js +/users/foo/src/vs/base +/users/foo/src/vs/base/test +/users/foo/src/vs/base/test/browser +/users/foo/src/vs/base/test/browser/ui +/users/foo/src/vs/base/test/browser/ui/splitview +/users/foo/src/vs/base/test/browser/ui/splitview/splitview.test.ts +/users/foo/src/vs/base/test/browser/ui/list +/users/foo/src/vs/base/test/browser/ui/list/rangeMap.test.ts +/users/foo/src/vs/base/test/browser/ui/scrollbar +/users/foo/src/vs/base/test/browser/ui/scrollbar/scrollableElement.test.ts +/users/foo/src/vs/base/test/browser/ui/scrollbar/scrollbarState.test.ts +/users/foo/src/vs/base/test/browser/browser.test.ts +/users/foo/src/vs/base/test/browser/htmlContent.test.ts +/users/foo/src/vs/base/test/browser/comparers.test.ts +/users/foo/src/vs/base/test/browser/progressBar.test.ts +/users/foo/src/vs/base/test/browser/builder.test.ts +/users/foo/src/vs/base/test/browser/highlightedLabel.test.ts +/users/foo/src/vs/base/test/browser/dom.test.ts +/users/foo/src/vs/base/test/common +/users/foo/src/vs/base/test/common/paging.test.ts +/users/foo/src/vs/base/test/common/filters.test.ts +/users/foo/src/vs/base/test/common/uri.test.ts +/users/foo/src/vs/base/test/common/arrays.test.ts +/users/foo/src/vs/base/test/common/keyCodes.test.ts +/users/foo/src/vs/base/test/common/errors.test.ts +/users/foo/src/vs/base/test/common/collections.test.ts +/users/foo/src/vs/base/test/common/async.test.ts +/users/foo/src/vs/base/test/common/assert.test.ts +/users/foo/src/vs/base/test/common/decorators.test.ts +/users/foo/src/vs/base/test/common/scrollable.test.ts +/users/foo/src/vs/base/test/common/uuid.test.ts +/users/foo/src/vs/base/test/common/cache.test.ts +/users/foo/src/vs/base/test/common/labels.test.ts +/users/foo/src/vs/base/test/common/filters.perf.test.ts +/users/foo/src/vs/base/test/common/objects.test.ts +/users/foo/src/vs/base/test/common/types.test.ts +/users/foo/src/vs/base/test/common/history.test.ts +/users/foo/src/vs/base/test/common/network.test.ts +/users/foo/src/vs/base/test/common/filters.perf.data.d.ts +/users/foo/src/vs/base/test/common/color.test.ts +/users/foo/src/vs/base/test/common/filters.perf.data.js +/users/foo/src/vs/base/test/common/utils.ts +/users/foo/src/vs/base/test/common/diff +/users/foo/src/vs/base/test/common/diff/diff.test.ts +/users/foo/src/vs/base/test/common/resources.test.ts +/users/foo/src/vs/base/test/common/charCode.test.ts +/users/foo/src/vs/base/test/common/event.test.ts +/users/foo/src/vs/base/test/common/jsonFormatter.test.ts +/users/foo/src/vs/base/test/common/hash.test.ts +/users/foo/src/vs/base/test/common/winjs.polyfill.promise.test.ts +/users/foo/src/vs/base/test/common/json.test.ts +/users/foo/src/vs/base/test/common/marshalling.test.ts +/users/foo/src/vs/base/test/common/strings.test.ts +/users/foo/src/vs/base/test/common/graph.test.ts +/users/foo/src/vs/base/test/common/mime.test.ts +/users/foo/src/vs/base/test/common/octicon.test.ts +/users/foo/src/vs/base/test/common/map.test.ts +/users/foo/src/vs/base/test/common/jsonEdit.test.ts +/users/foo/src/vs/base/test/common/paths.test.ts +/users/foo/src/vs/base/test/common/cancellation.test.ts +/users/foo/src/vs/base/test/common/linkedList.test.ts +/users/foo/src/vs/base/test/common/lifecycle.test.ts +/users/foo/src/vs/base/test/node +/users/foo/src/vs/base/test/node/glob.test.ts +/users/foo/src/vs/base/test/node/decoder.test.ts +/users/foo/src/vs/base/test/node/extfs +/users/foo/src/vs/base/test/node/extfs/extfs.test.ts +/users/foo/src/vs/base/test/node/extfs/fixtures +/users/foo/src/vs/base/test/node/extfs/fixtures/index.html +/users/foo/src/vs/base/test/node/extfs/fixtures/examples +/users/foo/src/vs/base/test/node/extfs/fixtures/examples/small.jxs +/users/foo/src/vs/base/test/node/extfs/fixtures/examples/conway.jxs +/users/foo/src/vs/base/test/node/extfs/fixtures/examples/company.jxs +/users/foo/src/vs/base/test/node/extfs/fixtures/examples/employee.jxs +/users/foo/src/vs/base/test/node/extfs/fixtures/site.css +/users/foo/src/vs/base/test/node/processes +/users/foo/src/vs/base/test/node/processes/processes.test.ts +/users/foo/src/vs/base/test/node/processes/fixtures +/users/foo/src/vs/base/test/node/processes/fixtures/fork_large.ts +/users/foo/src/vs/base/test/node/processes/fixtures/fork.ts +/users/foo/src/vs/base/test/node/stream +/users/foo/src/vs/base/test/node/stream/stream.test.ts +/users/foo/src/vs/base/test/node/stream/fixtures +/users/foo/src/vs/base/test/node/stream/fixtures/empty.txt +/users/foo/src/vs/base/test/node/stream/fixtures/file.css +/users/foo/src/vs/base/test/node/utils.ts +/users/foo/src/vs/base/test/node/pfs.test.ts +/users/foo/src/vs/base/test/node/encoding +/users/foo/src/vs/base/test/node/encoding/encoding.test.ts +/users/foo/src/vs/base/test/node/encoding/fixtures +/users/foo/src/vs/base/test/node/encoding/fixtures/some.css.qwoff +/users/foo/src/vs/base/test/node/encoding/fixtures/empty.txt +/users/foo/src/vs/base/test/node/encoding/fixtures/utf16_le_nobom.txt +/users/foo/src/vs/base/test/node/encoding/fixtures/some.shiftjis.txt +/users/foo/src/vs/base/test/node/encoding/fixtures/some.json.png +/users/foo/src/vs/base/test/node/encoding/fixtures/some.cp1252.txt +/users/foo/src/vs/base/test/node/encoding/fixtures/some.qwoff.txt +/users/foo/src/vs/base/test/node/encoding/fixtures/some.xml.png +/users/foo/src/vs/base/test/node/encoding/fixtures/some_utf16le.css +/users/foo/src/vs/base/test/node/encoding/fixtures/some_utf16be.css +/users/foo/src/vs/base/test/node/encoding/fixtures/some_utf8.css +/users/foo/src/vs/base/test/node/encoding/fixtures/some.png.txt +/users/foo/src/vs/base/test/node/encoding/fixtures/some.pdf +/users/foo/src/vs/base/test/node/encoding/fixtures/some_ansi.css +/users/foo/src/vs/base/test/node/encoding/fixtures/utf16_be_nobom.txt +/users/foo/src/vs/base/test/node/console.test.ts +/users/foo/src/vs/base/test/node/zip +/users/foo/src/vs/base/test/node/zip/zip.test.ts +/users/foo/src/vs/base/test/node/zip/fixtures +/users/foo/src/vs/base/test/node/zip/fixtures/extract.zip +/users/foo/src/vs/base/test/node/id.test.ts +/users/foo/src/vs/base/test/node/port.test.ts +/users/foo/src/vs/base/test/node/flow.test.ts +/users/foo/src/vs/base/test/node/config.test.ts +/users/foo/src/vs/base/browser +/users/foo/src/vs/base/browser/contextmenu.ts +/users/foo/src/vs/base/browser/ui +/users/foo/src/vs/base/browser/ui/dropdown +/users/foo/src/vs/base/browser/ui/dropdown/dropdown.ts +/users/foo/src/vs/base/browser/ui/dropdown/dropdown.css +/users/foo/src/vs/base/browser/ui/splitview +/users/foo/src/vs/base/browser/ui/splitview/arrow-collapse-dark.svg +/users/foo/src/vs/base/browser/ui/splitview/splitview.css +/users/foo/src/vs/base/browser/ui/splitview/panelview.css +/users/foo/src/vs/base/browser/ui/splitview/splitview.ts +/users/foo/src/vs/base/browser/ui/splitview/panelview.ts +/users/foo/src/vs/base/browser/ui/splitview/arrow-expand-dark.svg +/users/foo/src/vs/base/browser/ui/splitview/arrow-collapse.svg +/users/foo/src/vs/base/browser/ui/splitview/arrow-expand.svg +/users/foo/src/vs/base/browser/ui/iconLabel +/users/foo/src/vs/base/browser/ui/iconLabel/iconLabel.ts +/users/foo/src/vs/base/browser/ui/iconLabel/iconlabel.css +/users/foo/src/vs/base/browser/ui/keybindingLabel +/users/foo/src/vs/base/browser/ui/keybindingLabel/keybindingLabel.css +/users/foo/src/vs/base/browser/ui/keybindingLabel/keybindingLabel.ts +/users/foo/src/vs/base/browser/ui/octiconLabel +/users/foo/src/vs/base/browser/ui/octiconLabel/octicons +/users/foo/src/vs/base/browser/ui/octiconLabel/octicons/octicons.ttf +/users/foo/src/vs/base/browser/ui/octiconLabel/octicons/sprockets-octicons.scss +/users/foo/src/vs/base/browser/ui/octiconLabel/octicons/octicons.eot +/users/foo/src/vs/base/browser/ui/octiconLabel/octicons/octicons.woff +/users/foo/src/vs/base/browser/ui/octiconLabel/octicons/README.md +/users/foo/src/vs/base/browser/ui/octiconLabel/octicons/octicons.scss +/users/foo/src/vs/base/browser/ui/octiconLabel/octicons/octicons.css +/users/foo/src/vs/base/browser/ui/octiconLabel/octicons/octicons-animations.css +/users/foo/src/vs/base/browser/ui/octiconLabel/octicons/octicons.svg +/users/foo/src/vs/base/browser/ui/octiconLabel/octicons/OSSREADME.json +/users/foo/src/vs/base/browser/ui/octiconLabel/octicons/octicons-local.ttf +/users/foo/src/vs/base/browser/ui/octiconLabel/octicons/octicons.less +/users/foo/src/vs/base/browser/ui/octiconLabel/octiconLabel.ts +/users/foo/src/vs/base/browser/ui/octiconLabel/octiconLabel.mock.ts +/users/foo/src/vs/base/browser/ui/toolbar +/users/foo/src/vs/base/browser/ui/toolbar/ellipsis-inverse.svg +/users/foo/src/vs/base/browser/ui/toolbar/toolbar.css +/users/foo/src/vs/base/browser/ui/toolbar/toolbar.ts +/users/foo/src/vs/base/browser/ui/toolbar/ellipsis.svg +/users/foo/src/vs/base/browser/ui/checkbox +/users/foo/src/vs/base/browser/ui/checkbox/checkbox.ts +/users/foo/src/vs/base/browser/ui/checkbox/checkbox.css +/users/foo/src/vs/base/browser/ui/progressbar +/users/foo/src/vs/base/browser/ui/progressbar/progressbar.css +/users/foo/src/vs/base/browser/ui/progressbar/progressbar.ts +/users/foo/src/vs/base/browser/ui/contextview +/users/foo/src/vs/base/browser/ui/contextview/contextview.ts +/users/foo/src/vs/base/browser/ui/contextview/contextview.css +/users/foo/src/vs/base/browser/ui/selectBox +/users/foo/src/vs/base/browser/ui/selectBox/selectBox.ts +/users/foo/src/vs/base/browser/ui/selectBox/selectBoxNative.ts +/users/foo/src/vs/base/browser/ui/selectBox/selectBoxCustom.css +/users/foo/src/vs/base/browser/ui/selectBox/selectBoxCustom.ts +/users/foo/src/vs/base/browser/ui/selectBox/selectBox.css +/users/foo/src/vs/base/browser/ui/countBadge +/users/foo/src/vs/base/browser/ui/countBadge/countBadge.ts +/users/foo/src/vs/base/browser/ui/countBadge/countBadge.css +/users/foo/src/vs/base/browser/ui/button +/users/foo/src/vs/base/browser/ui/button/button.ts +/users/foo/src/vs/base/browser/ui/button/button.css +/users/foo/src/vs/base/browser/ui/highlightedlabel +/users/foo/src/vs/base/browser/ui/highlightedlabel/highlightedLabel.ts +/users/foo/src/vs/base/browser/ui/aria +/users/foo/src/vs/base/browser/ui/aria/aria.css +/users/foo/src/vs/base/browser/ui/aria/aria.ts +/users/foo/src/vs/base/browser/ui/list +/users/foo/src/vs/base/browser/ui/list/list.css +/users/foo/src/vs/base/browser/ui/list/rangeMap.ts +/users/foo/src/vs/base/browser/ui/list/listWidget.ts +/users/foo/src/vs/base/browser/ui/list/listView.ts +/users/foo/src/vs/base/browser/ui/list/listPaging.ts +/users/foo/src/vs/base/browser/ui/list/rowCache.ts +/users/foo/src/vs/base/browser/ui/list/list.ts +/users/foo/src/vs/base/browser/ui/menu +/users/foo/src/vs/base/browser/ui/menu/menu.ts +/users/foo/src/vs/base/browser/ui/menu/menu.css +/users/foo/src/vs/base/browser/ui/actionbar +/users/foo/src/vs/base/browser/ui/actionbar/actionbar.css +/users/foo/src/vs/base/browser/ui/actionbar/actionbar.ts +/users/foo/src/vs/base/browser/ui/findinput +/users/foo/src/vs/base/browser/ui/findinput/findInput.ts +/users/foo/src/vs/base/browser/ui/findinput/whole-word.svg +/users/foo/src/vs/base/browser/ui/findinput/findInput.css +/users/foo/src/vs/base/browser/ui/findinput/regex.svg +/users/foo/src/vs/base/browser/ui/findinput/case-sensitive.svg +/users/foo/src/vs/base/browser/ui/findinput/findInputCheckboxes.css +/users/foo/src/vs/base/browser/ui/findinput/case-sensitive-dark.svg +/users/foo/src/vs/base/browser/ui/findinput/whole-word-dark.svg +/users/foo/src/vs/base/browser/ui/findinput/findInputCheckboxes.ts +/users/foo/src/vs/base/browser/ui/findinput/regex-dark.svg +/users/foo/src/vs/base/browser/ui/widget.ts +/users/foo/src/vs/base/browser/ui/sash +/users/foo/src/vs/base/browser/ui/sash/sash.ts +/users/foo/src/vs/base/browser/ui/sash/sash.css +/users/foo/src/vs/base/browser/ui/inputbox +/users/foo/src/vs/base/browser/ui/inputbox/inputBox.ts +/users/foo/src/vs/base/browser/ui/inputbox/inputBox.css +/users/foo/src/vs/base/browser/ui/scrollbar +/users/foo/src/vs/base/browser/ui/scrollbar/verticalScrollbar.ts +/users/foo/src/vs/base/browser/ui/scrollbar/scrollbarArrow.ts +/users/foo/src/vs/base/browser/ui/scrollbar/scrollbarVisibilityController.ts +/users/foo/src/vs/base/browser/ui/scrollbar/abstractScrollbar.ts +/users/foo/src/vs/base/browser/ui/scrollbar/horizontalScrollbar.ts +/users/foo/src/vs/base/browser/ui/scrollbar/scrollbarState.ts +/users/foo/src/vs/base/browser/ui/scrollbar/scrollableElementOptions.ts +/users/foo/src/vs/base/browser/ui/scrollbar/scrollableElement.ts +/users/foo/src/vs/base/browser/ui/scrollbar/media +/users/foo/src/vs/base/browser/ui/scrollbar/media/arrow-down.svg +/users/foo/src/vs/base/browser/ui/scrollbar/media/arrow-left-dark.svg +/users/foo/src/vs/base/browser/ui/scrollbar/media/arrow-right.svg +/users/foo/src/vs/base/browser/ui/scrollbar/media/scrollbars.css +/users/foo/src/vs/base/browser/ui/scrollbar/media/arrow-up-dark.svg +/users/foo/src/vs/base/browser/ui/scrollbar/media/arrow-down-dark.svg +/users/foo/src/vs/base/browser/ui/scrollbar/media/arrow-right-dark.svg +/users/foo/src/vs/base/browser/ui/scrollbar/media/arrow-up.svg +/users/foo/src/vs/base/browser/ui/scrollbar/media/arrow-left.svg +/users/foo/src/vs/base/browser/dom.ts +/users/foo/src/vs/base/browser/builder.css +/users/foo/src/vs/base/browser/mouseEvent.ts +/users/foo/src/vs/base/browser/touch.ts +/users/foo/src/vs/base/browser/fastDomNode.ts +/users/foo/src/vs/base/browser/builder.ts +/users/foo/src/vs/base/browser/browser.ts +/users/foo/src/vs/base/browser/iframe.ts +/users/foo/src/vs/base/browser/globalMouseMoveMonitor.ts +/users/foo/src/vs/base/browser/dnd.ts +/users/foo/src/vs/base/browser/htmlContentRenderer.ts +/users/foo/src/vs/base/browser/event.ts +/users/foo/src/vs/base/browser/keyboardEvent.ts +/users/foo/src/vs/base/common +/users/foo/src/vs/base/common/decorators.ts +/users/foo/src/vs/base/common/history.ts +/users/foo/src/vs/base/common/winjs.base.js +/users/foo/src/vs/base/common/filters.ts +/users/foo/src/vs/base/common/uuid.ts +/users/foo/src/vs/base/common/strings.ts +/users/foo/src/vs/base/common/paging.ts +/users/foo/src/vs/base/common/date.ts +/users/foo/src/vs/base/common/json.ts +/users/foo/src/vs/base/common/charCode.ts +/users/foo/src/vs/base/common/normalization.ts +/users/foo/src/vs/base/common/jsonSchema.ts +/users/foo/src/vs/base/common/objects.ts +/users/foo/src/vs/base/common/htmlContent.ts +/users/foo/src/vs/base/common/async.ts +/users/foo/src/vs/base/common/errors.ts +/users/foo/src/vs/base/common/resources.ts +/users/foo/src/vs/base/common/network.ts +/users/foo/src/vs/base/common/comparers.ts +/users/foo/src/vs/base/common/marked +/users/foo/src/vs/base/common/marked/marked.license.txt +/users/foo/src/vs/base/common/marked/marked.js +/users/foo/src/vs/base/common/marked/OSSREADME.json +/users/foo/src/vs/base/common/marked/marked.d.ts +/users/foo/src/vs/base/common/keyCodes.ts +/users/foo/src/vs/base/common/lifecycle.ts +/users/foo/src/vs/base/common/uri.ts +/users/foo/src/vs/base/common/errorMessage.ts +/users/foo/src/vs/base/common/iterator.ts +/users/foo/src/vs/base/common/collections.ts +/users/foo/src/vs/base/common/octicon.ts +/users/foo/src/vs/base/common/functional.ts +/users/foo/src/vs/base/common/scrollable.ts +/users/foo/src/vs/base/common/diff +/users/foo/src/vs/base/common/diff/diff.ts +/users/foo/src/vs/base/common/diff/diffChange.ts +/users/foo/src/vs/base/common/processes.ts +/users/foo/src/vs/base/common/jsonErrorMessages.ts +/users/foo/src/vs/base/common/platform.ts +/users/foo/src/vs/base/common/stopwatch.ts +/users/foo/src/vs/base/common/hash.ts +/users/foo/src/vs/base/common/idGenerator.ts +/users/foo/src/vs/base/common/glob.ts +/users/foo/src/vs/base/common/map.ts +/users/foo/src/vs/base/common/types.ts +/users/foo/src/vs/base/common/assert.ts +/users/foo/src/vs/base/common/performance.js +/users/foo/src/vs/base/common/winjs.polyfill.promise.ts +/users/foo/src/vs/base/common/numbers.ts +/users/foo/src/vs/base/common/parsers.ts +/users/foo/src/vs/base/common/performance.d.ts +/users/foo/src/vs/base/common/jsonEdit.ts +/users/foo/src/vs/base/common/cache.ts +/users/foo/src/vs/base/common/actions.ts +/users/foo/src/vs/base/common/buildunit.json +/users/foo/src/vs/base/common/winjs.base.d.ts +/users/foo/src/vs/base/common/graph.ts +/users/foo/src/vs/base/common/linkedList.ts +/users/foo/src/vs/base/common/diagnostics.ts +/users/foo/src/vs/base/common/sequence.ts +/users/foo/src/vs/base/common/cancellation.ts +/users/foo/src/vs/base/common/severity.ts +/users/foo/src/vs/base/common/paths.ts +/users/foo/src/vs/base/common/jsonFormatter.ts +/users/foo/src/vs/base/common/worker +/users/foo/src/vs/base/common/worker/simpleWorker.ts +/users/foo/src/vs/base/common/color.ts +/users/foo/src/vs/base/common/event.ts +/users/foo/src/vs/base/common/marshalling.ts +/users/foo/src/vs/base/common/mime.ts +/users/foo/src/vs/base/common/keybindingLabels.ts +/users/foo/src/vs/base/common/labels.ts +/users/foo/src/vs/base/common/arrays.ts +/users/foo/src/vs/base/parts +/users/foo/src/vs/base/parts/tree +/users/foo/src/vs/base/parts/tree/test +/users/foo/src/vs/base/parts/tree/test/browser +/users/foo/src/vs/base/parts/tree/test/browser/treeViewModel.test.ts +/users/foo/src/vs/base/parts/tree/test/browser/treeModel.test.ts +/users/foo/src/vs/base/parts/tree/browser +/users/foo/src/vs/base/parts/tree/browser/collapsed.svg +/users/foo/src/vs/base/parts/tree/browser/expanded-dark.svg +/users/foo/src/vs/base/parts/tree/browser/loading-hc.svg +/users/foo/src/vs/base/parts/tree/browser/collapsed-hc.svg +/users/foo/src/vs/base/parts/tree/browser/CollapseAll.svg +/users/foo/src/vs/base/parts/tree/browser/collapsed-dark.svg +/users/foo/src/vs/base/parts/tree/browser/CollapseAll_inverse.svg +/users/foo/src/vs/base/parts/tree/browser/treeDnd.ts +/users/foo/src/vs/base/parts/tree/browser/treeModel.ts +/users/foo/src/vs/base/parts/tree/browser/treeViewModel.ts +/users/foo/src/vs/base/parts/tree/browser/expanded.svg +/users/foo/src/vs/base/parts/tree/browser/treeImpl.ts +/users/foo/src/vs/base/parts/tree/browser/loading.svg +/users/foo/src/vs/base/parts/tree/browser/treeDefaults.ts +/users/foo/src/vs/base/parts/tree/browser/expanded-hc.svg +/users/foo/src/vs/base/parts/tree/browser/treeView.ts +/users/foo/src/vs/base/parts/tree/browser/tree.ts +/users/foo/src/vs/base/parts/tree/browser/tree.css +/users/foo/src/vs/base/parts/tree/browser/loading-dark.svg +/users/foo/src/vs/base/parts/quickopen +/users/foo/src/vs/base/parts/quickopen/test +/users/foo/src/vs/base/parts/quickopen/test/browser +/users/foo/src/vs/base/parts/quickopen/test/browser/quickopen.test.ts +/users/foo/src/vs/base/parts/quickopen/test/common +/users/foo/src/vs/base/parts/quickopen/test/common/quickOpenScorer.test.ts +/users/foo/src/vs/base/parts/quickopen/browser +/users/foo/src/vs/base/parts/quickopen/browser/quickopen.css +/users/foo/src/vs/base/parts/quickopen/browser/quickOpenModel.ts +/users/foo/src/vs/base/parts/quickopen/browser/quickOpenViewer.ts +/users/foo/src/vs/base/parts/quickopen/browser/quickOpenWidget.ts +/users/foo/src/vs/base/parts/quickopen/common +/users/foo/src/vs/base/parts/quickopen/common/quickOpenScorer.ts +/users/foo/src/vs/base/parts/quickopen/common/quickOpen.ts +/users/foo/src/vs/base/parts/ipc +/users/foo/src/vs/base/parts/ipc/test +/users/foo/src/vs/base/parts/ipc/test/node +/users/foo/src/vs/base/parts/ipc/test/node/testApp.ts +/users/foo/src/vs/base/parts/ipc/test/node/ipc.perf.ts +/users/foo/src/vs/base/parts/ipc/test/node/ipc.net.test.ts +/users/foo/src/vs/base/parts/ipc/test/node/ipc.test.ts +/users/foo/src/vs/base/parts/ipc/test/node/testService.ts +/users/foo/src/vs/base/parts/ipc/common +/users/foo/src/vs/base/parts/ipc/common/ipc.electron.ts +/users/foo/src/vs/base/parts/ipc/common/ipc.ts +/users/foo/src/vs/base/parts/ipc/electron-browser +/users/foo/src/vs/base/parts/ipc/electron-browser/ipc.electron-browser.ts +/users/foo/src/vs/base/parts/ipc/node +/users/foo/src/vs/base/parts/ipc/node/ipc.cp.ts +/users/foo/src/vs/base/parts/ipc/node/ipc.net.ts +/users/foo/src/vs/base/parts/ipc/electron-main +/users/foo/src/vs/base/parts/ipc/electron-main/ipc.electron-main.ts +/users/foo/src/vs/base/node +/users/foo/src/vs/base/node/pfs.ts +/users/foo/src/vs/base/node/ps.ts +/users/foo/src/vs/base/node/stats.ts +/users/foo/src/vs/base/node/crypto.ts +/users/foo/src/vs/base/node/zip.ts +/users/foo/src/vs/base/node/processes.ts +/users/foo/src/vs/base/node/stream.ts +/users/foo/src/vs/base/node/flow.ts +/users/foo/src/vs/base/node/terminateProcess.sh +/users/foo/src/vs/base/node/request.ts +/users/foo/src/vs/base/node/ports.ts +/users/foo/src/vs/base/node/extfs.ts +/users/foo/src/vs/base/node/stdFork.ts +/users/foo/src/vs/base/node/proxy.ts +/users/foo/src/vs/base/node/paths.ts +/users/foo/src/vs/base/node/encoding.ts +/users/foo/src/vs/base/node/config.ts +/users/foo/src/vs/base/node/id.ts +/users/foo/src/vs/base/node/stdForkStart.js +/users/foo/src/vs/base/node/console.ts +/users/foo/src/vs/base/node/decoder.ts +/users/foo/src/vs/base/worker +/users/foo/src/vs/base/worker/defaultWorkerFactory.ts +/users/foo/src/vs/base/worker/workerMain.ts +/users/foo/src/vs/editor +/users/foo/src/vs/editor/editor.api.ts +/users/foo/src/vs/editor/editor.worker.ts +/users/foo/src/vs/editor/test +/users/foo/src/vs/editor/test/browser +/users/foo/src/vs/editor/test/browser/editorTestServices.ts +/users/foo/src/vs/editor/test/browser/core +/users/foo/src/vs/editor/test/browser/core/editorState.test.ts +/users/foo/src/vs/editor/test/browser/controller +/users/foo/src/vs/editor/test/browser/controller/imeTester.ts +/users/foo/src/vs/editor/test/browser/controller/imeTester.html +/users/foo/src/vs/editor/test/browser/controller/inputRecorder.html +/users/foo/src/vs/editor/test/browser/controller/cursor.test.ts +/users/foo/src/vs/editor/test/browser/controller/cursorMoveCommand.test.ts +/users/foo/src/vs/editor/test/browser/controller/textAreaState.test.ts +/users/foo/src/vs/editor/test/browser/testCodeEditor.ts +/users/foo/src/vs/editor/test/browser/testCommand.ts +/users/foo/src/vs/editor/test/browser/view +/users/foo/src/vs/editor/test/browser/view/minimapFontCreator.html +/users/foo/src/vs/editor/test/browser/view/viewLayer.test.ts +/users/foo/src/vs/editor/test/browser/view/minimapFontCreator.ts +/users/foo/src/vs/editor/test/browser/commands +/users/foo/src/vs/editor/test/browser/commands/sideEditing.test.ts +/users/foo/src/vs/editor/test/browser/commands/trimTrailingWhitespaceCommand.test.ts +/users/foo/src/vs/editor/test/browser/commands/shiftCommand.test.ts +/users/foo/src/vs/editor/test/browser/services +/users/foo/src/vs/editor/test/browser/services/decorationRenderOptions.test.ts +/users/foo/src/vs/editor/test/common +/users/foo/src/vs/editor/test/common/mocks +/users/foo/src/vs/editor/test/common/mocks/mockMode.ts +/users/foo/src/vs/editor/test/common/mocks/testConfiguration.ts +/users/foo/src/vs/editor/test/common/viewModel +/users/foo/src/vs/editor/test/common/viewModel/testViewModel.ts +/users/foo/src/vs/editor/test/common/viewModel/viewModelImpl.test.ts +/users/foo/src/vs/editor/test/common/viewModel/prefixSumComputer.test.ts +/users/foo/src/vs/editor/test/common/viewModel/viewModelDecorations.test.ts +/users/foo/src/vs/editor/test/common/viewModel/characterHardWrappingLineMapper.test.ts +/users/foo/src/vs/editor/test/common/viewModel/splitLinesCollection.test.ts +/users/foo/src/vs/editor/test/common/modesTestUtils.ts +/users/foo/src/vs/editor/test/common/core +/users/foo/src/vs/editor/test/common/core/range.test.ts +/users/foo/src/vs/editor/test/common/core/viewLineToken.ts +/users/foo/src/vs/editor/test/common/core/characterClassifier.test.ts +/users/foo/src/vs/editor/test/common/core/lineTokens.test.ts +/users/foo/src/vs/editor/test/common/modes +/users/foo/src/vs/editor/test/common/modes/supports +/users/foo/src/vs/editor/test/common/modes/supports/richEditBrackets.test.ts +/users/foo/src/vs/editor/test/common/modes/supports/tokenization.test.ts +/users/foo/src/vs/editor/test/common/modes/supports/characterPair.test.ts +/users/foo/src/vs/editor/test/common/modes/supports/onEnter.test.ts +/users/foo/src/vs/editor/test/common/modes/supports/electricCharacter.test.ts +/users/foo/src/vs/editor/test/common/modes/languageSelector.test.ts +/users/foo/src/vs/editor/test/common/modes/textToHtmlTokenizer.test.ts +/users/foo/src/vs/editor/test/common/modes/linkComputer.test.ts +/users/foo/src/vs/editor/test/common/modes/languageConfiguration.test.ts +/users/foo/src/vs/editor/test/common/viewLayout +/users/foo/src/vs/editor/test/common/viewLayout/viewLineRenderer.test.ts +/users/foo/src/vs/editor/test/common/viewLayout/whitespaceComputer.test.ts +/users/foo/src/vs/editor/test/common/viewLayout/editorLayoutProvider.test.ts +/users/foo/src/vs/editor/test/common/viewLayout/linesLayout.test.ts +/users/foo/src/vs/editor/test/common/viewLayout/lineDecorations.test.ts +/users/foo/src/vs/editor/test/common/standalone +/users/foo/src/vs/editor/test/common/standalone/standaloneBase.test.ts +/users/foo/src/vs/editor/test/common/config +/users/foo/src/vs/editor/test/common/config/commonEditorConfig.test.ts +/users/foo/src/vs/editor/test/common/diff +/users/foo/src/vs/editor/test/common/diff/diffComputer.test.ts +/users/foo/src/vs/editor/test/common/controller +/users/foo/src/vs/editor/test/common/controller/cursorMoveHelper.test.ts +/users/foo/src/vs/editor/test/common/model +/users/foo/src/vs/editor/test/common/model/benchmark +/users/foo/src/vs/editor/test/common/model/benchmark/benchmarkUtils.ts +/users/foo/src/vs/editor/test/common/model/benchmark/searchNReplace.benchmark.ts +/users/foo/src/vs/editor/test/common/model/benchmark/modelbuilder.benchmark.ts +/users/foo/src/vs/editor/test/common/model/benchmark/entry.ts +/users/foo/src/vs/editor/test/common/model/benchmark/bootstrap.js +/users/foo/src/vs/editor/test/common/model/benchmark/operations.benchmark.ts +/users/foo/src/vs/editor/test/common/model/editableTextModel.test.ts +/users/foo/src/vs/editor/test/common/model/model.test.ts +/users/foo/src/vs/editor/test/common/model/textModelSearch.test.ts +/users/foo/src/vs/editor/test/common/model/linesTextBuffer +/users/foo/src/vs/editor/test/common/model/linesTextBuffer/linesTextBufferBuilder.test.ts +/users/foo/src/vs/editor/test/common/model/linesTextBuffer/linesTextBuffer.test.ts +/users/foo/src/vs/editor/test/common/model/linesTextBuffer/textBufferAutoTestUtils.ts +/users/foo/src/vs/editor/test/common/model/textModel.test.ts +/users/foo/src/vs/editor/test/common/model/editableTextModelAuto.test.ts +/users/foo/src/vs/editor/test/common/model/intervalTree.test.ts +/users/foo/src/vs/editor/test/common/model/model.line.test.ts +/users/foo/src/vs/editor/test/common/model/editableTextModelTestUtils.ts +/users/foo/src/vs/editor/test/common/model/pieceTreeTextBuffer +/users/foo/src/vs/editor/test/common/model/pieceTreeTextBuffer/pieceTreeTextBuffer.test.ts +/users/foo/src/vs/editor/test/common/model/modelDecorations.test.ts +/users/foo/src/vs/editor/test/common/model/modelEditOperation.test.ts +/users/foo/src/vs/editor/test/common/model/textModelWithTokens.test.ts +/users/foo/src/vs/editor/test/common/model/model.modes.test.ts +/users/foo/src/vs/editor/test/common/view +/users/foo/src/vs/editor/test/common/view/minimapCharRendererFactory.ts +/users/foo/src/vs/editor/test/common/view/minimapCharRenderer.test.ts +/users/foo/src/vs/editor/test/common/view/overviewZoneManager.test.ts +/users/foo/src/vs/editor/test/common/commentMode.ts +/users/foo/src/vs/editor/test/common/editorTestUtils.ts +/users/foo/src/vs/editor/test/common/services +/users/foo/src/vs/editor/test/common/services/languagesRegistry.test.ts +/users/foo/src/vs/editor/test/common/services/modelService.test.ts +/users/foo/src/vs/editor/test/common/services/editorSimpleWorker.test.ts +/users/foo/src/vs/editor/standalone +/users/foo/src/vs/editor/standalone/test +/users/foo/src/vs/editor/standalone/test/browser +/users/foo/src/vs/editor/standalone/test/browser/simpleServices.test.ts +/users/foo/src/vs/editor/standalone/test/browser/standaloneLanguages.test.ts +/users/foo/src/vs/editor/standalone/browser +/users/foo/src/vs/editor/standalone/browser/iPadShowKeyboard +/users/foo/src/vs/editor/standalone/browser/iPadShowKeyboard/iPadShowKeyboard.ts +/users/foo/src/vs/editor/standalone/browser/iPadShowKeyboard/keyboard.svg +/users/foo/src/vs/editor/standalone/browser/iPadShowKeyboard/iPadShowKeyboard.css +/users/foo/src/vs/editor/standalone/browser/iPadShowKeyboard/keyboard-inverse.svg +/users/foo/src/vs/editor/standalone/browser/simpleServices.ts +/users/foo/src/vs/editor/standalone/browser/toggleHighContrast +/users/foo/src/vs/editor/standalone/browser/toggleHighContrast/toggleHighContrast.ts +/users/foo/src/vs/editor/standalone/browser/standaloneCodeEditor.ts +/users/foo/src/vs/editor/standalone/browser/accessibilityHelp +/users/foo/src/vs/editor/standalone/browser/accessibilityHelp/accessibilityHelp.ts +/users/foo/src/vs/editor/standalone/browser/accessibilityHelp/accessibilityHelp.css +/users/foo/src/vs/editor/standalone/browser/quickOpen +/users/foo/src/vs/editor/standalone/browser/quickOpen/quickOutline.ts +/users/foo/src/vs/editor/standalone/browser/quickOpen/editorQuickOpen.ts +/users/foo/src/vs/editor/standalone/browser/quickOpen/gotoLine.ts +/users/foo/src/vs/editor/standalone/browser/quickOpen/symbol-sprite.svg +/users/foo/src/vs/editor/standalone/browser/quickOpen/quickOutline.css +/users/foo/src/vs/editor/standalone/browser/quickOpen/quickOpenEditorWidget.ts +/users/foo/src/vs/editor/standalone/browser/quickOpen/quickCommand.ts +/users/foo/src/vs/editor/standalone/browser/quickOpen/gotoLine.css +/users/foo/src/vs/editor/standalone/browser/standaloneThemeServiceImpl.ts +/users/foo/src/vs/editor/standalone/browser/standaloneLanguages.ts +/users/foo/src/vs/editor/standalone/browser/inspectTokens +/users/foo/src/vs/editor/standalone/browser/inspectTokens/inspectTokens.ts +/users/foo/src/vs/editor/standalone/browser/inspectTokens/inspectTokens.css +/users/foo/src/vs/editor/standalone/browser/standalone-tokens.css +/users/foo/src/vs/editor/standalone/browser/standaloneEditor.ts +/users/foo/src/vs/editor/standalone/browser/colorizer.ts +/users/foo/src/vs/editor/standalone/browser/standaloneServices.ts +/users/foo/src/vs/editor/standalone/browser/referenceSearch +/users/foo/src/vs/editor/standalone/browser/referenceSearch/standaloneReferenceSearch.ts +/users/foo/src/vs/editor/standalone/common +/users/foo/src/vs/editor/standalone/common/standaloneThemeService.ts +/users/foo/src/vs/editor/standalone/common/monarch +/users/foo/src/vs/editor/standalone/common/monarch/monarchCommon.ts +/users/foo/src/vs/editor/standalone/common/monarch/monarchTypes.ts +/users/foo/src/vs/editor/standalone/common/monarch/monarchCompile.ts +/users/foo/src/vs/editor/standalone/common/monarch/monarchLexer.ts +/users/foo/src/vs/editor/standalone/common/themes.ts +/users/foo/src/vs/editor/contrib +/users/foo/src/vs/editor/contrib/suggest +/users/foo/src/vs/editor/contrib/suggest/test +/users/foo/src/vs/editor/contrib/suggest/test/completionModel.test.ts +/users/foo/src/vs/editor/contrib/suggest/test/suggest.test.ts +/users/foo/src/vs/editor/contrib/suggest/test/suggestMemory.test.ts +/users/foo/src/vs/editor/contrib/suggest/test/suggestModel.test.ts +/users/foo/src/vs/editor/contrib/suggest/suggestController.ts +/users/foo/src/vs/editor/contrib/suggest/suggestModel.ts +/users/foo/src/vs/editor/contrib/suggest/completionModel.ts +/users/foo/src/vs/editor/contrib/suggest/suggest.ts +/users/foo/src/vs/editor/contrib/suggest/suggestWidget.ts +/users/foo/src/vs/editor/contrib/suggest/suggestMemory.ts +/users/foo/src/vs/editor/contrib/suggest/media +/users/foo/src/vs/editor/contrib/suggest/media/Field_16x.svg +/users/foo/src/vs/editor/contrib/suggest/media/Misc_inverse_16x.svg +/users/foo/src/vs/editor/contrib/suggest/media/Constant_16x.svg +/users/foo/src/vs/editor/contrib/suggest/media/Folder_inverse_16x.svg +/users/foo/src/vs/editor/contrib/suggest/media/Ruler_inverse_16x.svg +/users/foo/src/vs/editor/contrib/suggest/media/IntelliSenseKeyword_inverse_16x.svg +/users/foo/src/vs/editor/contrib/suggest/media/Class_inverse_16x.svg +/users/foo/src/vs/editor/contrib/suggest/media/close-dark.svg +/users/foo/src/vs/editor/contrib/suggest/media/ColorPalette_inverse_16x.svg +/users/foo/src/vs/editor/contrib/suggest/media/LocalVariable_16x_vscode_inverse.svg +/users/foo/src/vs/editor/contrib/suggest/media/Property_16x.svg +/users/foo/src/vs/editor/contrib/suggest/media/EnumItem_inverse_16x.svg +/users/foo/src/vs/editor/contrib/suggest/media/Template_16x_vscode.svg +/users/foo/src/vs/editor/contrib/suggest/media/Enumerator_16x.svg +/users/foo/src/vs/editor/contrib/suggest/media/Operator_16x_vscode_inverse.svg +/users/foo/src/vs/editor/contrib/suggest/media/Interface_inverse_16x.svg +/users/foo/src/vs/editor/contrib/suggest/media/Snippet_16x.svg +/users/foo/src/vs/editor/contrib/suggest/media/LocalVariable_16x_vscode.svg +/users/foo/src/vs/editor/contrib/suggest/media/String_inverse_16x.svg +/users/foo/src/vs/editor/contrib/suggest/media/Folder_16x.svg +/users/foo/src/vs/editor/contrib/suggest/media/Structure_16x_vscode.svg +/users/foo/src/vs/editor/contrib/suggest/media/Snippet_inverse_16x.svg +/users/foo/src/vs/editor/contrib/suggest/media/suggest.css +/users/foo/src/vs/editor/contrib/suggest/media/Event_16x_vscode.svg +/users/foo/src/vs/editor/contrib/suggest/media/info.svg +/users/foo/src/vs/editor/contrib/suggest/media/Enumerator_inverse_16x.svg +/users/foo/src/vs/editor/contrib/suggest/media/close.svg +/users/foo/src/vs/editor/contrib/suggest/media/String_16x.svg +/users/foo/src/vs/editor/contrib/suggest/media/ColorPalette_16x.svg +/users/foo/src/vs/editor/contrib/suggest/media/Method_16x.svg +/users/foo/src/vs/editor/contrib/suggest/media/ImportFile_16x_vscode_inverse.svg +/users/foo/src/vs/editor/contrib/suggest/media/Namespace_inverse_16x.svg +/users/foo/src/vs/editor/contrib/suggest/media/Field_inverse_16x.svg +/users/foo/src/vs/editor/contrib/suggest/media/Structure_16x_vscode_inverse.svg +/users/foo/src/vs/editor/contrib/suggest/media/Event_16x_vscode_inverse.svg +/users/foo/src/vs/editor/contrib/suggest/media/Template_16x_vscode_inverse.svg +/users/foo/src/vs/editor/contrib/suggest/media/IntelliSenseKeyword_16x.svg +/users/foo/src/vs/editor/contrib/suggest/media/EnumItem_16x.svg +/users/foo/src/vs/editor/contrib/suggest/media/Interface_16x.svg +/users/foo/src/vs/editor/contrib/suggest/media/Namespace_16x.svg +/users/foo/src/vs/editor/contrib/suggest/media/Property_inverse_16x.svg +/users/foo/src/vs/editor/contrib/suggest/media/Misc_16x.svg +/users/foo/src/vs/editor/contrib/suggest/media/Operator_16x_vscode.svg +/users/foo/src/vs/editor/contrib/suggest/media/Constant_16x_inverse.svg +/users/foo/src/vs/editor/contrib/suggest/media/Ruler_16x.svg +/users/foo/src/vs/editor/contrib/suggest/media/ImportFile_16x_vscode.svg +/users/foo/src/vs/editor/contrib/suggest/media/Method_inverse_16x.svg +/users/foo/src/vs/editor/contrib/suggest/media/Document_16x.svg +/users/foo/src/vs/editor/contrib/suggest/media/Class_16x.svg +/users/foo/src/vs/editor/contrib/suggest/media/Document_inverse_16x.svg +/users/foo/src/vs/editor/contrib/folding +/users/foo/src/vs/editor/contrib/folding/arrow-collapse-dark.svg +/users/foo/src/vs/editor/contrib/folding/folding.css +/users/foo/src/vs/editor/contrib/folding/syntaxRangeProvider.ts +/users/foo/src/vs/editor/contrib/folding/test +/users/foo/src/vs/editor/contrib/folding/test/foldingRanges.test.ts +/users/foo/src/vs/editor/contrib/folding/test/indentFold.test.ts +/users/foo/src/vs/editor/contrib/folding/test/indentRangeProvider.test.ts +/users/foo/src/vs/editor/contrib/folding/test/foldingModel.test.ts +/users/foo/src/vs/editor/contrib/folding/test/syntaxFold.test.ts +/users/foo/src/vs/editor/contrib/folding/test/hiddenRangeModel.test.ts +/users/foo/src/vs/editor/contrib/folding/foldingRanges.ts +/users/foo/src/vs/editor/contrib/folding/hiddenRangeModel.ts +/users/foo/src/vs/editor/contrib/folding/folding.ts +/users/foo/src/vs/editor/contrib/folding/arrow-expand-dark.svg +/users/foo/src/vs/editor/contrib/folding/arrow-collapse.svg +/users/foo/src/vs/editor/contrib/folding/indentRangeProvider.ts +/users/foo/src/vs/editor/contrib/folding/arrow-expand.svg +/users/foo/src/vs/editor/contrib/folding/foldingModel.ts +/users/foo/src/vs/editor/contrib/folding/foldingDecorations.ts +/users/foo/src/vs/editor/contrib/smartSelect +/users/foo/src/vs/editor/contrib/smartSelect/test +/users/foo/src/vs/editor/contrib/smartSelect/test/tokenSelectionSupport.test.ts +/users/foo/src/vs/editor/contrib/smartSelect/tokenSelectionSupport.ts +/users/foo/src/vs/editor/contrib/smartSelect/tokenTree.ts +/users/foo/src/vs/editor/contrib/smartSelect/smartSelect.ts +/users/foo/src/vs/editor/contrib/hover +/users/foo/src/vs/editor/contrib/hover/hover.ts +/users/foo/src/vs/editor/contrib/hover/getHover.ts +/users/foo/src/vs/editor/contrib/hover/hoverOperation.ts +/users/foo/src/vs/editor/contrib/hover/hover.css +/users/foo/src/vs/editor/contrib/hover/modesContentHover.ts +/users/foo/src/vs/editor/contrib/hover/hoverWidgets.ts +/users/foo/src/vs/editor/contrib/hover/modesGlyphHover.ts +/users/foo/src/vs/editor/contrib/cursorUndo +/users/foo/src/vs/editor/contrib/cursorUndo/cursorUndo.ts +/users/foo/src/vs/editor/contrib/gotoError +/users/foo/src/vs/editor/contrib/gotoError/gotoErrorWidget.css +/users/foo/src/vs/editor/contrib/gotoError/gotoError.ts +/users/foo/src/vs/editor/contrib/gotoError/gotoErrorWidget.ts +/users/foo/src/vs/editor/contrib/toggleTabFocusMode +/users/foo/src/vs/editor/contrib/toggleTabFocusMode/toggleTabFocusMode.ts +/users/foo/src/vs/editor/contrib/multicursor +/users/foo/src/vs/editor/contrib/multicursor/test +/users/foo/src/vs/editor/contrib/multicursor/test/multicursor.test.ts +/users/foo/src/vs/editor/contrib/multicursor/multicursor.ts +/users/foo/src/vs/editor/contrib/quickOpen +/users/foo/src/vs/editor/contrib/quickOpen/quickOpen.ts +/users/foo/src/vs/editor/contrib/linesOperations +/users/foo/src/vs/editor/contrib/linesOperations/test +/users/foo/src/vs/editor/contrib/linesOperations/test/copyLinesCommand.test.ts +/users/foo/src/vs/editor/contrib/linesOperations/test/linesOperations.test.ts +/users/foo/src/vs/editor/contrib/linesOperations/test/sortLinesCommand.test.ts +/users/foo/src/vs/editor/contrib/linesOperations/test/moveLinesCommand.test.ts +/users/foo/src/vs/editor/contrib/linesOperations/test/deleteLinesCommand.test.ts +/users/foo/src/vs/editor/contrib/linesOperations/deleteLinesCommand.ts +/users/foo/src/vs/editor/contrib/linesOperations/linesOperations.ts +/users/foo/src/vs/editor/contrib/linesOperations/copyLinesCommand.ts +/users/foo/src/vs/editor/contrib/linesOperations/moveLinesCommand.ts +/users/foo/src/vs/editor/contrib/linesOperations/sortLinesCommand.ts +/users/foo/src/vs/editor/contrib/comment +/users/foo/src/vs/editor/contrib/comment/test +/users/foo/src/vs/editor/contrib/comment/test/blockCommentCommand.test.ts +/users/foo/src/vs/editor/contrib/comment/test/lineCommentCommand.test.ts +/users/foo/src/vs/editor/contrib/comment/lineCommentCommand.ts +/users/foo/src/vs/editor/contrib/comment/blockCommentCommand.ts +/users/foo/src/vs/editor/contrib/comment/comment.ts +/users/foo/src/vs/editor/contrib/markdown +/users/foo/src/vs/editor/contrib/markdown/markdownRenderer.ts +/users/foo/src/vs/editor/contrib/dnd +/users/foo/src/vs/editor/contrib/dnd/dragAndDropCommand.ts +/users/foo/src/vs/editor/contrib/dnd/dnd.css +/users/foo/src/vs/editor/contrib/dnd/dnd.ts +/users/foo/src/vs/editor/contrib/caretOperations +/users/foo/src/vs/editor/contrib/caretOperations/test +/users/foo/src/vs/editor/contrib/caretOperations/test/moveCarretCommand.test.ts +/users/foo/src/vs/editor/contrib/caretOperations/caretOperations.ts +/users/foo/src/vs/editor/contrib/caretOperations/transpose.ts +/users/foo/src/vs/editor/contrib/caretOperations/moveCaretCommand.ts +/users/foo/src/vs/editor/contrib/goToDefinition +/users/foo/src/vs/editor/contrib/goToDefinition/goToDefinitionMouse.css +/users/foo/src/vs/editor/contrib/goToDefinition/goToDefinitionMouse.ts +/users/foo/src/vs/editor/contrib/goToDefinition/goToDefinition.ts +/users/foo/src/vs/editor/contrib/goToDefinition/goToDefinitionCommands.ts +/users/foo/src/vs/editor/contrib/goToDefinition/clickLinkGesture.ts +/users/foo/src/vs/editor/contrib/snippet +/users/foo/src/vs/editor/contrib/snippet/test +/users/foo/src/vs/editor/contrib/snippet/test/snippetController2.test.ts +/users/foo/src/vs/editor/contrib/snippet/test/snippetSession.test.ts +/users/foo/src/vs/editor/contrib/snippet/test/snippetParser.test.ts +/users/foo/src/vs/editor/contrib/snippet/test/snippetVariables.test.ts +/users/foo/src/vs/editor/contrib/snippet/test/snippetController2.old.test.ts +/users/foo/src/vs/editor/contrib/snippet/snippetSession.css +/users/foo/src/vs/editor/contrib/snippet/snippetParser.ts +/users/foo/src/vs/editor/contrib/snippet/snippetController2.ts +/users/foo/src/vs/editor/contrib/snippet/snippetVariables.ts +/users/foo/src/vs/editor/contrib/snippet/snippet.md +/users/foo/src/vs/editor/contrib/snippet/snippetSession.ts +/users/foo/src/vs/editor/contrib/contextmenu +/users/foo/src/vs/editor/contrib/contextmenu/contextmenu.ts +/users/foo/src/vs/editor/contrib/message +/users/foo/src/vs/editor/contrib/message/messageController.css +/users/foo/src/vs/editor/contrib/message/messageController.ts +/users/foo/src/vs/editor/contrib/fontZoom +/users/foo/src/vs/editor/contrib/fontZoom/fontZoom.ts +/users/foo/src/vs/editor/contrib/indentation +/users/foo/src/vs/editor/contrib/indentation/test +/users/foo/src/vs/editor/contrib/indentation/test/indentation.test.ts +/users/foo/src/vs/editor/contrib/indentation/indentation.ts +/users/foo/src/vs/editor/contrib/indentation/indentUtils.ts +/users/foo/src/vs/editor/contrib/codeAction +/users/foo/src/vs/editor/contrib/codeAction/codeActionWidget.ts +/users/foo/src/vs/editor/contrib/codeAction/test +/users/foo/src/vs/editor/contrib/codeAction/test/codeAction.test.ts +/users/foo/src/vs/editor/contrib/codeAction/test/codeActionModel.test.ts +/users/foo/src/vs/editor/contrib/codeAction/lightBulbWidget.css +/users/foo/src/vs/editor/contrib/codeAction/codeActionCommands.ts +/users/foo/src/vs/editor/contrib/codeAction/codeActionContributions.ts +/users/foo/src/vs/editor/contrib/codeAction/lightbulb-dark.svg +/users/foo/src/vs/editor/contrib/codeAction/lightbulb.svg +/users/foo/src/vs/editor/contrib/codeAction/codeActionModel.ts +/users/foo/src/vs/editor/contrib/codeAction/codeAction.ts +/users/foo/src/vs/editor/contrib/codeAction/codeActionTrigger.ts +/users/foo/src/vs/editor/contrib/codeAction/lightBulbWidget.ts +/users/foo/src/vs/editor/contrib/links +/users/foo/src/vs/editor/contrib/links/links.css +/users/foo/src/vs/editor/contrib/links/links.ts +/users/foo/src/vs/editor/contrib/links/getLinks.ts +/users/foo/src/vs/editor/contrib/colorPicker +/users/foo/src/vs/editor/contrib/colorPicker/colorPickerModel.ts +/users/foo/src/vs/editor/contrib/colorPicker/images +/users/foo/src/vs/editor/contrib/colorPicker/images/opacity-background.png +/users/foo/src/vs/editor/contrib/colorPicker/colorPicker.css +/users/foo/src/vs/editor/contrib/colorPicker/colorDetector.ts +/users/foo/src/vs/editor/contrib/colorPicker/colorPickerWidget.ts +/users/foo/src/vs/editor/contrib/colorPicker/color.ts +/users/foo/src/vs/editor/contrib/bracketMatching +/users/foo/src/vs/editor/contrib/bracketMatching/bracketMatching.css +/users/foo/src/vs/editor/contrib/bracketMatching/test +/users/foo/src/vs/editor/contrib/bracketMatching/test/bracketMatching.test.ts +/users/foo/src/vs/editor/contrib/bracketMatching/bracketMatching.ts +/users/foo/src/vs/editor/contrib/format +/users/foo/src/vs/editor/contrib/format/formattingEdit.ts +/users/foo/src/vs/editor/contrib/format/format.ts +/users/foo/src/vs/editor/contrib/format/formatActions.ts +/users/foo/src/vs/editor/contrib/zoneWidget +/users/foo/src/vs/editor/contrib/zoneWidget/zoneWidget.css +/users/foo/src/vs/editor/contrib/zoneWidget/zoneWidget.ts +/users/foo/src/vs/editor/contrib/codelens +/users/foo/src/vs/editor/contrib/codelens/codelensWidget.css +/users/foo/src/vs/editor/contrib/codelens/codelens.ts +/users/foo/src/vs/editor/contrib/codelens/codelensWidget.ts +/users/foo/src/vs/editor/contrib/codelens/codelensController.ts +/users/foo/src/vs/editor/contrib/rename +/users/foo/src/vs/editor/contrib/rename/renameInputField.ts +/users/foo/src/vs/editor/contrib/rename/renameInputField.css +/users/foo/src/vs/editor/contrib/rename/rename.ts +/users/foo/src/vs/editor/contrib/inPlaceReplace +/users/foo/src/vs/editor/contrib/inPlaceReplace/inPlaceReplaceCommand.ts +/users/foo/src/vs/editor/contrib/inPlaceReplace/inPlaceReplace.ts +/users/foo/src/vs/editor/contrib/parameterHints +/users/foo/src/vs/editor/contrib/parameterHints/arrow-down.svg +/users/foo/src/vs/editor/contrib/parameterHints/parameterHintsWidget.ts +/users/foo/src/vs/editor/contrib/parameterHints/test +/users/foo/src/vs/editor/contrib/parameterHints/test/parameterHintsModel.test.ts +/users/foo/src/vs/editor/contrib/parameterHints/parameterHints.css +/users/foo/src/vs/editor/contrib/parameterHints/arrow-up-dark.svg +/users/foo/src/vs/editor/contrib/parameterHints/arrow-down-dark.svg +/users/foo/src/vs/editor/contrib/parameterHints/provideSignatureHelp.ts +/users/foo/src/vs/editor/contrib/parameterHints/arrow-up.svg +/users/foo/src/vs/editor/contrib/parameterHints/parameterHints.ts +/users/foo/src/vs/editor/contrib/find +/users/foo/src/vs/editor/contrib/find/findWidget.ts +/users/foo/src/vs/editor/contrib/find/findOptionsWidget.ts +/users/foo/src/vs/editor/contrib/find/simpleFindWidget.css +/users/foo/src/vs/editor/contrib/find/simpleFindWidget.ts +/users/foo/src/vs/editor/contrib/find/test +/users/foo/src/vs/editor/contrib/find/test/findController.test.ts +/users/foo/src/vs/editor/contrib/find/test/replacePattern.test.ts +/users/foo/src/vs/editor/contrib/find/test/findModel.test.ts +/users/foo/src/vs/editor/contrib/find/test/find.test.ts +/users/foo/src/vs/editor/contrib/find/replacePattern.ts +/users/foo/src/vs/editor/contrib/find/findModel.ts +/users/foo/src/vs/editor/contrib/find/images +/users/foo/src/vs/editor/contrib/find/images/expando-expanded.svg +/users/foo/src/vs/editor/contrib/find/images/replace-all.svg +/users/foo/src/vs/editor/contrib/find/images/expando-collapsed.svg +/users/foo/src/vs/editor/contrib/find/images/next-inverse.svg +/users/foo/src/vs/editor/contrib/find/images/close-dark.svg +/users/foo/src/vs/editor/contrib/find/images/cancelSelectionFind-inverse.svg +/users/foo/src/vs/editor/contrib/find/images/replace-inverse.svg +/users/foo/src/vs/editor/contrib/find/images/close.svg +/users/foo/src/vs/editor/contrib/find/images/previous.svg +/users/foo/src/vs/editor/contrib/find/images/replace-all-inverse.svg +/users/foo/src/vs/editor/contrib/find/images/next.svg +/users/foo/src/vs/editor/contrib/find/images/previous-inverse.svg +/users/foo/src/vs/editor/contrib/find/images/expando-expanded-dark.svg +/users/foo/src/vs/editor/contrib/find/images/cancelSelectionFind.svg +/users/foo/src/vs/editor/contrib/find/images/replace.svg +/users/foo/src/vs/editor/contrib/find/images/expando-collapsed-dark.svg +/users/foo/src/vs/editor/contrib/find/findState.ts +/users/foo/src/vs/editor/contrib/find/findController.ts +/users/foo/src/vs/editor/contrib/find/findWidget.css +/users/foo/src/vs/editor/contrib/find/replaceAllCommand.ts +/users/foo/src/vs/editor/contrib/find/findDecorations.ts +/users/foo/src/vs/editor/contrib/wordOperations +/users/foo/src/vs/editor/contrib/wordOperations/wordOperations.ts +/users/foo/src/vs/editor/contrib/wordOperations/test +/users/foo/src/vs/editor/contrib/wordOperations/test/wordOperations.test.ts +/users/foo/src/vs/editor/contrib/referenceSearch +/users/foo/src/vs/editor/contrib/referenceSearch/referencesController.ts +/users/foo/src/vs/editor/contrib/referenceSearch/test +/users/foo/src/vs/editor/contrib/referenceSearch/test/referencesModel.test.ts +/users/foo/src/vs/editor/contrib/referenceSearch/referencesWidget.ts +/users/foo/src/vs/editor/contrib/referenceSearch/peekViewWidget.ts +/users/foo/src/vs/editor/contrib/referenceSearch/referencesModel.ts +/users/foo/src/vs/editor/contrib/referenceSearch/referenceSearch.ts +/users/foo/src/vs/editor/contrib/referenceSearch/media +/users/foo/src/vs/editor/contrib/referenceSearch/media/referencesWidget.css +/users/foo/src/vs/editor/contrib/referenceSearch/media/close-inverse.svg +/users/foo/src/vs/editor/contrib/referenceSearch/media/close.svg +/users/foo/src/vs/editor/contrib/referenceSearch/media/peekViewWidget.css +/users/foo/src/vs/editor/contrib/wordHighlighter +/users/foo/src/vs/editor/contrib/wordHighlighter/wordHighlighter.ts +/users/foo/src/vs/editor/contrib/clipboard +/users/foo/src/vs/editor/contrib/clipboard/clipboard.ts +/users/foo/src/vs/editor/contrib/clipboard/clipboard.css +/users/foo/src/vs/editor/browser +/users/foo/src/vs/editor/browser/viewParts +/users/foo/src/vs/editor/browser/viewParts/lineNumbers +/users/foo/src/vs/editor/browser/viewParts/lineNumbers/flipped-cursor-mac-2x.svg +/users/foo/src/vs/editor/browser/viewParts/lineNumbers/flipped-cursor.svg +/users/foo/src/vs/editor/browser/viewParts/lineNumbers/flipped-cursor-mac.svg +/users/foo/src/vs/editor/browser/viewParts/lineNumbers/lineNumbers.ts +/users/foo/src/vs/editor/browser/viewParts/lineNumbers/lineNumbers.css +/users/foo/src/vs/editor/browser/viewParts/lineNumbers/flipped-cursor-2x.svg +/users/foo/src/vs/editor/browser/viewParts/selections +/users/foo/src/vs/editor/browser/viewParts/selections/selections.ts +/users/foo/src/vs/editor/browser/viewParts/selections/selections.css +/users/foo/src/vs/editor/browser/viewParts/linesDecorations +/users/foo/src/vs/editor/browser/viewParts/linesDecorations/linesDecorations.ts +/users/foo/src/vs/editor/browser/viewParts/linesDecorations/linesDecorations.css +/users/foo/src/vs/editor/browser/viewParts/editorScrollbar +/users/foo/src/vs/editor/browser/viewParts/editorScrollbar/editorScrollbar.ts +/users/foo/src/vs/editor/browser/viewParts/viewCursors +/users/foo/src/vs/editor/browser/viewParts/viewCursors/viewCursors.css +/users/foo/src/vs/editor/browser/viewParts/viewCursors/viewCursor.ts +/users/foo/src/vs/editor/browser/viewParts/viewCursors/viewCursors.ts +/users/foo/src/vs/editor/browser/viewParts/currentLineHighlight +/users/foo/src/vs/editor/browser/viewParts/currentLineHighlight/currentLineHighlight.ts +/users/foo/src/vs/editor/browser/viewParts/currentLineHighlight/currentLineHighlight.css +/users/foo/src/vs/editor/browser/viewParts/minimap +/users/foo/src/vs/editor/browser/viewParts/minimap/minimap.ts +/users/foo/src/vs/editor/browser/viewParts/minimap/minimap.css +/users/foo/src/vs/editor/browser/viewParts/decorations +/users/foo/src/vs/editor/browser/viewParts/decorations/decorations.css +/users/foo/src/vs/editor/browser/viewParts/decorations/decorations.ts +/users/foo/src/vs/editor/browser/viewParts/scrollDecoration +/users/foo/src/vs/editor/browser/viewParts/scrollDecoration/scrollDecoration.css +/users/foo/src/vs/editor/browser/viewParts/scrollDecoration/scrollDecoration.ts +/users/foo/src/vs/editor/browser/viewParts/viewZones +/users/foo/src/vs/editor/browser/viewParts/viewZones/viewZones.ts +/users/foo/src/vs/editor/browser/viewParts/overlayWidgets +/users/foo/src/vs/editor/browser/viewParts/overlayWidgets/overlayWidgets.ts +/users/foo/src/vs/editor/browser/viewParts/overlayWidgets/overlayWidgets.css +/users/foo/src/vs/editor/browser/viewParts/indentGuides +/users/foo/src/vs/editor/browser/viewParts/indentGuides/indentGuides.css +/users/foo/src/vs/editor/browser/viewParts/indentGuides/indentGuides.ts +/users/foo/src/vs/editor/browser/viewParts/currentLineMarginHighlight +/users/foo/src/vs/editor/browser/viewParts/currentLineMarginHighlight/currentLineMarginHighlight.ts +/users/foo/src/vs/editor/browser/viewParts/currentLineMarginHighlight/currentLineMarginHighlight.css +/users/foo/src/vs/editor/browser/viewParts/contentWidgets +/users/foo/src/vs/editor/browser/viewParts/contentWidgets/contentWidgets.ts +/users/foo/src/vs/editor/browser/viewParts/margin +/users/foo/src/vs/editor/browser/viewParts/margin/margin.ts +/users/foo/src/vs/editor/browser/viewParts/overviewRuler +/users/foo/src/vs/editor/browser/viewParts/overviewRuler/overviewRuler.ts +/users/foo/src/vs/editor/browser/viewParts/overviewRuler/decorationsOverviewRuler.ts +/users/foo/src/vs/editor/browser/viewParts/glyphMargin +/users/foo/src/vs/editor/browser/viewParts/glyphMargin/glyphMargin.ts +/users/foo/src/vs/editor/browser/viewParts/glyphMargin/glyphMargin.css +/users/foo/src/vs/editor/browser/viewParts/lines +/users/foo/src/vs/editor/browser/viewParts/lines/viewLine.ts +/users/foo/src/vs/editor/browser/viewParts/lines/viewLines.ts +/users/foo/src/vs/editor/browser/viewParts/lines/rangeUtil.ts +/users/foo/src/vs/editor/browser/viewParts/lines/viewLines.css +/users/foo/src/vs/editor/browser/viewParts/marginDecorations +/users/foo/src/vs/editor/browser/viewParts/marginDecorations/marginDecorations.ts +/users/foo/src/vs/editor/browser/viewParts/marginDecorations/marginDecorations.css +/users/foo/src/vs/editor/browser/viewParts/rulers +/users/foo/src/vs/editor/browser/viewParts/rulers/rulers.ts +/users/foo/src/vs/editor/browser/viewParts/rulers/rulers.css +/users/foo/src/vs/editor/browser/core +/users/foo/src/vs/editor/browser/core/editorState.ts +/users/foo/src/vs/editor/browser/widget +/users/foo/src/vs/editor/browser/widget/embeddedCodeEditorWidget.ts +/users/foo/src/vs/editor/browser/widget/codeEditorWidget.ts +/users/foo/src/vs/editor/browser/widget/diffReview.ts +/users/foo/src/vs/editor/browser/widget/diffEditorWidget.ts +/users/foo/src/vs/editor/browser/widget/diffNavigator.ts +/users/foo/src/vs/editor/browser/widget/media +/users/foo/src/vs/editor/browser/widget/media/editor.css +/users/foo/src/vs/editor/browser/widget/media/diffEditor.css +/users/foo/src/vs/editor/browser/widget/media/close-inverse.svg +/users/foo/src/vs/editor/browser/widget/media/tokens.css +/users/foo/src/vs/editor/browser/widget/media/diffReview.css +/users/foo/src/vs/editor/browser/widget/media/close.svg +/users/foo/src/vs/editor/browser/widget/media/deletion-inverse.svg +/users/foo/src/vs/editor/browser/widget/media/deletion.svg +/users/foo/src/vs/editor/browser/widget/media/addition-inverse.svg +/users/foo/src/vs/editor/browser/widget/media/addition.svg +/users/foo/src/vs/editor/browser/widget/media/diagonal-fill.png +/users/foo/src/vs/editor/browser/config +/users/foo/src/vs/editor/browser/config/elementSizeObserver.ts +/users/foo/src/vs/editor/browser/config/charWidthReader.ts +/users/foo/src/vs/editor/browser/config/configuration.ts +/users/foo/src/vs/editor/browser/editorExtensions.ts +/users/foo/src/vs/editor/browser/controller +/users/foo/src/vs/editor/browser/controller/textAreaState.ts +/users/foo/src/vs/editor/browser/controller/mouseHandler.ts +/users/foo/src/vs/editor/browser/controller/textAreaInput.ts +/users/foo/src/vs/editor/browser/controller/coreCommands.ts +/users/foo/src/vs/editor/browser/controller/mouseTarget.ts +/users/foo/src/vs/editor/browser/controller/pointerHandler.ts +/users/foo/src/vs/editor/browser/controller/textAreaHandler.ts +/users/foo/src/vs/editor/browser/controller/textAreaHandler.css +/users/foo/src/vs/editor/browser/editorDom.ts +/users/foo/src/vs/editor/browser/view +/users/foo/src/vs/editor/browser/view/viewOverlays.ts +/users/foo/src/vs/editor/browser/view/viewController.ts +/users/foo/src/vs/editor/browser/view/viewLayer.ts +/users/foo/src/vs/editor/browser/view/dynamicViewOverlay.ts +/users/foo/src/vs/editor/browser/view/viewOutgoingEvents.ts +/users/foo/src/vs/editor/browser/view/viewPart.ts +/users/foo/src/vs/editor/browser/view/viewImpl.ts +/users/foo/src/vs/editor/browser/editorBrowser.ts +/users/foo/src/vs/editor/browser/services +/users/foo/src/vs/editor/browser/services/abstractCodeEditorService.ts +/users/foo/src/vs/editor/browser/services/bulkEditService.ts +/users/foo/src/vs/editor/browser/services/codeEditorServiceImpl.ts +/users/foo/src/vs/editor/browser/services/codeEditorService.ts +/users/foo/src/vs/editor/common +/users/foo/src/vs/editor/common/viewModel +/users/foo/src/vs/editor/common/viewModel/characterHardWrappingLineMapper.ts +/users/foo/src/vs/editor/common/viewModel/viewModelDecorations.ts +/users/foo/src/vs/editor/common/viewModel/splitLinesCollection.ts +/users/foo/src/vs/editor/common/viewModel/prefixSumComputer.ts +/users/foo/src/vs/editor/common/viewModel/viewModel.ts +/users/foo/src/vs/editor/common/viewModel/viewModelImpl.ts +/users/foo/src/vs/editor/common/viewModel/viewEventHandler.ts +/users/foo/src/vs/editor/common/core +/users/foo/src/vs/editor/common/core/stringBuilder.ts +/users/foo/src/vs/editor/common/core/uint.ts +/users/foo/src/vs/editor/common/core/lineTokens.ts +/users/foo/src/vs/editor/common/core/selection.ts +/users/foo/src/vs/editor/common/core/position.ts +/users/foo/src/vs/editor/common/core/editOperation.ts +/users/foo/src/vs/editor/common/core/range.ts +/users/foo/src/vs/editor/common/core/characterClassifier.ts +/users/foo/src/vs/editor/common/core/token.ts +/users/foo/src/vs/editor/common/core/rgba.ts +/users/foo/src/vs/editor/common/modes +/users/foo/src/vs/editor/common/modes/languageConfiguration.ts +/users/foo/src/vs/editor/common/modes/supports +/users/foo/src/vs/editor/common/modes/supports/electricCharacter.ts +/users/foo/src/vs/editor/common/modes/supports/inplaceReplaceSupport.ts +/users/foo/src/vs/editor/common/modes/supports/characterPair.ts +/users/foo/src/vs/editor/common/modes/supports/onEnter.ts +/users/foo/src/vs/editor/common/modes/supports/indentRules.ts +/users/foo/src/vs/editor/common/modes/supports/richEditBrackets.ts +/users/foo/src/vs/editor/common/modes/supports/tokenization.ts +/users/foo/src/vs/editor/common/modes/textToHtmlTokenizer.ts +/users/foo/src/vs/editor/common/modes/languageConfigurationRegistry.ts +/users/foo/src/vs/editor/common/modes/modesRegistry.ts +/users/foo/src/vs/editor/common/modes/supports.ts +/users/foo/src/vs/editor/common/modes/tokenizationRegistry.ts +/users/foo/src/vs/editor/common/modes/nullMode.ts +/users/foo/src/vs/editor/common/modes/linkComputer.ts +/users/foo/src/vs/editor/common/modes/abstractMode.ts +/users/foo/src/vs/editor/common/modes/languageSelector.ts +/users/foo/src/vs/editor/common/modes/languageFeatureRegistry.ts +/users/foo/src/vs/editor/common/viewLayout +/users/foo/src/vs/editor/common/viewLayout/viewLineRenderer.ts +/users/foo/src/vs/editor/common/viewLayout/lineDecorations.ts +/users/foo/src/vs/editor/common/viewLayout/viewLayout.ts +/users/foo/src/vs/editor/common/viewLayout/linesLayout.ts +/users/foo/src/vs/editor/common/viewLayout/whitespaceComputer.ts +/users/foo/src/vs/editor/common/viewLayout/viewLinesViewportData.ts +/users/foo/src/vs/editor/common/standalone +/users/foo/src/vs/editor/common/standalone/standaloneBase.ts +/users/foo/src/vs/editor/common/config +/users/foo/src/vs/editor/common/config/editorOptions.ts +/users/foo/src/vs/editor/common/config/editorZoom.ts +/users/foo/src/vs/editor/common/config/commonEditorConfig.ts +/users/foo/src/vs/editor/common/config/fontInfo.ts +/users/foo/src/vs/editor/common/editorAction.ts +/users/foo/src/vs/editor/common/editorContextKeys.ts +/users/foo/src/vs/editor/common/diff +/users/foo/src/vs/editor/common/diff/diffComputer.ts +/users/foo/src/vs/editor/common/model.ts +/users/foo/src/vs/editor/common/controller +/users/foo/src/vs/editor/common/controller/cursorCollection.ts +/users/foo/src/vs/editor/common/controller/cursor.ts +/users/foo/src/vs/editor/common/controller/cursorDeleteOperations.ts +/users/foo/src/vs/editor/common/controller/cursorWordOperations.ts +/users/foo/src/vs/editor/common/controller/cursorMoveOperations.ts +/users/foo/src/vs/editor/common/controller/cursorCommon.ts +/users/foo/src/vs/editor/common/controller/wordCharacterClassifier.ts +/users/foo/src/vs/editor/common/controller/oneCursor.ts +/users/foo/src/vs/editor/common/controller/cursorTypeOperations.ts +/users/foo/src/vs/editor/common/controller/cursorColumnSelection.ts +/users/foo/src/vs/editor/common/controller/cursorMoveCommands.ts +/users/foo/src/vs/editor/common/controller/cursorEvents.ts +/users/foo/src/vs/editor/common/modes.ts +/users/foo/src/vs/editor/common/model +/users/foo/src/vs/editor/common/model/wordHelper.ts +/users/foo/src/vs/editor/common/model/textModelSearch.ts +/users/foo/src/vs/editor/common/model/editStack.ts +/users/foo/src/vs/editor/common/model/indentationGuesser.ts +/users/foo/src/vs/editor/common/model/textModelTokens.ts +/users/foo/src/vs/editor/common/model/textModelEvents.ts +/users/foo/src/vs/editor/common/model/textModel.ts +/users/foo/src/vs/editor/common/model/pieceTreeTextBuffer +/users/foo/src/vs/editor/common/model/pieceTreeTextBuffer/pieceTreeTextBufferBuilder.ts +/users/foo/src/vs/editor/common/model/pieceTreeTextBuffer/pieceTreeTextBuffer.ts +/users/foo/src/vs/editor/common/model/pieceTreeTextBuffer/rbTreeBase.ts +/users/foo/src/vs/editor/common/model/pieceTreeTextBuffer/pieceTreeBase.ts +/users/foo/src/vs/editor/common/model/mirrorTextModel.ts +/users/foo/src/vs/editor/common/model/intervalTree.ts +/users/foo/src/vs/editor/common/view +/users/foo/src/vs/editor/common/view/renderingContext.ts +/users/foo/src/vs/editor/common/view/minimapCharRenderer.ts +/users/foo/src/vs/editor/common/view/viewContext.ts +/users/foo/src/vs/editor/common/view/viewEventDispatcher.ts +/users/foo/src/vs/editor/common/view/viewEvents.ts +/users/foo/src/vs/editor/common/view/runtimeMinimapCharRenderer.ts +/users/foo/src/vs/editor/common/view/overviewZoneManager.ts +/users/foo/src/vs/editor/common/view/editorColorRegistry.ts +/users/foo/src/vs/editor/common/editorCommon.ts +/users/foo/src/vs/editor/common/commands +/users/foo/src/vs/editor/common/commands/surroundSelectionCommand.ts +/users/foo/src/vs/editor/common/commands/replaceCommand.ts +/users/foo/src/vs/editor/common/commands/trimTrailingWhitespaceCommand.ts +/users/foo/src/vs/editor/common/commands/shiftCommand.ts +/users/foo/src/vs/editor/common/services +/users/foo/src/vs/editor/common/services/modelService.ts +/users/foo/src/vs/editor/common/services/resourceConfigurationImpl.ts +/users/foo/src/vs/editor/common/services/modeServiceImpl.ts +/users/foo/src/vs/editor/common/services/modelServiceImpl.ts +/users/foo/src/vs/editor/common/services/editorWorkerServiceImpl.ts +/users/foo/src/vs/editor/common/services/resourceConfiguration.ts +/users/foo/src/vs/editor/common/services/languagesRegistry.ts +/users/foo/src/vs/editor/common/services/webWorker.ts +/users/foo/src/vs/editor/common/services/resolverService.ts +/users/foo/src/vs/editor/common/services/modeService.ts +/users/foo/src/vs/editor/common/services/editorSimpleWorker.ts +/users/foo/src/vs/editor/common/services/editorWorkerService.ts +/users/foo/src/vs/editor/editor.all.ts +/users/foo/src/vs/editor/editor.main.ts +/users/foo/src/vs/loader.js +/users/foo/src/.DS_Store +/users/foo/src/bootstrap.js +/users/foo/src/typings +/users/foo/src/typings/vscode-nsfw.d.ts +/users/foo/src/typings/fast-plist.d.ts +/users/foo/src/typings/sudo-prompt.d.ts +/users/foo/src/typings/native-watchdog.d.ts +/users/foo/src/typings/graceful-fs.d.ts +/users/foo/src/typings/mocha.d.ts +/users/foo/src/typings/node.processEnv-ext.d.ts +/users/foo/src/typings/keytar.d.ts +/users/foo/src/typings/v8-inspect-profiler.d.ts +/users/foo/src/typings/ansi-regex.d.ts +/users/foo/src/typings/yauzl.d.ts +/users/foo/src/typings/jschardet.d.ts +/users/foo/src/typings/lib.ie11_safe_es6.d.ts +/users/foo/src/typings/semver.d.ts +/users/foo/src/typings/node-pty.d.ts +/users/foo/src/typings/native-keymap.d.ts +/users/foo/src/typings/electron.d.ts +/users/foo/src/typings/https-proxy-agent.d.ts +/users/foo/src/typings/lib.array-ext.d.ts +/users/foo/src/typings/spdlog.d.ts +/users/foo/src/typings/applicationInsights.d.ts +/users/foo/src/typings/iconv-lite.d.ts +/users/foo/src/typings/require.d.ts +/users/foo/src/typings/http-proxy-agent.d.ts +/users/foo/src/typings/OSSREADME.json +/users/foo/src/typings/chokidar.d.ts +/users/foo/src/typings/vscode-textmate.d.ts +/users/foo/src/typings/sinon.d.ts +/users/foo/src/typings/es6-promise.d.ts +/users/foo/src/typings/getmac.d.ts +/users/foo/src/typings/thenable.d.ts +/users/foo/src/typings/windows-mutex.d.ts +/users/foo/src/typings/native-is-elevated.d.ts +/users/foo/src/typings/vscode-ripgrep.d.ts +/users/foo/src/typings/minimist.d.ts +/users/foo/src/typings/node.d.ts +/users/foo/src/typings/gc-signals.d.ts +/users/foo/src/typings/windows-foreground-love.d.ts +/users/foo/src/typings/windows-process-tree.d.ts +/users/foo/src/typings/vscode-xterm.d.ts +/users/foo/src/.eslintrc +/users/foo/src/paths.js +/users/foo/src/main.js +/users/foo/src/tsconfig.monaco.json +/users/foo/src/bootstrap-amd.js +/users/foo/src/tsconfig.json +/users/foo/src/cli.js +/users/foo/src/buildfile.js diff --git a/src/vs/base/test/node/uri.test.perf.ts b/src/vs/base/test/node/uri.test.perf.ts new file mode 100644 index 0000000000..5a0839743e --- /dev/null +++ b/src/vs/base/test/node/uri.test.perf.ts @@ -0,0 +1,61 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the Source EULA. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +'use strict'; + +import * as assert from 'assert'; +import URI from 'vs/base/common/uri'; +import { readFileSync } from 'fs'; + +suite('URI - perf', function () { + + let manyFileUris: URI[]; + setup(function () { + manyFileUris = []; + let data = readFileSync(URI.parse(require.toUrl('./uri.test.data.txt')).fsPath).toString(); + let lines = data.split('\n'); + for (let line of lines) { + manyFileUris.push(URI.file(line)); + } + }); + + function perfTest(name: string, callback: Function) { + test(name, _done => { + let t1 = Date.now(); + callback(); + let d = Date.now() - t1; + console.log(`${name} took ${d}ms (${(d / manyFileUris.length).toPrecision(3)} ms/uri)`); + _done(); + }); + } + + perfTest('toString', function () { + for (const uri of manyFileUris) { + let data = uri.toString(); + assert.ok(data); + } + }); + + perfTest('toString(skipEncoding)', function () { + for (const uri of manyFileUris) { + let data = uri.toString(true); + assert.ok(data); + } + }); + + perfTest('fsPath', function () { + for (const uri of manyFileUris) { + let data = uri.fsPath; + assert.ok(data); + } + }); + + perfTest('toJSON', function () { + for (const uri of manyFileUris) { + let data = uri.toJSON(); + assert.ok(data); + } + }); + +}); diff --git a/src/vs/base/test/node/zip/zip.test.ts b/src/vs/base/test/node/zip/zip.test.ts index b6c9b8acbe..da84c9b6ad 100644 --- a/src/vs/base/test/node/zip/zip.test.ts +++ b/src/vs/base/test/node/zip/zip.test.ts @@ -12,7 +12,7 @@ import URI from 'vs/base/common/uri'; import { extract } from 'vs/base/node/zip'; import { generateUuid } from 'vs/base/common/uuid'; import { rimraf, exists } from 'vs/base/node/pfs'; -import { NullLogService } from '../../../../platform/log/common/log'; +import { NullLogService } from 'vs/platform/log/common/log'; const fixtures = URI.parse(require.toUrl('./fixtures')).fsPath; diff --git a/src/vs/code/electron-browser/issue/issueReporter.js b/src/vs/code/electron-browser/issue/issueReporter.js index d80ee545a2..8b643e2cc6 100644 --- a/src/vs/code/electron-browser/issue/issueReporter.js +++ b/src/vs/code/electron-browser/issue/issueReporter.js @@ -45,6 +45,8 @@ function readFile(file) { }); } +const writeFile = (file, content) => new Promise((c, e) => fs.writeFile(file, content, 'utf8', err => err ? e(err) : c())); + function main() { const args = parseURLQueryArgs(); const configuration = JSON.parse(args['config'] || '{}') || {}; @@ -127,8 +129,15 @@ function main() { let json = JSON.parse(content); bundles[bundle] = json; cb(undefined, json); - }) - .catch(cb); + }).catch((error) => { + try { + if (nlsConfig._corruptedFile) { + writeFile(nlsConfig._corruptedFile, 'corrupted').catch(function (error) { console.error(error); }); + } + } finally { + cb(error, undefined); + } + }); }; } diff --git a/src/vs/code/electron-browser/issue/issueReporterMain.ts b/src/vs/code/electron-browser/issue/issueReporterMain.ts index d4e93e567d..c49d8840ed 100644 --- a/src/vs/code/electron-browser/issue/issueReporterMain.ts +++ b/src/vs/code/electron-browser/issue/issueReporterMain.ts @@ -23,7 +23,7 @@ import { getDelayedChannel } from 'vs/base/parts/ipc/common/ipc'; import { connect as connectNet } from 'vs/base/parts/ipc/node/ipc.net'; import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection'; import { IWindowConfiguration, IWindowsService } from 'vs/platform/windows/common/windows'; -import { NullTelemetryService } from 'vs/platform/telemetry/common/telemetryUtils'; +import { NullTelemetryService, combinedAppender, LogAppender } from 'vs/platform/telemetry/common/telemetryUtils'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { ITelemetryServiceConfig, TelemetryService } from 'vs/platform/telemetry/common/telemetryService'; import { ITelemetryAppenderChannel, TelemetryAppenderClient } from 'vs/platform/telemetry/common/telemetryIpc'; @@ -40,7 +40,8 @@ import { createSpdLogService } from 'vs/platform/log/node/spdlogService'; import { LogLevelSetterChannelClient, FollowerLogService } from 'vs/platform/log/common/logIpc'; import { ILogService, getLogLevel } from 'vs/platform/log/common/log'; import { OcticonLabel } from 'vs/base/browser/ui/octiconLabel/octiconLabel'; -import { normalizeGitHubIssuesUrl } from 'vs/code/electron-browser/issue/issueReporterUtil'; +import { normalizeGitHubUrl } from 'vs/code/electron-browser/issue/issueReporterUtil'; +import { Button } from 'vs/base/browser/ui/button/button'; const MAX_URL_LENGTH = platform.isWindows ? 2081 : 5400; @@ -72,6 +73,8 @@ export class IssueReporter extends Disposable { private receivedPerformanceInfo = false; private shouldQueueSearch = false; + private previewButton: Button; + constructor(configuration: IssueReporterConfiguration) { super(); @@ -83,9 +86,11 @@ export class IssueReporter extends Disposable { vscodeVersion: `${pkg.name} ${pkg.version} (${product.commit || 'Commit unknown'}, ${product.date || 'Date unknown'})`, os: `${os.type()} ${os.arch()} ${os.release()}` }, - extensionsDisabled: this.environmentService.disableExtensions, + extensionsDisabled: !!this.environmentService.disableExtensions, }); + this.previewButton = new Button(document.getElementById('issue-reporter')); + ipcRenderer.on('issuePerformanceInfoResponse', (event, info) => { this.logService.trace('issueReporter: Received performance data'); this.issueReporterModel.update(info); @@ -145,7 +150,7 @@ export class IssueReporter extends Disposable { const content: string[] = []; if (styles.inputBackground) { - content.push(`input[type="text"], textarea, select, .issues-container > .issue > .issue-state { background-color: ${styles.inputBackground}; }`); + content.push(`input[type="text"], textarea, select, .issues-container > .issue > .issue-state, .block-info { background-color: ${styles.inputBackground}; }`); } if (styles.inputBorder) { @@ -155,7 +160,7 @@ export class IssueReporter extends Disposable { } if (styles.inputForeground) { - content.push(`input[type="text"], textarea, select, .issues-container > .issue > .issue-state { color: ${styles.inputForeground}; }`); + content.push(`input[type="text"], textarea, select, .issues-container > .issue > .issue-state, .block-info { color: ${styles.inputForeground}; }`); } if (styles.inputErrorBorder) { @@ -171,22 +176,14 @@ export class IssueReporter extends Disposable { content.push(`a, .workbenchCommand { color: ${styles.textLinkColor}; }`); } - if (styles.buttonBackground) { - content.push(`button { background-color: ${styles.buttonBackground}; }`); - } - - if (styles.buttonForeground) { - content.push(`button { color: ${styles.buttonForeground}; }`); - } - - if (styles.buttonHoverBackground) { - content.push(`#github-submit-btn:hover:enabled, #github-submit-btn:focus:enabled { background-color: ${styles.buttonHoverBackground}; }`); - } - if (styles.textLinkColor) { content.push(`a { color: ${styles.textLinkColor}; }`); } + if (styles.textLinkActiveForeground) { + content.push(`a:hover, .workbenchCommand:hover { color: ${styles.textLinkActiveForeground}; }`); + } + if (styles.sliderBackgroundColor) { content.push(`::-webkit-scrollbar-thumb { background-color: ${styles.sliderBackgroundColor}; }`); } @@ -199,6 +196,18 @@ export class IssueReporter extends Disposable { content.push(`::--webkit-scrollbar-thumb:hover { background-color: ${styles.sliderHoverColor}; }`); } + if (styles.buttonBackground) { + content.push(`.monaco-text-button { background-color: ${styles.buttonBackground} !important; }`); + } + + if (styles.buttonForeground) { + content.push(`.monaco-text-button { color: ${styles.buttonForeground} !important; }`); + } + + if (styles.buttonHoverBackground) { + content.push(`.monaco-text-button:hover, .monaco-text-button:focus { background-color: ${styles.buttonHoverBackground} !important; }`); + } + styleTag.innerHTML = content.join('\n'); document.head.appendChild(styleTag); document.body.style.color = styles.color; @@ -278,9 +287,9 @@ export class IssueReporter extends Disposable { .then(() => connectNet(this.environmentService.sharedIPCHandle, `window:${configuration.windowId}`)); const instantiationService = new InstantiationService(serviceCollection, true); - if (this.environmentService.isBuilt && !this.environmentService.isExtensionDevelopment && !this.environmentService.args['disable-telemetry'] && !!product.enableTelemetry) { + if (!this.environmentService.isExtensionDevelopment && !this.environmentService.args['disable-telemetry'] && !!product.enableTelemetry) { const channel = getDelayedChannel(sharedProcess.then(c => c.getChannel('telemetryAppender'))); - const appender = new TelemetryAppenderClient(channel); + const appender = combinedAppender(new TelemetryAppenderClient(channel), new LogAppender(logService)); const commonProperties = resolveCommonProperties(product.commit, pkg.version, configuration.machineId, this.environmentService.installSourcePath); const piiPaths = [this.environmentService.appRoot, this.environmentService.extensionsPath]; const config: ITelemetryServiceConfig = { appender, commonProperties, piiPaths }; @@ -312,20 +321,20 @@ export class IssueReporter extends Disposable { }); }); - const labelElements = document.getElementsByClassName('caption'); - for (let i = 0; i < labelElements.length; i++) { - const label = labelElements.item(i); - label.addEventListener('click', (e) => { - e.stopPropagation(); - - // Stop propgagation not working as expected in this case https://bugs.chromium.org/p/chromium/issues/detail?id=809801 - // preventDefault does prevent outer details tag from toggling, so use that and manually toggle the checkbox + const showInfoElements = document.getElementsByClassName('showInfo'); + for (let i = 0; i < showInfoElements.length; i++) { + const showInfo = showInfoElements.item(i); + showInfo.addEventListener('click', (e) => { e.preventDefault(); - const containingDiv = (e.target).parentElement; - const checkbox = containingDiv.firstElementChild; - if (checkbox) { - checkbox.checked = !checkbox.checked; - this.issueReporterModel.update({ [checkbox.id]: !this.issueReporterModel.getData()[checkbox.id] }); + const label = (e.target); + const containingElement = label.parentElement.parentElement; + const info = containingElement.lastElementChild; + if (info.classList.contains('hidden')) { + show(info); + label.textContent = localize('hide', "hide"); + } else { + hide(info); + label.textContent = localize('show', "show"); } }); } @@ -372,7 +381,7 @@ export class IssueReporter extends Disposable { } }); - this.addEventListener('github-submit-btn', 'click', () => this.createIssue()); + this.previewButton.onDidClick(() => this.createIssue()); this.addEventListener('disableExtensions', 'click', () => { ipcRenderer.send('workbenchCommand', 'workbench.action.reloadWindowWithExtensionsDisabled'); @@ -404,17 +413,26 @@ export class IssueReporter extends Disposable { if (cmdOrCtrlKey && e.keyCode === 189) { this.applyZoom(webFrame.getZoomLevel() - 1); } + + // With latest electron upgrade, cmd+a is no longer propagating correctly for inputs in this window on mac + // Manually perform the selection + if (platform.isMacintosh) { + if (cmdOrCtrlKey && e.keyCode === 65 && e.target) { + if (e.target instanceof HTMLInputElement || e.target instanceof HTMLTextAreaElement) { + (e.target).select(); + } + } + } }; } private updatePreviewButtonState() { - const submitButton = document.getElementById('github-submit-btn'); if (this.isPreviewEnabled()) { - submitButton.disabled = false; - submitButton.textContent = localize('previewOnGitHub', "Preview on GitHub"); + this.previewButton.label = localize('previewOnGitHub', "Preview on GitHub"); + this.previewButton.enabled = true; } else { - submitButton.disabled = true; - submitButton.textContent = localize('loadingData', "Loading data..."); + this.previewButton.enabled = false; + this.previewButton.label = localize('loadingData', "Loading data..."); } } @@ -458,13 +476,20 @@ export class IssueReporter extends Disposable { } private searchExtensionIssues(title: string): void { - const url = this.getExtensionRepositoryUrl(); + const url = this.getExtensionGitHubUrl(); if (title) { - const matches = /^https?:\/\/github\.com\/(.*)(?:.git)/.exec(url); + const matches = /^https?:\/\/github\.com\/(.*)/.exec(url); if (matches && matches.length) { const repo = matches[1]; return this.searchGitHub(repo, title); } + + // If the extension has no repository, display empty search results + if (this.issueReporterModel.getData().selectedExtension) { + this.clearSearchResults(); + return this.displaySearchResults([]); + + } } this.clearSearchResults(); @@ -734,6 +759,12 @@ export class IssueReporter extends Disposable { this.validateInput('description'); }); + if (this.issueReporterModel.fileOnExtension()) { + document.getElementById('extension-selector').addEventListener('change', (event) => { + this.validateInput('extension-selector'); + }); + } + return false; } @@ -758,16 +789,26 @@ export class IssueReporter extends Disposable { return true; } + private getExtensionGitHubUrl(): string { + let repositoryUrl = ''; + const bugsUrl = this.getExtensionBugsUrl(); + const extensionUrl = this.getExtensionRepositoryUrl(); + // If given, try to match the extension's bug url + if (bugsUrl && bugsUrl.match(/^https?:\/\/github\.com\/(.*)/)) { + repositoryUrl = normalizeGitHubUrl(bugsUrl); + } else if (extensionUrl && extensionUrl.match(/^https?:\/\/github\.com\/(.*)/)) { + repositoryUrl = normalizeGitHubUrl(extensionUrl); + } + + return repositoryUrl; + } + private getIssueUrlWithTitle(issueTitle: string): string { let repositoryUrl = product.reportIssueUrl; if (this.issueReporterModel.fileOnExtension()) { - const bugsUrl = this.getExtensionBugsUrl(); - const extensionUrl = this.getExtensionRepositoryUrl(); - // If given, try to match the extension's bug url - if (bugsUrl && bugsUrl.match(/^https?:\/\/github\.com\/(.*)/)) { - repositoryUrl = normalizeGitHubIssuesUrl(bugsUrl); - } else if (extensionUrl && extensionUrl.match(/^https?:\/\/github\.com\/(.*)/)) { - repositoryUrl = normalizeGitHubIssuesUrl(extensionUrl); + const extensionGitHubUrl = this.getExtensionGitHubUrl(); + if (extensionGitHubUrl) { + repositoryUrl = extensionGitHubUrl + '/issues/new'; } } diff --git a/src/vs/code/electron-browser/issue/issueReporterPage.ts b/src/vs/code/electron-browser/issue/issueReporterPage.ts index ee09c136b8..b08bcd9ec2 100644 --- a/src/vs/code/electron-browser/issue/issueReporterPage.ts +++ b/src/vs/code/electron-browser/issue/issueReporterPage.ts @@ -49,89 +49,6 @@ export default (): string => `

    -
    -
    -
    - ${escape(localize('systemInfo', "My System Info"))} -
    - - -
    -
    -
    - -
    -
    -
    -
    -
    - ${escape(localize('processes', "Currently Running Processes"))} -
    - - -
    -
    -
    -					
    -				
    -
    -
    -
    -
    - ${escape(localize('workspaceStats', "My Workspace Stats"))} -
    - - -
    -
    -
    -					
    -						
    -					
    -				
    -
    -
    -
    -
    - ${escape(localize('extensions', "My Extensions"))} -
    - - -
    -
    -
    - -
    -
    -
    -
    -
    - ${escape(localize('searchedExtensions', "Searched Extensions"))} -
    - - -
    -
    -
    - -
    -
    -
    -
    -
    - ${escape(localize('settingsSearchDetails', "Settings Search Details"))} -
    - - -
    -
    -
    - -
    -
    -
    -
    -
    - +
    + +
    + + + +
    +
    + + + +
    +
    + + + +
    +
    + + + +
    +
    + + + +
    +
    `; \ No newline at end of file diff --git a/src/vs/code/electron-browser/issue/issueReporterUtil.ts b/src/vs/code/electron-browser/issue/issueReporterUtil.ts index 165f2104a5..d85244e3d8 100644 --- a/src/vs/code/electron-browser/issue/issueReporterUtil.ts +++ b/src/vs/code/electron-browser/issue/issueReporterUtil.ts @@ -7,7 +7,7 @@ import { endsWith, rtrim } from 'vs/base/common/strings'; -export function normalizeGitHubIssuesUrl(url: string): string { +export function normalizeGitHubUrl(url: string): string { // If the url has a .git suffix, remove it if (endsWith(url, '.git')) { url = url.substr(0, url.length - 4); @@ -16,15 +16,13 @@ export function normalizeGitHubIssuesUrl(url: string): string { // Remove trailing slash url = rtrim(url, '/'); - // If the url already ends with issues/new, it's beautiful, return it - if (endsWith(url, 'issues/new')) { - return url; + if (endsWith(url, '/new')) { + url = rtrim(url, '/new'); } - // Add new segment if it does not exist - if (endsWith(url, 'issues')) { - return url + '/new'; + if (endsWith(url, '/issues')) { + url = rtrim(url, '/issues'); } - return url + '/issues/new'; + return url; } \ No newline at end of file diff --git a/src/vs/code/electron-browser/issue/media/issueReporter.css b/src/vs/code/electron-browser/issue/media/issueReporter.css index dafc9c6471..fb83f35387 100644 --- a/src/vs/code/electron-browser/issue/media/issueReporter.css +++ b/src/vs/code/electron-browser/issue/media/issueReporter.css @@ -10,18 +10,17 @@ table { width: 100%; max-width: 100%; - margin-bottom: 1rem; background-color: transparent; border-collapse: collapse; } th { vertical-align: bottom; - border-bottom: 2px solid #e9ecef; - padding: .75rem; + border-bottom: 1px solid; + padding: 5px; text-align: inherit; } td { - padding: .75rem; + padding: 5px; vertical-align: top; } @@ -48,7 +47,6 @@ input[type="text"], textarea { line-height: 1.5; color: #495057; background-color: #fff; - border-radius: .25rem; border: 1px solid #ced4da; } @@ -60,19 +58,13 @@ textarea { /** * Button */ -button { - display: inline-block; - font-weight: 400; - line-height: 1.25; - text-align: center; - white-space: nowrap; - vertical-align: middle; - user-select: none; - padding: .5rem 1rem; - font-size: 1rem; - border-radius: .25rem; - background: none; - border: 1px solid transparent; + +.monaco-text-button { + display: block; + width: auto; + padding: 4px 10px; + align-self: flex-end; + margin-bottom: 10px; } select { @@ -83,7 +75,6 @@ select { line-height: 1.5; color: #495057; background-color: #fff; - border-radius: 0.25rem; border: none; } @@ -103,7 +94,7 @@ html { body { margin: 0; - overflow: scroll; + overflow-y: scroll; height: 100%; } @@ -111,26 +102,22 @@ body { display: none; } +.block { + font-size: 12px; +} + .block .block-info { width: 100%; - font-family: 'Menlo', 'Courier New', 'Courier', monospace; + font-family: Monaco, Menlo, Consolas, "Droid Sans Mono", "Inconsolata", "Courier New", monospace, "Droid Sans Fallback"; font-size: 12px; overflow: auto; overflow-wrap: break-word; + margin: 5px; + padding: 10px; } -pre { - margin: 10px 20px; -} + pre code { - font-family: 'Menlo', 'Courier New', 'Courier', monospace; -} - -button:hover:enabled { - cursor: pointer; -} - -button:disabled { - cursor: auto; + font-family: Monaco, Menlo, Consolas, "Droid Sans Mono", "Inconsolata", "Courier New", monospace, "Droid Sans Fallback"; } #issue-reporter { @@ -138,6 +125,7 @@ button:disabled { margin-left: auto; margin-right: auto; padding-top: 2em; + padding-bottom: 2em; display: flex; flex-direction: column; height: 100%; @@ -184,40 +172,17 @@ textarea { margin-top: 1em; } -.system-info { - margin-bottom: 1.25em; -} - select, input, textarea { border: 1px solid transparent; margin-top: 10px; } -summary { - border: 1px solid transparent; - padding: 0 10px; - margin-bottom: 5px; - cursor: pointer; -} .validation-error { font-size: 12px; margin-top: 1em; } -.include-data { - display: inline-block; -} - -.include-data > .caption { - display: inline-block; - font-size: 12px; - cursor: pointer; -} - -.sendData { - margin-left: 1em; -} input[type="checkbox"] { width: auto; @@ -238,7 +203,6 @@ input:disabled { .instructions { font-size: 12px; - margin-left: 1em; margin-top: .5em; } @@ -276,13 +240,8 @@ a { color: #be1100; } -button { - background-color: #007ACC; - color: #fff; -} - .section .input-group .validation-error { - margin-left: 13%; + margin-left: 15%; } .section .inline-form-control, .section .inline-label { @@ -302,17 +261,25 @@ button { } #similar-issues { - margin-left: 13%; + margin-left: 15%; display: block; } +#problem-source-help-text { + margin-left: calc(15% + 1em); +} + @media (max-width: 950px) { .section .inline-label { - width: 13%; + width: 15%; + } + + #problem-source-help-text { + margin-left: calc(15% + 1em); } .section .inline-form-control { - width: calc(87% - 5px); + width: calc(85% - 5px); } } @@ -321,6 +288,10 @@ button { display: none !important; } + #problem-source-help-text { + margin-left: 1em; + } + .section .inline-form-control { width: 100%; } diff --git a/src/vs/code/electron-browser/issue/test/testReporterModel.test.ts b/src/vs/code/electron-browser/issue/test/testReporterModel.test.ts index dbb2bdee0c..4b8ada7768 100644 --- a/src/vs/code/electron-browser/issue/test/testReporterModel.test.ts +++ b/src/vs/code/electron-browser/issue/test/testReporterModel.test.ts @@ -7,7 +7,7 @@ import * as assert from 'assert'; import { IssueReporterModel } from 'vs/code/electron-browser/issue/issueReporterModel'; -import { normalizeGitHubIssuesUrl } from 'vs/code/electron-browser/issue/issueReporterUtil'; +import { normalizeGitHubUrl } from 'vs/code/electron-browser/issue/issueReporterUtil'; import { IssueType } from 'vs/platform/issue/common/issue'; suite('IssueReporter', () => { @@ -81,7 +81,7 @@ OS version: undefined 'https://github.com/repo/issues/new', 'https://github.com/repo/issues/new/' ].forEach(url => { - assert.equal('https://github.com/repo/issues/new', normalizeGitHubIssuesUrl(url)); + assert.equal('https://github.com/repo', normalizeGitHubUrl(url)); }); }); diff --git a/src/vs/code/electron-browser/processExplorer/processExplorer.js b/src/vs/code/electron-browser/processExplorer/processExplorer.js index 94471fdd8f..b160d1086f 100644 --- a/src/vs/code/electron-browser/processExplorer/processExplorer.js +++ b/src/vs/code/electron-browser/processExplorer/processExplorer.js @@ -45,6 +45,8 @@ function readFile(file) { }); } +const writeFile = (file, content) => new Promise((c, e) => fs.writeFile(file, content, 'utf8', err => err ? e(err) : c())); + function main() { const args = parseURLQueryArgs(); const configuration = JSON.parse(args['config'] || '{}') || {}; @@ -102,8 +104,15 @@ function main() { let json = JSON.parse(content); bundles[bundle] = json; cb(undefined, json); - }) - .catch(cb); + }).catch((error) => { + try { + if (nlsConfig._corruptedFile) { + writeFile(nlsConfig._corruptedFile, 'corrupted').catch(function (error) { console.error(error); }); + } + } finally { + cb(error, undefined); + } + }); }; } diff --git a/src/vs/code/electron-browser/processExplorer/processExplorerMain.ts b/src/vs/code/electron-browser/processExplorer/processExplorerMain.ts index 042ed1846a..8309fbf177 100644 --- a/src/vs/code/electron-browser/processExplorer/processExplorerMain.ts +++ b/src/vs/code/electron-browser/processExplorer/processExplorerMain.ts @@ -7,7 +7,7 @@ import 'vs/css!./media/processExplorer'; import { listProcesses, ProcessItem } from 'vs/base/node/ps'; -import { remote, webFrame } from 'electron'; +import { remote, webFrame, ipcRenderer, clipboard } from 'electron'; import { repeat } from 'vs/base/common/strings'; import { totalmem } from 'os'; import product from 'vs/platform/node/product'; @@ -17,6 +17,7 @@ import * as browser from 'vs/base/browser/browser'; import * as platform from 'vs/base/common/platform'; let processList: any[]; +let mapPidToWindowTitle = new Map(); function getProcessList(rootProcess: ProcessItem) { const processes: any[] = []; @@ -33,8 +34,17 @@ function getProcessItem(processes: any[], item: ProcessItem, indent: number): vo const MB = 1024 * 1024; + let name = item.name; + if (isRoot) { + name = `${product.applicationName} main`; + } + + if (name === 'window') { + const windowTitle = mapPidToWindowTitle.get(item.pid); + name = windowTitle !== undefined ? `${name} (${mapPidToWindowTitle.get(item.pid)})` : name; + } + // Format name with indent - const name = isRoot ? `${product.applicationName} main` : item.name; const formattedName = isRoot ? name : `${repeat(' ', indent)} ${name}`; const memory = process.platform === 'win32' ? item.mem : (totalmem() * (item.mem / 100)); processes.push({ @@ -127,45 +137,88 @@ function applyZoom(zoomLevel: number): void { function showContextMenu(e) { e.preventDefault(); + const menu = new remote.Menu(); + const pid = parseInt(e.currentTarget.id); if (pid && typeof pid === 'number') { - const menu = new remote.Menu(); menu.append(new remote.MenuItem({ label: localize('killProcess', "Kill Process"), click() { process.kill(pid, 'SIGTERM'); } - }) - ); + })); menu.append(new remote.MenuItem({ label: localize('forceKillProcess', "Force Kill Process"), click() { process.kill(pid, 'SIGKILL'); } - }) - ); + })); - menu.popup(remote.getCurrentWindow()); + menu.append(new remote.MenuItem({ + type: 'separator' + })); + + menu.append(new remote.MenuItem({ + label: localize('copy', "Copy"), + click() { + const row = document.getElementById(pid.toString()); + if (row) { + clipboard.writeText(row.innerText); + } + } + })); + + menu.append(new remote.MenuItem({ + label: localize('copyAll', "Copy All"), + click() { + const processList = document.getElementById('process-list'); + if (processList) { + clipboard.writeText(processList.innerText); + } + } + })); + } else { + menu.append(new remote.MenuItem({ + label: localize('copyAll', "Copy All"), + click() { + const processList = document.getElementById('process-list'); + if (processList) { + clipboard.writeText(processList.innerText); + } + } + })); } + + menu.popup({ window: remote.getCurrentWindow() }); } export function startup(data: ProcessExplorerData): void { applyStyles(data.styles); applyZoom(data.zoomLevel); - setInterval(() => listProcesses(remote.process.pid).then(processes => { - processList = getProcessList(processes); - updateProcessInfo(processList); + // Map window process pids to titles, annotate process names with this when rendering to distinguish between them + ipcRenderer.on('windowsInfoResponse', (event, windows) => { + mapPidToWindowTitle = new Map(); + windows.forEach(window => mapPidToWindowTitle.set(window.pid, window.title)); + }); - const tableRows = document.getElementsByTagName('tr'); - for (let i = 0; i < tableRows.length; i++) { - const tableRow = tableRows[i]; - tableRow.addEventListener('contextmenu', (e) => { - showContextMenu(e); - }); - } - }), 1200); + setInterval(() => { + ipcRenderer.send('windowsInfoRequest'); + + listProcesses(remote.process.pid).then(processes => { + processList = getProcessList(processes); + updateProcessInfo(processList); + + const tableRows = document.getElementsByTagName('tr'); + for (let i = 0; i < tableRows.length; i++) { + const tableRow = tableRows[i]; + tableRow.addEventListener('contextmenu', (e) => { + showContextMenu(e); + }); + } + }); + }, 1200); document.onkeydown = (e: KeyboardEvent) => { diff --git a/src/vs/code/electron-browser/sharedProcess/contrib/languagePackCachedDataCleaner.ts b/src/vs/code/electron-browser/sharedProcess/contrib/languagePackCachedDataCleaner.ts index 0e4ab3bc7d..11f94622af 100644 --- a/src/vs/code/electron-browser/sharedProcess/contrib/languagePackCachedDataCleaner.ts +++ b/src/vs/code/electron-browser/sharedProcess/contrib/languagePackCachedDataCleaner.ts @@ -66,9 +66,13 @@ export class LanguagePackCachedDataCleaner { } // Cleanup entries for language packs that aren't installed anymore const cacheDir = path.join(this._environmentService.userDataPath, 'clp'); + let exists = await pfs.exists(cacheDir); + if (!exists) { + return; + } for (let entry of await pfs.readdir(cacheDir)) { if (installed[entry]) { - this._logService.info(`Skipping directory ${entry}. Language pack still in use`); + this._logService.info(`Skipping directory ${entry}. Language pack still in use.`); continue; } this._logService.info('Removing unused language pack:', entry); diff --git a/src/vs/code/electron-browser/sharedProcess/sharedProcess.js b/src/vs/code/electron-browser/sharedProcess/sharedProcess.js index fceb99296a..5f1a9f61de 100644 --- a/src/vs/code/electron-browser/sharedProcess/sharedProcess.js +++ b/src/vs/code/electron-browser/sharedProcess/sharedProcess.js @@ -53,6 +53,8 @@ function readFile(file) { }); } +const writeFile = (file, content) => new Promise((c, e) => fs.writeFile(file, content, 'utf8', err => err ? e(err) : c())); + function main() { const args = parseURLQueryArgs(); const configuration = JSON.parse(args['config'] || '{}') || {}; @@ -111,8 +113,15 @@ function main() { let json = JSON.parse(content); bundles[bundle] = json; cb(undefined, json); - }) - .catch(cb); + }).catch((error) => { + try { + if (nlsConfig._corruptedFile) { + writeFile(nlsConfig._corruptedFile, 'corrupted').catch(function (error) { console.error(error); }); + } + } finally { + cb(error, undefined); + } + }); }; } diff --git a/src/vs/code/electron-browser/sharedProcess/sharedProcessMain.ts b/src/vs/code/electron-browser/sharedProcess/sharedProcessMain.ts index d2df85cb04..c873782a95 100644 --- a/src/vs/code/electron-browser/sharedProcess/sharedProcessMain.ts +++ b/src/vs/code/electron-browser/sharedProcess/sharedProcessMain.ts @@ -25,7 +25,7 @@ import { ConfigurationService } from 'vs/platform/configuration/node/configurati import { IRequestService } from 'vs/platform/request/node/request'; import { RequestService } from 'vs/platform/request/electron-browser/requestService'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; -import { combinedAppender, NullTelemetryService } from 'vs/platform/telemetry/common/telemetryUtils'; +import { combinedAppender, NullTelemetryService, ITelemetryAppender, NullAppender, LogAppender } from 'vs/platform/telemetry/common/telemetryUtils'; import { resolveCommonProperties } from 'vs/platform/telemetry/node/commonProperties'; import { TelemetryAppenderChannel } from 'vs/platform/telemetry/common/telemetryIpc'; import { TelemetryService, ITelemetryServiceConfig } from 'vs/platform/telemetry/common/telemetryService'; @@ -42,6 +42,7 @@ import { ILocalizationsService } from 'vs/platform/localizations/common/localiza import { LocalizationsChannel } from 'vs/platform/localizations/common/localizationsIpc'; import { DialogChannelClient } from 'vs/platform/dialogs/common/dialogIpc'; import { IDialogService } from 'vs/platform/dialogs/common/dialogs'; +import { IDisposable, dispose } from 'vs/base/common/lifecycle'; export interface ISharedProcessConfiguration { readonly machineId: string; @@ -61,11 +62,14 @@ const eventPrefix = 'monacoworkbench'; function main(server: Server, initData: ISharedProcessInitData, configuration: ISharedProcessConfiguration): void { const services = new ServiceCollection(); + const disposables: IDisposable[] = []; + process.once('exit', () => dispose(disposables)); const environmentService = new EnvironmentService(initData.args, process.execPath); - const logLevelClient = new LogLevelSetterChannelClient(server.getChannel('loglevel', { route: () => 'main' })); + const mainRoute = () => TPromise.as('main'); + const logLevelClient = new LogLevelSetterChannelClient(server.getChannel('loglevel', { routeCall: mainRoute, routeEvent: mainRoute })); const logService = new FollowerLogService(logLevelClient, createSpdLogService('sharedprocess', initData.logLevel, environmentService.logsPath)); - process.once('exit', () => logService.dispose()); + disposables.push(logService); logService.info('main', JSON.stringify(configuration)); @@ -74,42 +78,33 @@ function main(server: Server, initData: ISharedProcessInitData, configuration: I services.set(IConfigurationService, new SyncDescriptor(ConfigurationService)); services.set(IRequestService, new SyncDescriptor(RequestService)); - const windowsChannel = server.getChannel('windows', { route: () => 'main' }); + const windowsChannel = server.getChannel('windows', { routeCall: mainRoute, routeEvent: mainRoute }); const windowsService = new WindowsChannelClient(windowsChannel); services.set(IWindowsService, windowsService); const activeWindowManager = new ActiveWindowManager(windowsService); - const dialogChannel = server.getChannel('dialog', { - route: () => { - logService.info('Routing dialog request to the client', activeWindowManager.activeClientId); - return activeWindowManager.activeClientId; - } - }); + const route = () => activeWindowManager.getActiveClientId(); + const dialogChannel = server.getChannel('dialog', { routeCall: route, routeEvent: route }); services.set(IDialogService, new DialogChannelClient(dialogChannel)); const instantiationService = new InstantiationService(services); instantiationService.invokeFunction(accessor => { - const appenders: AppInsightsAppender[] = []; - - if (product.aiConfig && product.aiConfig.asimovKey) { - appenders.push(new AppInsightsAppender(eventPrefix, null, product.aiConfig.asimovKey)); - } - - // It is important to dispose the AI adapter properly because - // only then they flush remaining data. - process.once('exit', () => appenders.forEach(a => a.dispose())); - - const appender = combinedAppender(...appenders); - server.registerChannel('telemetryAppender', new TelemetryAppenderChannel(appender)); - const services = new ServiceCollection(); const environmentService = accessor.get(IEnvironmentService); const { appRoot, extensionsPath, extensionDevelopmentPath, isBuilt, installSourcePath } = environmentService; + const telemetryLogService = new FollowerLogService(logLevelClient, createSpdLogService('telemetry', initData.logLevel, environmentService.logsPath)); - if (isBuilt && !extensionDevelopmentPath && !environmentService.args['disable-telemetry'] && product.enableTelemetry) { + let appInsightsAppender: ITelemetryAppender = NullAppender; + if (product.aiConfig && product.aiConfig.asimovKey && isBuilt) { + appInsightsAppender = new AppInsightsAppender(eventPrefix, null, product.aiConfig.asimovKey, telemetryLogService); + disposables.push(appInsightsAppender); // Ensure the AI appender is disposed so that it flushes remaining data + } + server.registerChannel('telemetryAppender', new TelemetryAppenderChannel(appInsightsAppender)); + + if (!extensionDevelopmentPath && !environmentService.args['disable-telemetry'] && product.enableTelemetry) { const config: ITelemetryServiceConfig = { - appender, + appender: combinedAppender(appInsightsAppender, new LogAppender(logService)), commonProperties: resolveCommonProperties(product.commit, pkg.version, configuration.machineId, installSourcePath), piiPaths: [appRoot, extensionsPath] }; @@ -138,6 +133,7 @@ function main(server: Server, initData: ISharedProcessInitData, configuration: I server.registerChannel('localizations', localizationsChannel); createSharedProcessContributions(instantiationService2); + disposables.push(extensionManagementService as ExtensionManagementService); }); }); } diff --git a/src/vs/code/electron-main/app.ts b/src/vs/code/electron-main/app.ts index 8a71f00292..7277771473 100644 --- a/src/vs/code/electron-main/app.ts +++ b/src/vs/code/electron-main/app.ts @@ -5,14 +5,13 @@ 'use strict'; -import { app, ipcMain as ipc } from 'electron'; +import { app, ipcMain as ipc, systemPreferences } from 'electron'; import * as platform from 'vs/base/common/platform'; import { WindowsManager } from 'vs/code/electron-main/windows'; import { IWindowsService, OpenContext, ActiveWindowManager } from 'vs/platform/windows/common/windows'; import { WindowsChannel } from 'vs/platform/windows/common/windowsIpc'; import { WindowsService } from 'vs/platform/windows/electron-main/windowsService'; import { ILifecycleService } from 'vs/platform/lifecycle/electron-main/lifecycleMain'; -import { CodeMenu } from 'vs/code/electron-main/menus'; import { getShellEnvironment } from 'vs/code/node/shellEnv'; import { IUpdateService } from 'vs/platform/update/common/update'; import { UpdateChannel } from 'vs/platform/update/common/updateIpc'; @@ -31,7 +30,7 @@ import { IConfigurationService } from 'vs/platform/configuration/common/configur import { IURLService } from 'vs/platform/url/common/url'; import { URLHandlerChannelClient, URLServiceChannel } from 'vs/platform/url/common/urlIpc'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; -import { NullTelemetryService } from 'vs/platform/telemetry/common/telemetryUtils'; +import { NullTelemetryService, combinedAppender, LogAppender } from 'vs/platform/telemetry/common/telemetryUtils'; import { ITelemetryAppenderChannel, TelemetryAppenderClient } from 'vs/platform/telemetry/common/telemetryIpc'; import { TelemetryService, ITelemetryServiceConfig } from 'vs/platform/telemetry/common/telemetryService'; import { resolveCommonProperties } from 'vs/platform/telemetry/node/commonProperties'; @@ -58,9 +57,14 @@ import { IIssueService } from 'vs/platform/issue/common/issue'; import { IssueChannel } from 'vs/platform/issue/common/issueIpc'; import { IssueService } from 'vs/platform/issue/electron-main/issueService'; import { LogLevelSetterChannel } from 'vs/platform/log/common/logIpc'; -import { setUnexpectedErrorHandler } from 'vs/base/common/errors'; +import * as errors from 'vs/base/common/errors'; import { ElectronURLListener } from 'vs/platform/url/electron-main/electronUrlListener'; import { serve as serveDriver } from 'vs/platform/driver/electron-main/driver'; +import { IMenubarService } from 'vs/platform/menubar/common/menubar'; +import { MenubarService } from 'vs/platform/menubar/electron-main/menubarService'; +import { MenubarChannel } from 'vs/platform/menubar/common/menubarIpc'; +import { IUriDisplayService } from 'vs/platform/uriDisplay/common/uriDisplay'; +import { CodeMenu } from 'vs/code/electron-main/menus'; export class CodeApplication { @@ -81,9 +85,10 @@ export class CodeApplication { @ILogService private logService: ILogService, @IEnvironmentService private environmentService: IEnvironmentService, @ILifecycleService private lifecycleService: ILifecycleService, - @IConfigurationService configurationService: ConfigurationService, + @IConfigurationService private configurationService: ConfigurationService, @IStateService private stateService: IStateService, - @IHistoryMainService private historyMainService: IHistoryMainService + @IHistoryMainService private historyMainService: IHistoryMainService, + @IUriDisplayService private uriDisplayService: IUriDisplayService ) { this.toDispose = [mainIpcServer, configurationService]; @@ -93,8 +98,9 @@ export class CodeApplication { private registerListeners(): void { // We handle uncaught exceptions here to prevent electron from opening a dialog to the user - setUnexpectedErrorHandler(err => this.onUnexpectedError(err)); + errors.setUnexpectedErrorHandler(err => this.onUnexpectedError(err)); process.on('uncaughtException', err => this.onUnexpectedError(err)); + process.on('unhandledRejection', (reason: any, promise: Promise) => errors.onUnexpectedError(reason)); app.on('will-quit', () => { this.logService.trace('App#will-quit: disposing resources'); @@ -149,14 +155,14 @@ export class CodeApplication { }); }); - let macOpenFiles: string[] = []; + let macOpenFileURIs: URI[] = []; let runningTimeout: number = null; app.on('open-file', (event: Event, path: string) => { this.logService.trace('App#open-file: ', path); event.preventDefault(); // Keep in array because more might come! - macOpenFiles.push(path); + macOpenFileURIs.push(URI.file(path)); // Clear previous handler if any if (runningTimeout !== null) { @@ -170,10 +176,10 @@ export class CodeApplication { this.windowsMainService.open({ context: OpenContext.DOCK /* can also be opening from finder while app is running */, cli: this.environmentService.args, - pathsToOpen: macOpenFiles, + urisToOpen: macOpenFileURIs, preferNewWindow: true /* dropping on the dock or opening from finder prefers to open in a new window */ }); - macOpenFiles = []; + macOpenFileURIs = []; runningTimeout = null; } }, 100); @@ -217,6 +223,10 @@ export class CodeApplication { } }); + ipc.on('vscode:uriDisplayRegisterFormater', (event: any, { scheme, formater }) => { + this.uriDisplayService.registerFormater(scheme, formater); + }); + // Keyboard layout changes KeyboardLayoutMonitor.INSTANCE.onDidChangeKeyboardLayout(() => { if (this.windowsMainService) { @@ -257,7 +267,7 @@ export class CodeApplication { } } - public startup(): TPromise { + startup(): TPromise { this.logService.debug('Starting VS Code'); this.logService.debug(`from: ${this.environmentService.appRoot}`); this.logService.debug('args:', this.environmentService.args); @@ -270,6 +280,20 @@ export class CodeApplication { app.setAppUserModelId(product.win32AppUserModelId); } + // Fix native tabs on macOS 10.13 + // macOS enables a compatibility patch for any bundle ID beginning with + // "com.microsoft.", which breaks native tabs for VS Code when using this + // identifier (from the official build). + // Explicitly opt out of the patch here before creating any windows. + // See: https://github.com/Microsoft/vscode/issues/35361#issuecomment-399794085 + try { + if (platform.isMacintosh && this.configurationService.getValue('window.nativeTabs') === true && !systemPreferences.getUserDefault('NSUseImprovedLayoutPass', 'boolean')) { + systemPreferences.registerDefaults({ NSUseImprovedLayoutPass: true }); + } + } catch (error) { + this.logService.error(error); + } + // Create Electron IPC Server this.electronIpcServer = new ElectronIPCServer(); @@ -289,7 +313,7 @@ export class CodeApplication { // Create driver if (this.environmentService.driverHandle) { - serveDriver(this.electronIpcServer, this.environmentService.driverHandle, appInstantiationService).then(server => { + serveDriver(this.electronIpcServer, this.environmentService.driverHandle, this.environmentService, appInstantiationService).then(server => { this.logService.info('Driver started at:', this.environmentService.driverHandle); this.toDispose.push(server); }); @@ -340,11 +364,12 @@ export class CodeApplication { services.set(IWindowsService, new SyncDescriptor(WindowsService, this.sharedProcess)); services.set(ILaunchService, new SyncDescriptor(LaunchService)); services.set(IIssueService, new SyncDescriptor(IssueService, machineId, this.userEnv)); + services.set(IMenubarService, new SyncDescriptor(MenubarService)); // Telemtry - if (this.environmentService.isBuilt && !this.environmentService.isExtensionDevelopment && !this.environmentService.args['disable-telemetry'] && !!product.enableTelemetry) { + if (!this.environmentService.isExtensionDevelopment && !this.environmentService.args['disable-telemetry'] && !!product.enableTelemetry) { const channel = getDelayedChannel(this.sharedProcessClient.then(c => c.getChannel('telemetryAppender'))); - const appender = new TelemetryAppenderClient(channel); + const appender = combinedAppender(new TelemetryAppenderClient(channel), new LogAppender(this.logService)); const commonProperties = resolveCommonProperties(product.commit, pkg.version, machineId, this.environmentService.installSourcePath); const piiPaths = [this.environmentService.appRoot, this.environmentService.extensionsPath]; const config: ITelemetryServiceConfig = { appender, commonProperties, piiPaths }; @@ -383,6 +408,10 @@ export class CodeApplication { this.electronIpcServer.registerChannel('windows', windowsChannel); this.sharedProcessClient.done(client => client.registerChannel('windows', windowsChannel)); + const menubarService = accessor.get(IMenubarService); + const menubarChannel = new MenubarChannel(menubarService); + this.electronIpcServer.registerChannel('menubar', menubarChannel); + const urlService = accessor.get(IURLService); const urlChannel = new URLServiceChannel(urlService); this.electronIpcServer.registerChannel('url', urlChannel); @@ -402,7 +431,8 @@ export class CodeApplication { // Create a URL handler which forwards to the last active window const activeWindowManager = new ActiveWindowManager(windowsService); - const urlHandlerChannel = this.electronIpcServer.getChannel('urlHandler', { route: () => activeWindowManager.activeClientId }); + const route = () => activeWindowManager.getActiveClientId(); + const urlHandlerChannel = this.electronIpcServer.getChannel('urlHandler', { routeCall: route, routeEvent: route }); const multiplexURLHandler = new URLHandlerChannelClient(urlHandlerChannel); // On Mac, Code can be running without any open windows, so we must create a window to handle urls, @@ -411,7 +441,7 @@ export class CodeApplication { const environmentService = accessor.get(IEnvironmentService); urlService.registerHandler({ - async handleURL(uri: URI): TPromise { + handleURL(uri: URI): TPromise { if (windowsMainService.getWindowCount() === 0) { const cli = { ...environmentService.args, goto: true }; const [window] = windowsMainService.open({ context: OpenContext.API, cli, forceEmpty: true }); @@ -419,7 +449,7 @@ export class CodeApplication { return window.ready().then(() => urlService.open(uri)); } - return false; + return TPromise.as(false); } }); } @@ -437,17 +467,16 @@ export class CodeApplication { // Open our first window const macOpenFiles = (global).macOpenFiles as string[]; const context = !!process.env['VSCODE_CLI'] ? OpenContext.CLI : OpenContext.DESKTOP; - if (args['new-window'] && args._.length === 0) { + if (args['new-window'] && args._.length === 0 && (args['folder-uri'] || []).length === 0) { this.windowsMainService.open({ context, cli: args, forceNewWindow: true, forceEmpty: true, initialStartup: true }); // new window if "-n" was used without paths - } else if (macOpenFiles && macOpenFiles.length && (!args._ || !args._.length)) { - this.windowsMainService.open({ context: OpenContext.DOCK, cli: args, pathsToOpen: macOpenFiles, initialStartup: true }); // mac: open-file event received on startup + } else if (macOpenFiles && macOpenFiles.length && (!args._ || !args._.length || !args['folder-uri'] || !args['folder-uri'].length)) { + this.windowsMainService.open({ context: OpenContext.DOCK, cli: args, urisToOpen: macOpenFiles.map(file => URI.file(file)), initialStartup: true }); // mac: open-file event received on startup } else { this.windowsMainService.open({ context, cli: args, forceNewWindow: args['new-window'] || (!args._.length && args['unity-launch']), diffMode: args.diff, initialStartup: true }); // default: read paths from cli } } private afterWindowOpen(accessor: ServicesAccessor): void { - const appInstantiationService = accessor.get(IInstantiationService); const windowsMainService = accessor.get(IWindowsMainService); let windowsMutex: Mutex = null; @@ -487,15 +516,20 @@ export class CodeApplication { } } + // TODO@sbatten: Remove when switching back to dynamic menu // Install Menu - appInstantiationService.createInstance(CodeMenu); + const instantiationService = accessor.get(IInstantiationService); + const configurationService = accessor.get(IConfigurationService); + if (platform.isMacintosh || configurationService.getValue('window.titleBarStyle') !== 'custom') { + instantiationService.createInstance(CodeMenu); + } // Jump List this.historyMainService.updateWindowsJumpList(); this.historyMainService.onRecentlyOpenedChange(() => this.historyMainService.updateWindowsJumpList()); - // Start shared process here - this.sharedProcess.spawn(); + // Start shared process after a while + TPromise.timeout(3000).then(() => this.sharedProcess.spawn()); } private dispose(): void { diff --git a/src/vs/code/electron-main/auth.ts b/src/vs/code/electron-main/auth.ts index 9db6c98978..ec677857e5 100644 --- a/src/vs/code/electron-main/auth.ts +++ b/src/vs/code/electron-main/auth.ts @@ -56,7 +56,10 @@ export class ProxyAuthHandler { width: 450, height: 220, show: true, - title: 'VS Code' + title: 'VS Code', + webPreferences: { + disableBlinkFeatures: 'Auxclick' + } }; const focusedWindow = this.windowsMainService.getFocusedWindow(); diff --git a/src/vs/code/electron-main/diagnostics.ts b/src/vs/code/electron-main/diagnostics.ts index dd1336376b..cd7d93ac34 100644 --- a/src/vs/code/electron-main/diagnostics.ts +++ b/src/vs/code/electron-main/diagnostics.ts @@ -16,6 +16,7 @@ import { repeat, pad } from 'vs/base/common/strings'; import { isWindows } from 'vs/base/common/platform'; import { app } from 'electron'; import { basename } from 'path'; +import URI from 'vs/base/common/uri'; export interface VersionInfo { vscodeVersion: string; @@ -49,39 +50,51 @@ export function getPerformanceInfo(info: IMainProcessInfo): Promise window.folders && window.folders.length > 0)) { + const workspaceStatPromises = []; + if (info.windows.some(window => window.folderURIs && window.folderURIs.length > 0)) { info.windows.forEach(window => { - if (window.folders.length === 0) { + if (window.folderURIs.length === 0) { return; } workspaceInfoMessages.push(`| Window (${window.title})`); - window.folders.forEach(folder => { - try { - const stats = collectWorkspaceStats(folder, ['node_modules', '.git']); - let countMessage = `${stats.fileCount} files`; - if (stats.maxFilesReached) { - countMessage = `more than ${countMessage}`; - } - workspaceInfoMessages.push(`| Folder (${basename(folder)}): ${countMessage}`); - workspaceInfoMessages.push(formatWorkspaceStats(stats)); + window.folderURIs.forEach(uriComponents => { + const folderUri = URI.revive(uriComponents); + if (folderUri.scheme === 'file') { + const folder = folderUri.fsPath; + workspaceStatPromises.push(collectWorkspaceStats(folder, ['node_modules', '.git']).then(async stats => { - const launchConfigs = collectLaunchConfigs(folder); - if (launchConfigs.length > 0) { - workspaceInfoMessages.push(formatLaunchConfigs(launchConfigs)); - } - } catch (error) { - workspaceInfoMessages.push(`| Error: Unable to collect workpsace stats for folder ${folder} (${error.toString()})`); + let countMessage = `${stats.fileCount} files`; + if (stats.maxFilesReached) { + countMessage = `more than ${countMessage}`; + } + workspaceInfoMessages.push(`| Folder (${basename(folder)}): ${countMessage}`); + workspaceInfoMessages.push(formatWorkspaceStats(stats)); + + const launchConfigs = await collectLaunchConfigs(folder); + if (launchConfigs.length > 0) { + workspaceInfoMessages.push(formatLaunchConfigs(launchConfigs)); + } + })); + } else { + workspaceInfoMessages.push(`| Folder (${folderUri.toString()}): RPerformance stats not available.`); } }); }); } - return { - processInfo: formatProcessList(info, rootProcess), - workspaceInfo: workspaceInfoMessages.join('\n') - }; + return Promise.all(workspaceStatPromises).then(() => { + return { + processInfo: formatProcessList(info, rootProcess), + workspaceInfo: workspaceInfoMessages.join('\n') + }; + }).catch(error => { + return { + processInfo: formatProcessList(info, rootProcess), + workspaceInfo: `Unable to calculate workspace stats: ${error}` + }; + }); }); } @@ -122,38 +135,48 @@ export function printDiagnostics(info: IMainProcessInfo): Promise { console.log(formatProcessList(info, rootProcess)); // Workspace Stats - if (info.windows.some(window => window.folders && window.folders.length > 0)) { + const workspaceStatPromises = []; + if (info.windows.some(window => window.folderURIs && window.folderURIs.length > 0)) { console.log(''); console.log('Workspace Stats: '); info.windows.forEach(window => { - if (window.folders.length === 0) { + if (window.folderURIs.length === 0) { return; } console.log(`| Window (${window.title})`); - window.folders.forEach(folder => { - try { - const stats = collectWorkspaceStats(folder, ['node_modules', '.git']); - let countMessage = `${stats.fileCount} files`; - if (stats.maxFilesReached) { - countMessage = `more than ${countMessage}`; - } - console.log(`| Folder (${basename(folder)}): ${countMessage}`); - console.log(formatWorkspaceStats(stats)); + window.folderURIs.forEach(uriComponents => { + const folderUri = URI.revive(uriComponents); + if (folderUri.scheme === 'file') { + const folder = folderUri.fsPath; + workspaceStatPromises.push(collectWorkspaceStats(folder, ['node_modules', '.git']).then(async stats => { + let countMessage = `${stats.fileCount} files`; + if (stats.maxFilesReached) { + countMessage = `more than ${countMessage}`; + } + console.log(`| Folder (${basename(folder)}): ${countMessage}`); + console.log(formatWorkspaceStats(stats)); - const launchConfigs = collectLaunchConfigs(folder); - if (launchConfigs.length > 0) { - console.log(formatLaunchConfigs(launchConfigs)); - } - } catch (error) { - console.log(`| Error: Unable to collect workpsace stats for folder ${folder} (${error.toString()})`); + await collectLaunchConfigs(folder).then(launchConfigs => { + if (launchConfigs.length > 0) { + console.log(formatLaunchConfigs(launchConfigs)); + } + }); + }).catch(error => { + console.log(`| Error: Unable to collect workspace stats for folder ${folder} (${error.toString()})`); + })); + } else { + console.log(`| Folder (${folderUri.toString()}): Workspace stats not available.`); } }); }); } - console.log(''); - console.log(''); + + return Promise.all(workspaceStatPromises).then(() => { + console.log(''); + console.log(''); + }); }); } diff --git a/src/vs/code/electron-main/launch.ts b/src/vs/code/electron-main/launch.ts index 446bb6bbcd..97a541c73b 100644 --- a/src/vs/code/electron-main/launch.ts +++ b/src/vs/code/electron-main/launch.ts @@ -16,9 +16,10 @@ import { OpenContext, IWindowSettings } from 'vs/platform/windows/common/windows import { IWindowsMainService, ICodeWindow } from 'vs/platform/windows/electron-main/windows'; import { whenDeleted } from 'vs/base/node/pfs'; import { IWorkspacesMainService } from 'vs/platform/workspaces/common/workspaces'; -import { Schemas } from 'vs/base/common/network'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; -import URI from 'vs/base/common/uri'; +import URI, { UriComponents } from 'vs/base/common/uri'; +import { BrowserWindow } from 'electron'; +import { Event } from 'vs/base/common/event'; export const ID = 'launchService'; export const ILaunchService = createDecorator(ID); @@ -31,7 +32,7 @@ export interface IStartArguments { export interface IWindowInfo { pid: number; title: string; - folders: string[]; + folderURIs: UriComponents[]; } export interface IMainProcessInfo { @@ -78,7 +79,11 @@ export class LaunchChannel implements ILaunchChannel { constructor(private service: ILaunchService) { } - public call(command: string, arg: any): TPromise { + listen(event: string): Event { + throw new Error('No event found'); + } + + call(command: string, arg: any): TPromise { switch (command) { case 'start': const { args, userEnv } = arg as IStartArguments; @@ -104,19 +109,19 @@ export class LaunchChannelClient implements ILaunchService { constructor(private channel: ILaunchChannel) { } - public start(args: ParsedArgs, userEnv: IProcessEnvironment): TPromise { + start(args: ParsedArgs, userEnv: IProcessEnvironment): TPromise { return this.channel.call('start', { args, userEnv }); } - public getMainProcessId(): TPromise { + getMainProcessId(): TPromise { return this.channel.call('get-main-process-id', null); } - public getMainProcessInfo(): TPromise { + getMainProcessInfo(): TPromise { return this.channel.call('get-main-process-info', null); } - public getLogsPath(): TPromise { + getLogsPath(): TPromise { return this.channel.call('get-logs-path', null); } } @@ -134,7 +139,7 @@ export class LaunchService implements ILaunchService { @IConfigurationService private readonly configurationService: IConfigurationService ) { } - public start(args: ParsedArgs, userEnv: IProcessEnvironment): TPromise { + start(args: ParsedArgs, userEnv: IProcessEnvironment): TPromise { this.logService.trace('Received data from other instance: ', args, userEnv); const urlsToOpen = parseOpenUrl(args); @@ -173,7 +178,7 @@ export class LaunchService implements ILaunchService { } // Start without file/folder arguments - else if (args._.length === 0) { + else if (args._.length === 0 && (args['folder-uri'] || []).length === 0) { let openNewWindow = false; // Force new window @@ -236,48 +241,58 @@ export class LaunchService implements ILaunchService { return TPromise.as(null); } - public getMainProcessId(): TPromise { + getMainProcessId(): TPromise { this.logService.trace('Received request for process ID from other instance.'); return TPromise.as(process.pid); } - public getMainProcessInfo(): TPromise { + getMainProcessInfo(): TPromise { this.logService.trace('Received request for main process info from other instance.'); + const windows: IWindowInfo[] = []; + BrowserWindow.getAllWindows().forEach(window => { + const codeWindow = this.windowsMainService.getWindowById(window.id); + if (codeWindow) { + windows.push(this.codeWindowToInfo(codeWindow)); + } else { + windows.push(this.browserWindowToInfo(window)); + } + }); + return TPromise.wrap({ mainPID: process.pid, mainArguments: process.argv, - windows: this.windowsMainService.getWindows().map(window => { - return this.getWindowInfo(window); - }) + windows } as IMainProcessInfo); } - public getLogsPath(): TPromise { + getLogsPath(): TPromise { this.logService.trace('Received request for logs path from other instance.'); return TPromise.as(this.environmentService.logsPath); } - private getWindowInfo(window: ICodeWindow): IWindowInfo { - const folders: string[] = []; + private codeWindowToInfo(window: ICodeWindow): IWindowInfo { + const folderURIs: URI[] = []; - if (window.openedFolderPath) { - folders.push(window.openedFolderPath); + if (window.openedFolderUri) { + folderURIs.push(window.openedFolderUri); } else if (window.openedWorkspace) { const rootFolders = this.workspacesMainService.resolveWorkspaceSync(window.openedWorkspace.configPath).folders; rootFolders.forEach(root => { - if (root.uri.scheme === Schemas.file) { // todo@remote signal remote folders? - folders.push(root.uri.fsPath); - } + folderURIs.push(root.uri); }); } + return this.browserWindowToInfo(window.win, folderURIs); + } + + private browserWindowToInfo(win: BrowserWindow, folderURIs: URI[] = []): IWindowInfo { return { - pid: window.win.webContents.getOSProcessId(), - title: window.win.getTitle(), - folders + pid: win.webContents.getOSProcessId(), + title: win.getTitle(), + folderURIs } as IWindowInfo; } } diff --git a/src/vs/code/electron-main/logUploader.ts b/src/vs/code/electron-main/logUploader.ts index 6d8b4b258d..40f559ba98 100644 --- a/src/vs/code/electron-main/logUploader.ts +++ b/src/vs/code/electron-main/logUploader.ts @@ -37,7 +37,7 @@ export async function uploadLogs( channel: ILaunchChannel, requestService: IRequestService, environmentService: IEnvironmentService -): TPromise { +): Promise { const endpoint = Endpoint.getFromProduct(); if (!endpoint) { console.error(localize('invalidEndpoint', 'Invalid log uploader endpoint')); @@ -75,7 +75,7 @@ async function postLogs( endpoint: Endpoint, outZip: string, requestService: IRequestService -): TPromise { +): Promise { const dotter = setInterval(() => console.log('.'), 5000); let result: IRequestContext; try { @@ -152,4 +152,4 @@ function doZip( default: return cp.execFile('zip', ['-r', outZip, '.'], { cwd: logsPath }, callback); } -} \ No newline at end of file +} diff --git a/src/vs/code/electron-main/main.ts b/src/vs/code/electron-main/main.ts index 026d6297f4..8244d7dbb0 100644 --- a/src/vs/code/electron-main/main.ts +++ b/src/vs/code/electron-main/main.ts @@ -35,7 +35,7 @@ import { IRequestService } from 'vs/platform/request/node/request'; import { RequestService } from 'vs/platform/request/electron-main/requestService'; import { IURLService } from 'vs/platform/url/common/url'; import { URLService } from 'vs/platform/url/common/urlService'; -import * as fs from 'original-fs'; +import * as fs from 'fs'; import { CodeApplication } from 'vs/code/electron-main/app'; import { HistoryMainService } from 'vs/platform/history/electron-main/historyMainService'; import { IHistoryMainService } from 'vs/platform/history/common/history'; @@ -50,6 +50,7 @@ import { uploadLogs } from 'vs/code/electron-main/logUploader'; import { setUnexpectedErrorHandler } from 'vs/base/common/errors'; import { IDialogService } from 'vs/platform/dialogs/common/dialogs'; import { CommandLineDialogService } from 'vs/platform/dialogs/node/dialogService'; +import { IUriDisplayService, UriDisplayService } from 'vs/platform/uriDisplay/common/uriDisplay'; function createServices(args: ParsedArgs, bufferLogService: BufferLogService): IInstantiationService { const services = new ServiceCollection(); @@ -57,6 +58,7 @@ function createServices(args: ParsedArgs, bufferLogService: BufferLogService): I const environmentService = new EnvironmentService(args, process.execPath); const consoleLogService = new ConsoleLogMainService(getLogLevel(environmentService)); const logService = new MultiplexLogService([consoleLogService, bufferLogService]); + const uriDisplayService = new UriDisplayService(environmentService, undefined); process.once('exit', () => logService.dispose()); @@ -64,6 +66,7 @@ function createServices(args: ParsedArgs, bufferLogService: BufferLogService): I setTimeout(() => cleanupOlderLogs(environmentService).then(null, err => console.error(err)), 10000); services.set(IEnvironmentService, environmentService); + services.set(IUriDisplayService, uriDisplayService); services.set(ILogService, logService); services.set(IWorkspacesMainService, new SyncDescriptor(WorkspacesMainService)); services.set(IHistoryMainService, new SyncDescriptor(HistoryMainService)); @@ -81,7 +84,7 @@ function createServices(args: ParsedArgs, bufferLogService: BufferLogService): I /** * Cleans up older logs, while keeping the 10 most recent ones. */ -async function cleanupOlderLogs(environmentService: EnvironmentService): TPromise { +async function cleanupOlderLogs(environmentService: EnvironmentService): Promise { const currentLog = path.basename(environmentService.logsPath); const logsRoot = path.dirname(environmentService.logsPath); const children = await readdir(logsRoot); @@ -323,6 +326,11 @@ function main() { VSCODE_NLS_CONFIG: process.env['VSCODE_NLS_CONFIG'], VSCODE_LOGS: process.env['VSCODE_LOGS'] }; + + if (process.env['VSCODE_PORTABLE']) { + instanceEnv['VSCODE_PORTABLE'] = process.env['VSCODE_PORTABLE']; + } + assign(process.env, instanceEnv); // Startup diff --git a/src/vs/code/electron-main/menubar.ts b/src/vs/code/electron-main/menubar.ts new file mode 100644 index 0000000000..c79d9a8b42 --- /dev/null +++ b/src/vs/code/electron-main/menubar.ts @@ -0,0 +1,799 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the Source EULA. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +'use strict'; + +import * as nls from 'vs/nls'; +import { isMacintosh, language } from 'vs/base/common/platform'; +import { IEnvironmentService } from 'vs/platform/environment/common/environment'; +import { app, shell, Menu, MenuItem, BrowserWindow } from 'electron'; +import { OpenContext, IRunActionInWindowRequest } from 'vs/platform/windows/common/windows'; +import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; +import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; +import { IUpdateService, StateType } from 'vs/platform/update/common/update'; +import product from 'vs/platform/node/product'; +import { RunOnceScheduler } from 'vs/base/common/async'; +import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; +import { mnemonicMenuLabel as baseMnemonicLabel, unmnemonicLabel } from 'vs/base/common/labels'; +import { IWindowsMainService, IWindowsCountChangedEvent } from 'vs/platform/windows/electron-main/windows'; +import { IHistoryMainService } from 'vs/platform/history/common/history'; +import { IWorkspaceIdentifier, getWorkspaceLabel, ISingleFolderWorkspaceIdentifier, isSingleFolderWorkspaceIdentifier, isWorkspaceIdentifier } from 'vs/platform/workspaces/common/workspaces'; +import { IMenubarData, IMenubarKeybinding, MenubarMenuItem, isMenubarMenuItemSeparator, isMenubarMenuItemSubmenu, isMenubarMenuItemAction } from 'vs/platform/menubar/common/menubar'; +import URI from 'vs/base/common/uri'; +import { IUriDisplayService } from 'vs/platform/uriDisplay/common/uriDisplay'; + +const telemetryFrom = 'menu'; + +export class Menubar { + + private static readonly MAX_MENU_RECENT_ENTRIES = 10; + private isQuitting: boolean; + private appMenuInstalled: boolean; + private closedLastWindow: boolean; + + private menuUpdater: RunOnceScheduler; + + private nativeTabMenuItems: Electron.MenuItem[]; + + private menubarMenus: IMenubarData; + + private keybindings: { [commandId: string]: IMenubarKeybinding }; + + constructor( + @IUpdateService private updateService: IUpdateService, + @IInstantiationService instantiationService: IInstantiationService, + @IConfigurationService private configurationService: IConfigurationService, + @IWindowsMainService private windowsMainService: IWindowsMainService, + @IEnvironmentService private environmentService: IEnvironmentService, + @ITelemetryService private telemetryService: ITelemetryService, + @IHistoryMainService private historyMainService: IHistoryMainService, + @IUriDisplayService private uriDisplayService: IUriDisplayService + ) { + this.menuUpdater = new RunOnceScheduler(() => this.doUpdateMenu(), 0); + + this.keybindings = Object.create(null); + + this.closedLastWindow = false; + + this.install(); + + this.registerListeners(); + } + + private registerListeners(): void { + + // Keep flag when app quits + app.on('will-quit', () => { + this.isQuitting = true; + }); + + // // Listen to some events from window service to update menu + this.historyMainService.onRecentlyOpenedChange(() => this.scheduleUpdateMenu()); + this.windowsMainService.onWindowsCountChanged(e => this.onWindowsCountChanged(e)); + // this.windowsMainService.onActiveWindowChanged(() => this.updateWorkspaceMenuItems()); + // this.windowsMainService.onWindowReady(() => this.updateWorkspaceMenuItems()); + // this.windowsMainService.onWindowClose(() => this.updateWorkspaceMenuItems()); + + // Listen to extension viewlets + // ipc.on('vscode:extensionViewlets', (event: any, rawExtensionViewlets: string) => { + // let extensionViewlets: IExtensionViewlet[] = []; + // try { + // extensionViewlets = JSON.parse(rawExtensionViewlets); + // } catch (error) { + // // Should not happen + // } + + // if (extensionViewlets.length) { + // this.extensionViewlets = extensionViewlets; + // this.updateMenu(); + // } + // }); + + // Update when auto save config changes + // this.configurationService.onDidChangeConfiguration(e => this.onConfigurationUpdated(e)); + + // Listen to update service + // this.updateService.onStateChange(() => this.updateMenu()); + } + + private get currentEnableMenuBarMnemonics(): boolean { + let enableMenuBarMnemonics = this.configurationService.getValue('window.enableMenuBarMnemonics'); + if (typeof enableMenuBarMnemonics !== 'boolean') { + enableMenuBarMnemonics = true; + } + + return enableMenuBarMnemonics; + } + + private get currentEnableNativeTabs(): boolean { + let enableNativeTabs = this.configurationService.getValue('window.nativeTabs'); + if (typeof enableNativeTabs !== 'boolean') { + enableNativeTabs = false; + } + return enableNativeTabs; + } + + updateMenu(menus: IMenubarData, windowId: number, additionalKeybindings?: Array) { + this.menubarMenus = menus; + if (additionalKeybindings) { + additionalKeybindings.forEach(keybinding => { + this.keybindings[keybinding.id] = keybinding; + }); + } + + this.scheduleUpdateMenu(); + } + + + private scheduleUpdateMenu(): void { + this.menuUpdater.schedule(); // buffer multiple attempts to update the menu + } + + private doUpdateMenu(): void { + + // Due to limitations in Electron, it is not possible to update menu items dynamically. The suggested + // workaround from Electron is to set the application menu again. + // See also https://github.com/electron/electron/issues/846 + // + // Run delayed to prevent updating menu while it is open + if (!this.isQuitting) { + setTimeout(() => { + if (!this.isQuitting) { + this.install(); + } + }, 10 /* delay this because there is an issue with updating a menu when it is open */); + } + } + + private onWindowsCountChanged(e: IWindowsCountChangedEvent): void { + if (!isMacintosh) { + return; + } + + // Update menu if window count goes from N > 0 or 0 > N to update menu item enablement + if ((e.oldCount === 0 && e.newCount > 0) || (e.oldCount > 0 && e.newCount === 0)) { + this.closedLastWindow = e.newCount === 0; + this.scheduleUpdateMenu(); + } + + // Update specific items that are dependent on window count + else if (this.currentEnableNativeTabs) { + this.nativeTabMenuItems.forEach(item => { + if (item) { + item.enabled = e.newCount > 1; + } + }); + } + } + + private install(): void { + + // Menus + const menubar = new Menu(); + + // Mac: Application + let macApplicationMenuItem: Electron.MenuItem; + if (isMacintosh) { + const applicationMenu = new Menu(); + macApplicationMenuItem = new MenuItem({ label: product.nameShort, submenu: applicationMenu }); + this.setMacApplicationMenu(applicationMenu); + menubar.append(macApplicationMenuItem); + } + + // Mac: Dock + if (isMacintosh && !this.appMenuInstalled) { + this.appMenuInstalled = true; + + const dockMenu = new Menu(); + dockMenu.append(new MenuItem({ label: this.mnemonicLabel(nls.localize({ key: 'miNewWindow', comment: ['&& denotes a mnemonic'] }, "New &&Window")), click: () => this.windowsMainService.openNewWindow(OpenContext.DOCK) })); + + app.dock.setMenu(dockMenu); + } + + // File + const fileMenu = new Menu(); + const fileMenuItem = new MenuItem({ label: this.mnemonicLabel(nls.localize({ key: 'mFile', comment: ['&& denotes a mnemonic'] }, "&&File")), submenu: fileMenu }); + + if (this.shouldDrawMenu('File')) { + if (this.shouldFallback('File')) { + this.setFallbackMenuById(fileMenu, 'File'); + } else { + this.setMenuById(fileMenu, 'File'); + } + + menubar.append(fileMenuItem); + } + + + // Edit + const editMenu = new Menu(); + const editMenuItem = new MenuItem({ label: this.mnemonicLabel(nls.localize({ key: 'mEdit', comment: ['&& denotes a mnemonic'] }, "&&Edit")), submenu: editMenu }); + + if (this.shouldDrawMenu('Edit')) { + this.setMenuById(editMenu, 'Edit'); + menubar.append(editMenuItem); + } + + // Selection + const selectionMenu = new Menu(); + const selectionMenuItem = new MenuItem({ label: this.mnemonicLabel(nls.localize({ key: 'mSelection', comment: ['&& denotes a mnemonic'] }, "&&Selection")), submenu: selectionMenu }); + + if (this.shouldDrawMenu('Selection')) { + this.setMenuById(selectionMenu, 'Selection'); + menubar.append(selectionMenuItem); + } + + // View + const viewMenu = new Menu(); + const viewMenuItem = new MenuItem({ label: this.mnemonicLabel(nls.localize({ key: 'mView', comment: ['&& denotes a mnemonic'] }, "&&View")), submenu: viewMenu }); + + if (this.shouldDrawMenu('View')) { + this.setMenuById(viewMenu, 'View'); + menubar.append(viewMenuItem); + } + + // Layout + const layoutMenu = new Menu(); + const layoutMenuItem = new MenuItem({ label: this.mnemonicLabel(nls.localize({ key: 'mLayout', comment: ['&& denotes a mnemonic'] }, "&&Layout")), submenu: layoutMenu }); + + if (this.shouldDrawMenu('Layout')) { + this.setMenuById(layoutMenu, 'Layout'); + menubar.append(layoutMenuItem); + } + + // Go + const gotoMenu = new Menu(); + const gotoMenuItem = new MenuItem({ label: this.mnemonicLabel(nls.localize({ key: 'mGoto', comment: ['&& denotes a mnemonic'] }, "&&Go")), submenu: gotoMenu }); + + if (this.shouldDrawMenu('Go')) { + this.setMenuById(gotoMenu, 'Go'); + menubar.append(gotoMenuItem); + } + + // Debug + const debugMenu = new Menu(); + const debugMenuItem = new MenuItem({ label: this.mnemonicLabel(nls.localize({ key: 'mDebug', comment: ['&& denotes a mnemonic'] }, "&&Debug")), submenu: debugMenu }); + + if (this.shouldDrawMenu('Debug')) { + this.setMenuById(debugMenu, 'Debug'); + menubar.append(debugMenuItem); + } + + // Tasks + const taskMenu = new Menu(); + const taskMenuItem = new MenuItem({ label: this.mnemonicLabel(nls.localize({ key: 'mTask', comment: ['&& denotes a mnemonic'] }, "&&Tasks")), submenu: taskMenu }); + + if (this.shouldDrawMenu('Tasks')) { + this.setMenuById(taskMenu, 'Tasks'); + menubar.append(taskMenuItem); + } + + // Mac: Window + let macWindowMenuItem: Electron.MenuItem; + if (this.shouldDrawMenu('Window')) { + const windowMenu = new Menu(); + macWindowMenuItem = new MenuItem({ label: this.mnemonicLabel(nls.localize('mWindow', "Window")), submenu: windowMenu, role: 'window' }); + this.setMacWindowMenu(windowMenu); + } + + if (macWindowMenuItem) { + menubar.append(macWindowMenuItem); + } + + // Preferences + if (!isMacintosh) { + const preferencesMenu = new Menu(); + const preferencesMenuItem = new MenuItem({ label: this.mnemonicLabel(nls.localize({ key: 'mPreferences', comment: ['&& denotes a mnemonic'] }, "&&Preferences")), submenu: preferencesMenu }); + + if (this.shouldDrawMenu('Preferences')) { + if (this.shouldFallback('Preferences')) { + this.setFallbackMenuById(preferencesMenu, 'Preferences'); + } else { + this.setMenuById(preferencesMenu, 'Preferences'); + } + menubar.append(preferencesMenuItem); + } + } + + // Help + const helpMenu = new Menu(); + const helpMenuItem = new MenuItem({ label: this.mnemonicLabel(nls.localize({ key: 'mHelp', comment: ['&& denotes a mnemonic'] }, "&&Help")), submenu: helpMenu, role: 'help' }); + + if (this.shouldDrawMenu('Help')) { + if (this.shouldFallback('Help')) { + this.setFallbackMenuById(helpMenu, 'Help'); + } else { + this.setMenuById(helpMenu, 'Help'); + } + menubar.append(helpMenuItem); + } + + if (menubar.items && menubar.items.length > 0) { + Menu.setApplicationMenu(menubar); + } else { + Menu.setApplicationMenu(null); + } + } + + private setMacApplicationMenu(macApplicationMenu: Electron.Menu): void { + const about = new MenuItem({ label: nls.localize('mAbout', "About {0}", product.nameLong), role: 'about' }); + const checkForUpdates = this.getUpdateMenuItems(); + + let preferences; + if (this.shouldDrawMenu('Preferences')) { + const preferencesMenu = new Menu(); + this.setMenuById(preferencesMenu, 'Preferences'); + preferences = new MenuItem({ label: this.mnemonicLabel(nls.localize({ key: 'miPreferences', comment: ['&& denotes a mnemonic'] }, "&&Preferences")), submenu: preferencesMenu }); + } + + const servicesMenu = new Menu(); + const services = new MenuItem({ label: nls.localize('mServices', "Services"), role: 'services', submenu: servicesMenu }); + const hide = new MenuItem({ label: nls.localize('mHide', "Hide {0}", product.nameLong), role: 'hide', accelerator: 'Command+H' }); + const hideOthers = new MenuItem({ label: nls.localize('mHideOthers', "Hide Others"), role: 'hideothers', accelerator: 'Command+Alt+H' }); + const showAll = new MenuItem({ label: nls.localize('mShowAll', "Show All"), role: 'unhide' }); + const quit = new MenuItem(this.likeAction('workbench.action.quit', { + label: nls.localize('miQuit', "Quit {0}", product.nameLong), click: () => { + if (this.windowsMainService.getWindowCount() === 0 || !!BrowserWindow.getFocusedWindow()) { + this.windowsMainService.quit(); // fix for https://github.com/Microsoft/vscode/issues/39191 + } + } + })); + + const actions = [about]; + actions.push(...checkForUpdates); + + if (preferences) { + actions.push(...[ + __separator__(), + preferences + ]); + } + + actions.push(...[ + __separator__(), + services, + __separator__(), + hide, + hideOthers, + showAll, + __separator__(), + quit + ]); + + actions.forEach(i => macApplicationMenu.append(i)); + } + + private shouldDrawMenu(menuId: string): boolean { + // We need to draw an empty menu to override the electron default + if (!isMacintosh && this.configurationService.getValue('window.titleBarStyle') === 'custom') { + return false; + } + + switch (menuId) { + case 'File': + case 'Help': + if (isMacintosh) { + return (this.windowsMainService.getWindowCount() === 0 && this.closedLastWindow) || (!!this.menubarMenus && !!this.menubarMenus[menuId]); + } + + case 'Window': + if (isMacintosh) { + return (this.windowsMainService.getWindowCount() === 0 && this.closedLastWindow) || !!this.menubarMenus; + } + + default: + return this.windowsMainService.getWindowCount() > 0 && (!!this.menubarMenus && !!this.menubarMenus[menuId]); + } + } + + private shouldFallback(menuId: string): boolean { + return this.shouldDrawMenu(menuId) && (this.windowsMainService.getWindowCount() === 0 && this.closedLastWindow && isMacintosh); + } + + private setFallbackMenuById(menu: Electron.Menu, menuId: string): void { + switch (menuId) { + case 'File': + const newFile = new MenuItem(this.likeAction('workbench.action.files.newUntitledFile', { label: this.mnemonicLabel(nls.localize({ key: 'miNewFile', comment: ['&& denotes a mnemonic'] }, "&&New File")), click: () => this.windowsMainService.openNewWindow(OpenContext.MENU) })); + + const newWindow = new MenuItem(this.likeAction('workbench.action.newWindow', { label: this.mnemonicLabel(nls.localize({ key: 'miNewWindow', comment: ['&& denotes a mnemonic'] }, "New &&Window")), click: () => this.windowsMainService.openNewWindow(OpenContext.MENU) })); + + const open = new MenuItem(this.likeAction('workbench.action.files.openFileFolder', { label: this.mnemonicLabel(nls.localize({ key: 'miOpen', comment: ['&& denotes a mnemonic'] }, "&&Open...")), click: (menuItem, win, event) => this.windowsMainService.pickFileFolderAndOpen({ forceNewWindow: this.isOptionClick(event), telemetryExtraData: { from: telemetryFrom } }) })); + + const openWorkspace = new MenuItem(this.likeAction('workbench.action.openWorkspace', { label: this.mnemonicLabel(nls.localize({ key: 'miOpenWorkspace', comment: ['&& denotes a mnemonic'] }, "Open Wor&&kspace...")), click: (menuItem, win, event) => this.windowsMainService.pickWorkspaceAndOpen({ forceNewWindow: this.isOptionClick(event), telemetryExtraData: { from: telemetryFrom } }) })); + + const openRecentMenu = new Menu(); + this.setFallbackMenuById(openRecentMenu, 'Recent'); + const openRecent = new MenuItem({ label: this.mnemonicLabel(nls.localize({ key: 'miOpenRecent', comment: ['&& denotes a mnemonic'] }, "Open &&Recent")), submenu: openRecentMenu }); + + menu.append(newFile); + menu.append(newWindow); + menu.append(__separator__()); + menu.append(open); + menu.append(openWorkspace); + menu.append(openRecent); + + break; + + case 'Recent': + menu.append(this.createMenuItem(nls.localize({ key: 'miReopenClosedEditor', comment: ['&& denotes a mnemonic'] }, "&&Reopen Closed Editor"), 'workbench.action.reopenClosedEditor')); + + this.insertRecentMenuItems(menu); + + menu.append(__separator__()); + menu.append(this.createMenuItem(nls.localize({ key: 'miMore', comment: ['&& denotes a mnemonic'] }, "&&More..."), 'workbench.action.openRecent')); + menu.append(__separator__()); + menu.append(new MenuItem(this.likeAction('workbench.action.clearRecentFiles', { label: this.mnemonicLabel(nls.localize({ key: 'miClearRecentOpen', comment: ['&& denotes a mnemonic'] }, "&&Clear Recently Opened")), click: () => this.historyMainService.clearRecentlyOpened() }))); + + break; + + case 'Help': + let twitterItem: MenuItem; + if (product.twitterUrl) { + twitterItem = new MenuItem({ label: this.mnemonicLabel(nls.localize({ key: 'miTwitter', comment: ['&& denotes a mnemonic'] }, "&&Join us on Twitter")), click: () => this.openUrl(product.twitterUrl, 'openTwitterUrl') }); + } + + let featureRequestsItem: MenuItem; + if (product.requestFeatureUrl) { + featureRequestsItem = new MenuItem({ label: this.mnemonicLabel(nls.localize({ key: 'miUserVoice', comment: ['&& denotes a mnemonic'] }, "&&Search Feature Requests")), click: () => this.openUrl(product.requestFeatureUrl, 'openUserVoiceUrl') }); + } + + let reportIssuesItem: MenuItem; + if (product.reportIssueUrl) { + const label = nls.localize({ key: 'miReportIssue', comment: ['&& denotes a mnemonic', 'Translate this to "Report Issue in English" in all languages please!'] }, "Report &&Issue"); + + reportIssuesItem = new MenuItem({ label: this.mnemonicLabel(label), click: () => this.openUrl(product.reportIssueUrl, 'openReportIssues') }); + } + + let licenseItem: MenuItem; + if (product.privacyStatementUrl) { + licenseItem = new MenuItem({ + label: this.mnemonicLabel(nls.localize({ key: 'miLicense', comment: ['&& denotes a mnemonic'] }, "View &&License")), click: () => { + if (language) { + const queryArgChar = product.licenseUrl.indexOf('?') > 0 ? '&' : '?'; + this.openUrl(`${product.licenseUrl}${queryArgChar}lang=${language}`, 'openLicenseUrl'); + } else { + this.openUrl(product.licenseUrl, 'openLicenseUrl'); + } + } + }); + } + + let privacyStatementItem: MenuItem; + if (product.privacyStatementUrl) { + privacyStatementItem = new MenuItem({ + label: this.mnemonicLabel(nls.localize({ key: 'miPrivacyStatement', comment: ['&& denotes a mnemonic'] }, "&&Privacy Statement")), click: () => { + if (language) { + const queryArgChar = product.licenseUrl.indexOf('?') > 0 ? '&' : '?'; + this.openUrl(`${product.privacyStatementUrl}${queryArgChar}lang=${language}`, 'openPrivacyStatement'); + } else { + this.openUrl(product.privacyStatementUrl, 'openPrivacyStatement'); + } + } + }); + } + + if (twitterItem) { menu.append(twitterItem); } + if (featureRequestsItem) { menu.append(featureRequestsItem); } + if (reportIssuesItem) { menu.append(reportIssuesItem); } + if ((twitterItem || featureRequestsItem || reportIssuesItem) && (licenseItem || privacyStatementItem)) { menu.append(__separator__()); } + if (licenseItem) { menu.append(licenseItem); } + if (privacyStatementItem) { menu.append(privacyStatementItem); } + + break; + } + } + + private setMenu(menu: Electron.Menu, items: Array) { + items.forEach((item: MenubarMenuItem) => { + if (isMenubarMenuItemSeparator(item)) { + menu.append(__separator__()); + } else if (isMenubarMenuItemSubmenu(item)) { + const submenu = new Menu(); + const submenuItem = new MenuItem({ label: this.mnemonicLabel(item.label), submenu: submenu }); + this.setMenu(submenu, item.submenu.items); + menu.append(submenuItem); + } else if (isMenubarMenuItemAction(item)) { + if (item.id === 'workbench.action.openRecent') { + this.insertRecentMenuItems(menu); + } else if (item.id === 'workbench.action.showAboutDialog') { + this.insertCheckForUpdatesItems(menu); + } + + // Store the keybinding + if (item.keybinding) { + this.keybindings[item.id] = item.keybinding; + } else if (this.keybindings[item.id]) { + this.keybindings[item.id] = undefined; + } + + const menuItem = this.createMenuItem(item.label, item.id, item.enabled, item.checked); + menu.append(menuItem); + } + }); + } + + private setMenuById(menu: Electron.Menu, menuId: string): void { + if (this.menubarMenus && this.menubarMenus[menuId]) { + this.setMenu(menu, this.menubarMenus[menuId].items); + } + } + + private insertCheckForUpdatesItems(menu: Electron.Menu) { + const updateItems = this.getUpdateMenuItems(); + if (updateItems.length) { + updateItems.forEach(i => menu.append(i)); + menu.append(__separator__()); + } + } + + private insertRecentMenuItems(menu: Electron.Menu) { + const { workspaces, files } = this.historyMainService.getRecentlyOpened(); + + // Workspaces + if (workspaces.length > 0) { + for (let i = 0; i < Menubar.MAX_MENU_RECENT_ENTRIES && i < workspaces.length; i++) { + menu.append(this.createOpenRecentMenuItem(workspaces[i], 'openRecentWorkspace', false)); + } + + menu.append(__separator__()); + } + + // Files + if (files.length > 0) { + for (let i = 0; i < Menubar.MAX_MENU_RECENT_ENTRIES && i < files.length; i++) { + menu.append(this.createOpenRecentMenuItem(files[i], 'openRecentFile', true)); + } + + menu.append(__separator__()); + } + } + + private createOpenRecentMenuItem(workspace: IWorkspaceIdentifier | ISingleFolderWorkspaceIdentifier | string, commandId: string, isFile: boolean): Electron.MenuItem { + let label: string; + let uri: URI; + if (isSingleFolderWorkspaceIdentifier(workspace)) { + label = unmnemonicLabel(getWorkspaceLabel(workspace, this.environmentService, this.uriDisplayService, { verbose: true })); + uri = workspace; + } else if (isWorkspaceIdentifier(workspace)) { + label = getWorkspaceLabel(workspace, this.environmentService, this.uriDisplayService, { verbose: true }); + uri = URI.file(workspace.configPath); + } else { + uri = URI.file(workspace); + label = unmnemonicLabel(this.uriDisplayService.getLabel(uri)); + } + + return new MenuItem(this.likeAction(commandId, { + label, + click: (menuItem, win, event) => { + const openInNewWindow = this.isOptionClick(event); + const success = this.windowsMainService.open({ + context: OpenContext.MENU, + cli: this.environmentService.args, + urisToOpen: [uri], + forceNewWindow: openInNewWindow, + forceOpenWorkspaceAsFile: isFile + }).length > 0; + + if (!success) { + this.historyMainService.removeFromRecentlyOpened([workspace]); + } + } + }, false)); + } + + private isOptionClick(event: Electron.Event): boolean { + return event && ((!isMacintosh && (event.ctrlKey || event.shiftKey)) || (isMacintosh && (event.metaKey || event.altKey))); + } + + private setMacWindowMenu(macWindowMenu: Electron.Menu): void { + const minimize = new MenuItem({ label: nls.localize('mMinimize', "Minimize"), role: 'minimize', accelerator: 'Command+M', enabled: this.windowsMainService.getWindowCount() > 0 }); + const zoom = new MenuItem({ label: nls.localize('mZoom', "Zoom"), role: 'zoom', enabled: this.windowsMainService.getWindowCount() > 0 }); + const bringAllToFront = new MenuItem({ label: nls.localize('mBringToFront', "Bring All to Front"), role: 'front', enabled: this.windowsMainService.getWindowCount() > 0 }); + const switchWindow = this.createMenuItem(nls.localize({ key: 'miSwitchWindow', comment: ['&& denotes a mnemonic'] }, "Switch &&Window..."), 'workbench.action.switchWindow'); + + this.nativeTabMenuItems = []; + const nativeTabMenuItems: Electron.MenuItem[] = []; + if (this.currentEnableNativeTabs) { + const hasMultipleWindows = this.windowsMainService.getWindowCount() > 1; + + this.nativeTabMenuItems.push(this.createMenuItem(nls.localize('mShowPreviousTab', "Show Previous Tab"), 'workbench.action.showPreviousWindowTab', hasMultipleWindows)); + this.nativeTabMenuItems.push(this.createMenuItem(nls.localize('mShowNextTab', "Show Next Tab"), 'workbench.action.showNextWindowTab', hasMultipleWindows)); + this.nativeTabMenuItems.push(this.createMenuItem(nls.localize('mMoveTabToNewWindow', "Move Tab to New Window"), 'workbench.action.moveWindowTabToNewWindow', hasMultipleWindows)); + this.nativeTabMenuItems.push(this.createMenuItem(nls.localize('mMergeAllWindows', "Merge All Windows"), 'workbench.action.mergeAllWindowTabs', hasMultipleWindows)); + + nativeTabMenuItems.push(__separator__(), ...this.nativeTabMenuItems); + } else { + this.nativeTabMenuItems = []; + } + + [ + minimize, + zoom, + switchWindow, + ...nativeTabMenuItems, + __separator__(), + bringAllToFront + ].forEach(item => macWindowMenu.append(item)); + } + + private getUpdateMenuItems(): Electron.MenuItem[] { + const state = this.updateService.state; + + switch (state.type) { + case StateType.Uninitialized: + return []; + + case StateType.Idle: + return [new MenuItem({ + label: nls.localize('miCheckForUpdates', "Check for Updates..."), click: () => setTimeout(() => { + this.reportMenuActionTelemetry('CheckForUpdate'); + + const focusedWindow = this.windowsMainService.getFocusedWindow(); + const context = focusedWindow ? { windowId: focusedWindow.id } : null; + this.updateService.checkForUpdates(context); + }, 0) + })]; + + case StateType.CheckingForUpdates: + return [new MenuItem({ label: nls.localize('miCheckingForUpdates', "Checking For Updates..."), enabled: false })]; + + case StateType.AvailableForDownload: + return [new MenuItem({ + label: nls.localize('miDownloadUpdate', "Download Available Update"), click: () => { + this.updateService.downloadUpdate(); + } + })]; + + case StateType.Downloading: + return [new MenuItem({ label: nls.localize('miDownloadingUpdate', "Downloading Update..."), enabled: false })]; + + case StateType.Downloaded: + return [new MenuItem({ + label: nls.localize('miInstallUpdate', "Install Update..."), click: () => { + this.reportMenuActionTelemetry('InstallUpdate'); + this.updateService.applyUpdate(); + } + })]; + + case StateType.Updating: + return [new MenuItem({ label: nls.localize('miInstallingUpdate', "Installing Update..."), enabled: false })]; + + case StateType.Ready: + return [new MenuItem({ + label: nls.localize('miRestartToUpdate', "Restart to Update..."), click: () => { + this.reportMenuActionTelemetry('RestartToUpdate'); + this.updateService.quitAndInstall(); + } + })]; + } + } + + private createMenuItem(label: string, commandId: string | string[], enabled?: boolean, checked?: boolean): Electron.MenuItem; + private createMenuItem(label: string, click: () => void, enabled?: boolean, checked?: boolean): Electron.MenuItem; + private createMenuItem(arg1: string, arg2: any, arg3?: boolean, arg4?: boolean): Electron.MenuItem { + const label = this.mnemonicLabel(arg1); + const click: () => void = (typeof arg2 === 'function') ? arg2 : (menuItem: Electron.MenuItem, win: Electron.BrowserWindow, event: Electron.Event) => { + let commandId = arg2; + if (Array.isArray(arg2)) { + commandId = this.isOptionClick(event) ? arg2[1] : arg2[0]; // support alternative action if we got multiple action Ids and the option key was pressed while invoking + } + + this.runActionInRenderer(commandId); + }; + const enabled = typeof arg3 === 'boolean' ? arg3 : this.windowsMainService.getWindowCount() > 0; + const checked = typeof arg4 === 'boolean' ? arg4 : false; + + const options: Electron.MenuItemConstructorOptions = { + label, + click, + enabled + }; + + if (checked) { + options['type'] = 'checkbox'; + options['checked'] = checked; + } + + let commandId: string; + if (typeof arg2 === 'string') { + commandId = arg2; + } else if (Array.isArray(arg2)) { + commandId = arg2[0]; + } + + // Add role for special case menu items + if (isMacintosh) { + if (commandId === 'editor.action.clipboardCutAction') { + options['role'] = 'cut'; + } else if (commandId === 'editor.action.clipboardCopyAction') { + options['role'] = 'copy'; + } else if (commandId === 'editor.action.clipboardPasteAction') { + options['role'] = 'paste'; + } + } + + return new MenuItem(this.withKeybinding(commandId, options)); + } + + private runActionInRenderer(id: string): void { + // We make sure to not run actions when the window has no focus, this helps + // for https://github.com/Microsoft/vscode/issues/25907 and specifically for + // https://github.com/Microsoft/vscode/issues/11928 + const activeWindow = this.windowsMainService.getFocusedWindow(); + if (activeWindow) { + this.windowsMainService.sendToFocused('vscode:runAction', { id, from: 'menu' } as IRunActionInWindowRequest); + } + } + + private withKeybinding(commandId: string, options: Electron.MenuItemConstructorOptions): Electron.MenuItemConstructorOptions { + const binding = this.keybindings[commandId]; + + // Apply binding if there is one + if (binding && binding.label) { + + // if the binding is native, we can just apply it + if (binding.isNative) { + options.accelerator = binding.label; + } + + // the keybinding is not native so we cannot show it as part of the accelerator of + // the menu item. we fallback to a different strategy so that we always display it + else { + const bindingIndex = options.label.indexOf('['); + if (bindingIndex >= 0) { + options.label = `${options.label.substr(0, bindingIndex)} [${binding.label}]`; + } else { + options.label = `${options.label} [${binding.label}]`; + } + } + } + + // Unset bindings if there is none + else { + options.accelerator = void 0; + } + + return options; + } + + private likeAction(commandId: string, options: Electron.MenuItemConstructorOptions, setAccelerator = !options.accelerator): Electron.MenuItemConstructorOptions { + if (setAccelerator) { + options = this.withKeybinding(commandId, options); + } + + const originalClick = options.click; + options.click = (item, window, event) => { + this.reportMenuActionTelemetry(commandId); + if (originalClick) { + originalClick(item, window, event); + } + }; + + return options; + } + + private openUrl(url: string, id: string): void { + shell.openExternal(url); + this.reportMenuActionTelemetry(id); + } + + private reportMenuActionTelemetry(id: string): void { + /* __GDPR__ + "workbenchActionExecuted" : { + "id" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" }, + "from": { "classification": "SystemMetaData", "purpose": "FeatureInsight" } + } + */ + this.telemetryService.publicLog('workbenchActionExecuted', { id, from: telemetryFrom }); + } + + private mnemonicLabel(label: string): string { + return baseMnemonicLabel(label, !this.currentEnableMenuBarMnemonics); + } +} + +function __separator__(): Electron.MenuItem { + return new MenuItem({ type: 'separator' }); +} diff --git a/src/vs/code/electron-main/menus.ts b/src/vs/code/electron-main/menus.ts index 7d416cc788..e7b93b2dea 100644 --- a/src/vs/code/electron-main/menus.ts +++ b/src/vs/code/electron-main/menus.ts @@ -9,7 +9,7 @@ import * as nls from 'vs/nls'; import { isMacintosh, isLinux, isWindows, language } from 'vs/base/common/platform'; import * as arrays from 'vs/base/common/arrays'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; -import { ipcMain as ipc, app, shell, Menu, MenuItem, BrowserWindow } from 'electron'; +import { app, shell, Menu, MenuItem, BrowserWindow } from 'electron'; import { OpenContext, IRunActionInWindowRequest, IWindowsService } from 'vs/platform/windows/common/windows'; import { IConfigurationService, IConfigurationChangeEvent } from 'vs/platform/configuration/common/configuration'; import { AutoSaveConfiguration } from 'vs/platform/files/common/files'; @@ -18,16 +18,13 @@ import { IUpdateService, StateType } from 'vs/platform/update/common/update'; import product from 'vs/platform/node/product'; import { RunOnceScheduler } from 'vs/base/common/async'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { mnemonicMenuLabel as baseMnemonicLabel, unmnemonicLabel, getPathLabel } from 'vs/base/common/labels'; +import { mnemonicMenuLabel as baseMnemonicLabel, unmnemonicLabel } from 'vs/base/common/labels'; import { KeybindingsResolver } from 'vs/code/electron-main/keyboard'; import { IWindowsMainService, IWindowsCountChangedEvent } from 'vs/platform/windows/electron-main/windows'; import { IHistoryMainService } from 'vs/platform/history/common/history'; -import { IWorkspaceIdentifier, getWorkspaceLabel, ISingleFolderWorkspaceIdentifier, isSingleFolderWorkspaceIdentifier } from 'vs/platform/workspaces/common/workspaces'; - -interface IExtensionViewlet { - id: string; - label: string; -} +import { IWorkspaceIdentifier, getWorkspaceLabel, ISingleFolderWorkspaceIdentifier, isSingleFolderWorkspaceIdentifier, isWorkspaceIdentifier } from 'vs/platform/workspaces/common/workspaces'; +import URI from 'vs/base/common/uri'; +import { IUriDisplayService } from 'vs/platform/uriDisplay/common/uriDisplay'; interface IMenuItemClickHandler { inDevTools: (contents: Electron.WebContents) => void; @@ -57,8 +54,6 @@ export class CodeMenu { private keybindingsResolver: KeybindingsResolver; - private extensionViewlets: IExtensionViewlet[]; - private closeFolder: Electron.MenuItem; private closeWorkspace: Electron.MenuItem; @@ -72,9 +67,9 @@ export class CodeMenu { @IWindowsService private windowsService: IWindowsService, @IEnvironmentService private environmentService: IEnvironmentService, @ITelemetryService private telemetryService: ITelemetryService, - @IHistoryMainService private historyMainService: IHistoryMainService + @IHistoryMainService private historyMainService: IHistoryMainService, + @IUriDisplayService private uriDisplayService: IUriDisplayService ) { - this.extensionViewlets = []; this.nativeTabMenuItems = []; this.menuUpdater = new RunOnceScheduler(() => this.doUpdateMenu(), 0); @@ -99,21 +94,6 @@ export class CodeMenu { this.windowsMainService.onWindowReady(() => this.updateWorkspaceMenuItems()); this.windowsMainService.onWindowClose(() => this.updateWorkspaceMenuItems()); - // Listen to extension viewlets - ipc.on('vscode:extensionViewlets', (event: any, rawExtensionViewlets: string) => { - let extensionViewlets: IExtensionViewlet[] = []; - try { - extensionViewlets = JSON.parse(rawExtensionViewlets); - } catch (error) { - // Should not happen - } - - if (extensionViewlets.length) { - this.extensionViewlets = extensionViewlets; - this.updateMenu(); - } - }); - // Update when auto save config changes this.configurationService.onDidChangeConfiguration(e => this.onConfigurationUpdated(e)); @@ -217,7 +197,7 @@ export class CodeMenu { private updateWorkspaceMenuItems(): void { const window = this.windowsMainService.getLastActiveWindow(); const isInWorkspaceContext = window && !!window.openedWorkspace; - const isInFolderContext = window && !!window.openedFolderPath; + const isInFolderContext = window && !!window.openedFolderUri; this.closeWorkspace.visible = isInWorkspaceContext; this.closeFolder.visible = !isInWorkspaceContext; @@ -410,7 +390,8 @@ export class CodeMenu { const saveAllFiles = this.createMenuItem(nls.localize({ key: 'miSaveAll', comment: ['&& denotes a mnemonic'] }, "Save A&&ll"), 'workbench.action.files.saveAll'); const autoSaveEnabled = [AutoSaveConfiguration.AFTER_DELAY, AutoSaveConfiguration.ON_FOCUS_CHANGE, AutoSaveConfiguration.ON_WINDOW_CHANGE].some(s => this.currentAutoSaveSetting === s); - const autoSave = new MenuItem(this.likeAction('vscode.toggleAutoSave', { label: this.mnemonicLabel(nls.localize('miAutoSave', "Auto Save")), type: 'checkbox', checked: autoSaveEnabled, enabled: this.windowsMainService.getWindowCount() > 0, click: () => this.windowsMainService.sendToFocused('vscode.toggleAutoSave') }, false)); + + const autoSave = this.createMenuItem(this.mnemonicLabel(nls.localize('miAutoSave', "Auto Save")), 'workbench.action.toggleAutoSave', this.windowsMainService.getWindowCount() > 0, autoSaveEnabled); // {{SQL CARBON EDIT}} const installVsixExtension = this.createMenuItem(nls.localize({ key: 'miinstallVsix', comment: ['&& denotes a mnemonic'] }, "Install Extension from VSIX Package"), 'workbench.extensions.action.installVSIX'); @@ -521,13 +502,16 @@ export class CodeMenu { private createOpenRecentMenuItem(workspace: IWorkspaceIdentifier | ISingleFolderWorkspaceIdentifier | string, commandId: string, isFile: boolean): Electron.MenuItem { let label: string; - let path: string; - if (isSingleFolderWorkspaceIdentifier(workspace) || typeof workspace === 'string') { - label = unmnemonicLabel(getPathLabel(workspace, null, this.environmentService)); - path = workspace; + let uri: URI; + if (isSingleFolderWorkspaceIdentifier(workspace)) { + label = unmnemonicLabel(getWorkspaceLabel(workspace, this.environmentService, this.uriDisplayService, { verbose: true })); + uri = workspace; + } else if (isWorkspaceIdentifier(workspace)) { + label = getWorkspaceLabel(workspace, this.environmentService, this.uriDisplayService, { verbose: true }); + uri = URI.file(workspace.configPath); } else { - label = getWorkspaceLabel(workspace, this.environmentService, { verbose: true }); - path = workspace.configPath; + uri = URI.file(workspace); + label = unmnemonicLabel(this.uriDisplayService.getLabel(uri)); } return new MenuItem(this.likeAction(commandId, { @@ -537,12 +521,13 @@ export class CodeMenu { const success = this.windowsMainService.open({ context: OpenContext.MENU, cli: this.environmentService.args, - pathsToOpen: [path], forceNewWindow: openInNewWindow, + urisToOpen: [uri], + forceNewWindow: openInNewWindow, forceOpenWorkspaceAsFile: isFile }).length > 0; if (!success) { - this.historyMainService.removeFromRecentlyOpened([isSingleFolderWorkspaceIdentifier(workspace) ? workspace : workspace.configPath]); + this.historyMainService.removeFromRecentlyOpened([workspace]); } } }, false)); @@ -695,6 +680,9 @@ export class CodeMenu { */ private setViewMenu(viewMenu: Electron.Menu): void { + const commands = this.createMenuItem(nls.localize({ key: 'miCommandPalette', comment: ['&& denotes a mnemonic'] }, "&&Command Palette..."), 'workbench.action.showCommands'); + const openView = this.createMenuItem(nls.localize({ key: 'miOpenView', comment: ['&& denotes a mnemonic'] }, "&&Open View..."), 'workbench.action.openView'); + // {{SQL CARBON EDIT}} const servers = this.createMenuItem(nls.localize({ key: 'miViewRegisteredServers', comment: ['&& denotes a mnemonic'] }, "&&Servers"), 'workbench.view.connections'); const tasks = this.createMenuItem(nls.localize({ key: 'miViewTasks', comment: ['&& denotes a mnemonic'] }, "&&Tasks"), 'workbench.view.taskHistory'); @@ -704,33 +692,23 @@ export class CodeMenu { // {{SQL CARBON EDIT}} // const debug = this.createMenuItem(nls.localize({ key: 'miViewDebug', comment: ['&& denotes a mnemonic'] }, "&&Debug"), 'workbench.view.debug'); const extensions = this.createMenuItem(nls.localize({ key: 'miViewExtensions', comment: ['&& denotes a mnemonic'] }, "E&&xtensions"), 'workbench.view.extensions'); + + // Panels const output = this.createMenuItem(nls.localize({ key: 'miToggleOutput', comment: ['&& denotes a mnemonic'] }, "&&Output"), 'workbench.action.output.toggleOutput'); // {{SQL CARBON EDIT}} // const debugConsole = this.createMenuItem(nls.localize({ key: 'miToggleDebugConsole', comment: ['&& denotes a mnemonic'] }, "De&&bug Console"), 'workbench.debug.action.toggleRepl'); - const integratedTerminal = this.createMenuItem(nls.localize({ key: 'miToggleIntegratedTerminal', comment: ['&& denotes a mnemonic'] }, "&&Integrated Terminal"), 'workbench.action.terminal.toggleTerminal'); + const terminal = this.createMenuItem(nls.localize({ key: 'miToggleTerminal', comment: ['&& denotes a mnemonic'] }, "&&Terminal"), 'workbench.action.terminal.toggleTerminal'); const problems = this.createMenuItem(nls.localize({ key: 'miMarker', comment: ['&& denotes a mnemonic'] }, "&&Problems"), 'workbench.actions.view.problems'); - let additionalViewlets: Electron.MenuItem; - if (this.extensionViewlets.length) { - const additionalViewletsMenu = new Menu(); + // Appearance - this.extensionViewlets.forEach(viewlet => { - additionalViewletsMenu.append(this.createMenuItem(viewlet.label, viewlet.id)); - }); - - additionalViewlets = new MenuItem({ label: this.mnemonicLabel(nls.localize({ key: 'miAdditionalViews', comment: ['&& denotes a mnemonic'] }, "Additional &&Views")), submenu: additionalViewletsMenu, enabled: true }); - } - - const commands = this.createMenuItem(nls.localize({ key: 'miCommandPalette', comment: ['&& denotes a mnemonic'] }, "&&Command Palette..."), 'workbench.action.showCommands'); - const openView = this.createMenuItem(nls.localize({ key: 'miOpenView', comment: ['&& denotes a mnemonic'] }, "&&Open View..."), 'workbench.action.openView'); + const appearanceMenu = new Menu(); const fullscreen = new MenuItem(this.withKeybinding('workbench.action.toggleFullScreen', { label: this.mnemonicLabel(nls.localize({ key: 'miToggleFullScreen', comment: ['&& denotes a mnemonic'] }, "Toggle &&Full Screen")), click: () => this.windowsMainService.getLastActiveWindow().toggleFullScreen(), enabled: this.windowsMainService.getWindowCount() > 0 })); const toggleZenMode = this.createMenuItem(nls.localize('miToggleZenMode', "Toggle Zen Mode"), 'workbench.action.toggleZenMode'); const toggleCenteredLayout = this.createMenuItem(nls.localize('miToggleCenteredLayout', "Toggle Centered Layout"), 'workbench.action.toggleCenteredLayout'); const toggleMenuBar = this.createMenuItem(nls.localize({ key: 'miToggleMenuBar', comment: ['&& denotes a mnemonic'] }, "Toggle Menu &&Bar"), 'workbench.action.toggleMenuBar'); - // {{SQL CARBON EDIT}} - //const splitEditor = this.createMenuItem(nls.localize({ key: 'miSplitEditor', comment: ['&& denotes a mnemonic'] }, "Split &&Editor"), 'workbench.action.splitEditor'); - const toggleEditorLayout = this.createMenuItem(nls.localize({ key: 'miToggleEditorLayout', comment: ['&& denotes a mnemonic'] }, "Toggle Editor Group &&Layout"), 'workbench.action.toggleEditorGroupLayout'); + const toggleSidebar = this.createMenuItem(nls.localize({ key: 'miToggleSidebar', comment: ['&& denotes a mnemonic'] }, "&&Toggle Side Bar"), 'workbench.action.toggleSidebarVisibility'); let moveSideBarLabel: string; @@ -741,9 +719,7 @@ export class CodeMenu { } const moveSidebar = this.createMenuItem(moveSideBarLabel, 'workbench.action.toggleSidebarPosition'); - - // {{SQL CARBON EDIT}} - // const togglePanel = this.createMenuItem(nls.localize({ key: 'miTogglePanel', comment: ['&& denotes a mnemonic'] }, "Toggle &&Panel"), 'workbench.action.togglePanel'); + const togglePanel = this.createMenuItem(nls.localize({ key: 'miTogglePanel', comment: ['&& denotes a mnemonic'] }, "Toggle &&Panel"), 'workbench.action.togglePanel'); let statusBarLabel: string; if (this.currentStatusbarVisible) { @@ -761,20 +737,82 @@ export class CodeMenu { } const toggleActivtyBar = this.createMenuItem(activityBarLabel, 'workbench.action.toggleActivityBarVisibility'); + const zoomIn = this.createMenuItem(nls.localize({ key: 'miZoomIn', comment: ['&& denotes a mnemonic'] }, "&&Zoom In"), 'workbench.action.zoomIn'); + const zoomOut = this.createMenuItem(nls.localize({ key: 'miZoomOut', comment: ['&& denotes a mnemonic'] }, "Zoom O&&ut"), 'workbench.action.zoomOut'); + const resetZoom = this.createMenuItem(nls.localize({ key: 'miZoomReset', comment: ['&& denotes a mnemonic'] }, "&&Reset Zoom"), 'workbench.action.zoomReset'); // {{SQL CARBON EDIT}} + arrays.coalesce([ + fullscreen, + toggleZenMode, + toggleCenteredLayout, + isWindows || isLinux ? toggleMenuBar : void 0, + __separator__(), + moveSidebar, + toggleSidebar, + togglePanel, + toggleStatusbar, + toggleActivtyBar, + __separator__(), + zoomIn, + zoomOut, + resetZoom + ]).forEach(item => appearanceMenu.append(item)); + + const appearance = new MenuItem({ label: this.mnemonicLabel(nls.localize({ key: 'miAppearance', comment: ['&& denotes a mnemonic'] }, "&&Appearance")), submenu: appearanceMenu }); + + // Editor Layout + + const editorLayoutMenu = new Menu(); + + const splitEditorUp = this.createMenuItem(nls.localize({ key: 'miSplitEditorUp', comment: ['&& denotes a mnemonic'] }, "Split &&Up"), 'workbench.action.splitEditorUp'); + const splitEditorDown = this.createMenuItem(nls.localize({ key: 'miSplitEditorDown', comment: ['&& denotes a mnemonic'] }, "Split &&Down"), 'workbench.action.splitEditorDown'); + const splitEditorLeft = this.createMenuItem(nls.localize({ key: 'miSplitEditorLeft', comment: ['&& denotes a mnemonic'] }, "Split &&Left"), 'workbench.action.splitEditorLeft'); + const splitEditorRight = this.createMenuItem(nls.localize({ key: 'miSplitEditorRight', comment: ['&& denotes a mnemonic'] }, "Split &&Right"), 'workbench.action.splitEditorRight'); + + const singleColumnEditorLayout = this.createMenuItem(nls.localize({ key: 'miSingleColumnEditorLayout', comment: ['&& denotes a mnemonic'] }, "&&Single"), 'workbench.action.editorLayoutSingle'); + const twoColumnsEditorLayout = this.createMenuItem(nls.localize({ key: 'miTwoColumnsEditorLayout', comment: ['&& denotes a mnemonic'] }, "&&Two Columns"), 'workbench.action.editorLayoutTwoColumns'); + const threeColumnsEditorLayout = this.createMenuItem(nls.localize({ key: 'miThreeColumnsEditorLayout', comment: ['&& denotes a mnemonic'] }, "T&&hree Columns"), 'workbench.action.editorLayoutThreeColumns'); + const twoRowsEditorLayout = this.createMenuItem(nls.localize({ key: 'miTwoRowsEditorLayout', comment: ['&& denotes a mnemonic'] }, "T&&wo Rows"), 'workbench.action.editorLayoutTwoRows'); + const threeRowsEditorLayout = this.createMenuItem(nls.localize({ key: 'miThreeRowsEditorLayout', comment: ['&& denotes a mnemonic'] }, "Three &&Rows"), 'workbench.action.editorLayoutThreeRows'); + const twoByTwoGridEditorLayout = this.createMenuItem(nls.localize({ key: 'miTwoByTwoGridEditorLayout', comment: ['&& denotes a mnemonic'] }, "&&Grid (2x2)"), 'workbench.action.editorLayoutTwoByTwoGrid'); + const twoRowsRightEditorLayout = this.createMenuItem(nls.localize({ key: 'miTwoRowsRightEditorLayout', comment: ['&& denotes a mnemonic'] }, "Two R&&ows Right"), 'workbench.action.editorLayoutTwoRowsRight'); + const twoColumnsBottomEditorLayout = this.createMenuItem(nls.localize({ key: 'miTwoColumnsBottomEditorLayout', comment: ['&& denotes a mnemonic'] }, "Two &&Columns Bottom"), 'workbench.action.editorLayoutTwoColumnsBottom'); + + const toggleEditorLayout = this.createMenuItem(nls.localize({ key: 'miToggleEditorLayout', comment: ['&& denotes a mnemonic'] }, "Flip &&Layout"), 'workbench.action.toggleEditorGroupLayout'); + + [ + splitEditorUp, + splitEditorDown, + splitEditorLeft, + splitEditorRight, + __separator__(), + singleColumnEditorLayout, + twoColumnsEditorLayout, + threeColumnsEditorLayout, + twoRowsEditorLayout, + threeRowsEditorLayout, + twoByTwoGridEditorLayout, + twoRowsRightEditorLayout, + twoColumnsBottomEditorLayout, + __separator__(), + toggleEditorLayout + ].forEach(item => editorLayoutMenu.append(item)); + + const editorLayout = new MenuItem({ label: this.mnemonicLabel(nls.localize({ key: 'miEditorLayout', comment: ['&& denotes a mnemonic'] }, "Editor &&Layout")), submenu: editorLayoutMenu }); + // const toggleWordWrap = this.createMenuItem(nls.localize({ key: 'miToggleWordWrap', comment: ['&& denotes a mnemonic'] }, "Toggle &&Word Wrap"), 'editor.action.toggleWordWrap'); // const toggleMinimap = this.createMenuItem(nls.localize({ key: 'miToggleMinimap', comment: ['&& denotes a mnemonic'] }, "Toggle &&Minimap"), 'editor.action.toggleMinimap'); // const toggleRenderWhitespace = this.createMenuItem(nls.localize({ key: 'miToggleRenderWhitespace', comment: ['&& denotes a mnemonic'] }, "Toggle &&Render Whitespace"), 'editor.action.toggleRenderWhitespace'); // const toggleRenderControlCharacters = this.createMenuItem(nls.localize({ key: 'miToggleRenderControlCharacters', comment: ['&& denotes a mnemonic'] }, "Toggle &&Control Characters"), 'editor.action.toggleRenderControlCharacter'); - - const zoomIn = this.createMenuItem(nls.localize({ key: 'miZoomIn', comment: ['&& denotes a mnemonic'] }, "&&Zoom In"), 'workbench.action.zoomIn'); - const zoomOut = this.createMenuItem(nls.localize({ key: 'miZoomOut', comment: ['&& denotes a mnemonic'] }, "Zoom O&&ut"), 'workbench.action.zoomOut'); - const resetZoom = this.createMenuItem(nls.localize({ key: 'miZoomReset', comment: ['&& denotes a mnemonic'] }, "&&Reset Zoom"), 'workbench.action.zoomReset'); + // const toggleBreadcrumbs = this.createMenuItem(nls.localize({ key: 'miToggleBreadcrumbs', comment: ['&& denotes a mnemonic'] }, "Toggle &&Breadcrumbs"), 'breadcrumbs.toggle'); arrays.coalesce([ commands, openView, __separator__(), + appearance, + editorLayout, + __separator__(), servers, tasks, explorer, @@ -783,37 +821,19 @@ export class CodeMenu { // {{SQL CARBON EDIT}} // debug, extensions, - additionalViewlets, __separator__(), output, problems, // {{SQL CARBON EDIT}} // debugConsole, - integratedTerminal, - __separator__(), - fullscreen, - toggleZenMode, - toggleCenteredLayout, - isWindows || isLinux ? toggleMenuBar : void 0, - __separator__(), + terminal, + //__separator__(), // {{SQL CARBON EDIT}} - //splitEditor, - toggleEditorLayout, - moveSidebar, - toggleSidebar, - // togglePanel, - toggleStatusbar, - toggleActivtyBar, - // {{SQL CARBON EDIT}} - // __separator__(), // toggleWordWrap, // toggleMinimap, // toggleRenderWhitespace, // toggleRenderControlCharacters, - __separator__(), - zoomIn, - zoomOut, - resetZoom + // toggleBreadcrumbs ]).forEach(item => viewMenu.append(item)); } @@ -840,19 +860,33 @@ export class CodeMenu { const switchGroupMenu = new Menu(); - const focusFirstGroup = this.createMenuItem(nls.localize({ key: 'miFocusFirstGroup', comment: ['&& denotes a mnemonic'] }, "&&First Group"), 'workbench.action.focusFirstEditorGroup'); - const focusSecondGroup = this.createMenuItem(nls.localize({ key: 'miFocusSecondGroup', comment: ['&& denotes a mnemonic'] }, "&&Second Group"), 'workbench.action.focusSecondEditorGroup'); - const focusThirdGroup = this.createMenuItem(nls.localize({ key: 'miFocusThirdGroup', comment: ['&& denotes a mnemonic'] }, "&&Third Group"), 'workbench.action.focusThirdEditorGroup'); + const focusFirstGroup = this.createMenuItem(nls.localize({ key: 'miFocusFirstGroup', comment: ['&& denotes a mnemonic'] }, "Group &&1"), 'workbench.action.focusFirstEditorGroup'); + const focusSecondGroup = this.createMenuItem(nls.localize({ key: 'miFocusSecondGroup', comment: ['&& denotes a mnemonic'] }, "Group &&2"), 'workbench.action.focusSecondEditorGroup'); + const focusThirdGroup = this.createMenuItem(nls.localize({ key: 'miFocusThirdGroup', comment: ['&& denotes a mnemonic'] }, "Group &&3"), 'workbench.action.focusThirdEditorGroup'); + const focusFourthGroup = this.createMenuItem(nls.localize({ key: 'miFocusFourthGroup', comment: ['&& denotes a mnemonic'] }, "Group &&4"), 'workbench.action.focusFourthEditorGroup'); + const focusFifthGroup = this.createMenuItem(nls.localize({ key: 'miFocusFifthGroup', comment: ['&& denotes a mnemonic'] }, "Group &&5"), 'workbench.action.focusFifthEditorGroup'); const nextGroup = this.createMenuItem(nls.localize({ key: 'miNextGroup', comment: ['&& denotes a mnemonic'] }, "&&Next Group"), 'workbench.action.focusNextGroup'); const previousGroup = this.createMenuItem(nls.localize({ key: 'miPreviousGroup', comment: ['&& denotes a mnemonic'] }, "&&Previous Group"), 'workbench.action.focusPreviousGroup'); + const focusLeftGroup = this.createMenuItem(nls.localize({ key: 'miFocusLeftGroup', comment: ['&& denotes a mnemonic'] }, "Group &&Left"), 'workbench.action.focusLeftGroup'); + const focusRightGroup = this.createMenuItem(nls.localize({ key: 'miFocusRightGroup', comment: ['&& denotes a mnemonic'] }, "Group &&Right"), 'workbench.action.focusRightGroup'); + const focusAboveGroup = this.createMenuItem(nls.localize({ key: 'miFocusAboveGroup', comment: ['&& denotes a mnemonic'] }, "Group &&Above"), 'workbench.action.focusAboveGroup'); + const focusBelowGroup = this.createMenuItem(nls.localize({ key: 'miFocusBelowGroup', comment: ['&& denotes a mnemonic'] }, "Group &&Below"), 'workbench.action.focusBelowGroup'); + [ focusFirstGroup, focusSecondGroup, focusThirdGroup, + focusFourthGroup, + focusFifthGroup, __separator__(), nextGroup, - previousGroup + previousGroup, + __separator__(), + focusAboveGroup, + focusBelowGroup, + focusLeftGroup, + focusRightGroup ].forEach(item => switchGroupMenu.append(item)); const switchGroup = new MenuItem({ label: this.mnemonicLabel(nls.localize({ key: 'miSwitchGroup', comment: ['&& denotes a mnemonic'] }, "Switch &&Group")), submenu: switchGroupMenu, enabled: true }); @@ -901,7 +935,7 @@ export class CodeMenu { const toggleBreakpoint = this.createMenuItem(nls.localize({ key: 'miToggleBreakpoint', comment: ['&& denotes a mnemonic'] }, "Toggle &&Breakpoint"), 'editor.debug.action.toggleBreakpoint'); const breakpointsMenu = new Menu(); breakpointsMenu.append(this.createMenuItem(nls.localize({ key: 'miConditionalBreakpoint', comment: ['&& denotes a mnemonic'] }, "&&Conditional Breakpoint..."), 'editor.debug.action.conditionalBreakpoint')); - breakpointsMenu.append(this.createMenuItem(nls.localize({ key: 'miColumnBreakpoint', comment: ['&& denotes a mnemonic'] }, "C&&olumn Breakpoint"), 'editor.debug.action.toggleColumnBreakpoint')); + breakpointsMenu.append(this.createMenuItem(nls.localize({ key: 'miInlineBreakpoint', comment: ['&& denotes a mnemonic'] }, "Inline Breakp&&oint"), 'editor.debug.action.toggleInlineBreakpoint')); breakpointsMenu.append(this.createMenuItem(nls.localize({ key: 'miFunctionBreakpoint', comment: ['&& denotes a mnemonic'] }, "&&Function Breakpoint..."), 'workbench.debug.viewlet.action.addFunctionBreakpointAction')); breakpointsMenu.append(this.createMenuItem(nls.localize({ key: 'miLogPoint', comment: ['&& denotes a mnemonic'] }, "&&Logpoint..."), 'editor.debug.action.toggleLogPoint')); const newBreakpoints = new MenuItem({ label: this.mnemonicLabel(nls.localize({ key: 'miNewBreakpoint', comment: ['&& denotes a mnemonic'] }, "&&New Breakpoint")), submenu: breakpointsMenu }); @@ -969,7 +1003,7 @@ export class CodeMenu { const w = this.windowsMainService.getFocusedWindow(); if (w && w.win) { const contents = w.win.webContents; - if (w.hasHiddenTitleBarStyle() && !w.win.isFullScreen() && !contents.isDevToolsOpened()) { + if (isMacintosh && w.hasHiddenTitleBarStyle() && !w.win.isFullScreen() && !contents.isDevToolsOpened()) { contents.openDevTools({ mode: 'undocked' }); // due to https://github.com/electron/electron/issues/3647 } else { contents.toggleDevTools(); @@ -1107,7 +1141,10 @@ export class CodeMenu { width: 450, height: 300, show: true, - title: nls.localize('accessibilityOptionsWindowTitle', "Accessibility Options") + title: nls.localize('accessibilityOptionsWindowTitle', "Accessibility Options"), + webPreferences: { + disableBlinkFeatures: 'Auxclick' + } }); win.setMenuBarVisibility(false); diff --git a/src/vs/code/electron-main/window.ts b/src/vs/code/electron-main/window.ts index b7f6972672..e3d56be482 100644 --- a/src/vs/code/electron-main/window.ts +++ b/src/vs/code/electron-main/window.ts @@ -23,7 +23,7 @@ import { isLinux, isMacintosh, isWindows } from 'vs/base/common/platform'; import { ICodeWindow, IWindowState, WindowMode } from 'vs/platform/windows/electron-main/windows'; import { IWorkspaceIdentifier, IWorkspacesMainService } from 'vs/platform/workspaces/common/workspaces'; import { IBackupMainService } from 'vs/platform/backup/common/backup'; -import { ICommandAction } from 'vs/platform/actions/common/actions'; +import { ISerializableCommandAction } from 'vs/platform/actions/common/actions'; import { mark, exportEntries } from 'vs/base/common/performance'; import { resolveMarketplaceHeaders } from 'vs/platform/extensionManagement/node/extensionGalleryService'; @@ -55,8 +55,8 @@ interface ITouchBarSegment extends Electron.SegmentedControlSegment { export class CodeWindow implements ICodeWindow { - public static readonly themeStorageKey = 'theme'; - public static readonly themeBackgroundStorageKey = 'themeBackground'; + static readonly themeStorageKey = 'theme'; + static readonly themeBackgroundStorageKey = 'themeBackground'; private static readonly DEFAULT_BG_LIGHT = '#FFFFFF'; private static readonly DEFAULT_BG_DARK = '#1E1E1E'; @@ -166,8 +166,8 @@ export class CodeWindow implements ICodeWindow { } let useCustomTitleStyle = false; - // {{SQL CARBON EDIT}} + // if (isMacintosh) { // turn-off custom menus to avoid bug calculating size of SQL editor // // if (isMacintosh && (!windowConfig || !windowConfig.titleBarStyle || windowConfig.titleBarStyle === 'custom')) { @@ -184,29 +184,15 @@ export class CodeWindow implements ICodeWindow { if (useCustomTitleStyle) { options.titleBarStyle = 'hidden'; this.hiddenTitleBarStyle = true; + if (!isMacintosh) { + options.frame = false; + } } // Create the browser window. this._win = new BrowserWindow(options); this._id = this._win.id; - // Bug in Electron (https://github.com/electron/electron/issues/10862). On multi-monitor setups, - // it can happen that the position we set to the window is not the correct one on the display. - // To workaround, we ask the window for its position and set it again if not matching. - // This only applies if the window is not fullscreen or maximized and multiple monitors are used. - if (isWindows && !isFullscreenOrMaximized) { - try { - if (screen.getAllDisplays().length > 1) { - const [x, y] = this._win.getPosition(); - if (x !== this.windowState.x || y !== this.windowState.y) { - this._win.setPosition(this.windowState.x, this.windowState.y, false); - } - } - } catch (err) { - this.logService.warn(`Unexpected error fixing window position on windows with multiple windows: ${err}\n${err.stack}`); - } - } - if (useCustomTitleStyle) { this._win.setSheetOffset(22); // offset dialogs by the height of the custom title bar if we have any } @@ -226,35 +212,35 @@ export class CodeWindow implements ICodeWindow { this._lastFocusTime = Date.now(); // since we show directly, we need to set the last focus time too } - public hasHiddenTitleBarStyle(): boolean { + hasHiddenTitleBarStyle(): boolean { return this.hiddenTitleBarStyle; } - public get isExtensionDevelopmentHost(): boolean { + get isExtensionDevelopmentHost(): boolean { return !!this.config.extensionDevelopmentPath; } - public get isExtensionTestHost(): boolean { + get isExtensionTestHost(): boolean { return !!this.config.extensionTestsPath; } - public get extensionDevelopmentPath(): string { + get extensionDevelopmentPath(): string { return this.config.extensionDevelopmentPath; } - public get config(): IWindowConfiguration { + get config(): IWindowConfiguration { return this.currentConfig; } - public get id(): number { + get id(): number { return this._id; } - public get win(): Electron.BrowserWindow { + get win(): Electron.BrowserWindow { return this._win; } - public setRepresentedFilename(filename: string): void { + setRepresentedFilename(filename: string): void { if (isMacintosh) { this.win.setRepresentedFilename(filename); } else { @@ -262,7 +248,7 @@ export class CodeWindow implements ICodeWindow { } } - public getRepresentedFilename(): string { + getRepresentedFilename(): string { if (isMacintosh) { return this.win.getRepresentedFilename(); } @@ -270,7 +256,7 @@ export class CodeWindow implements ICodeWindow { return this.representedFilename; } - public focus(): void { + focus(): void { if (!this._win) { return; } @@ -282,23 +268,23 @@ export class CodeWindow implements ICodeWindow { this._win.focus(); } - public get lastFocusTime(): number { + get lastFocusTime(): number { return this._lastFocusTime; } - public get backupPath(): string { + get backupPath(): string { return this.currentConfig ? this.currentConfig.backupPath : void 0; } - public get openedWorkspace(): IWorkspaceIdentifier { + get openedWorkspace(): IWorkspaceIdentifier { return this.currentConfig ? this.currentConfig.workspace : void 0; } - public get openedFolderPath(): string { - return this.currentConfig ? this.currentConfig.folderPath : void 0; + get openedFolderUri(): URI { + return this.currentConfig ? this.currentConfig.folderUri : void 0; } - public setReady(): void { + setReady(): void { this._readyState = ReadyState.READY; // inform all waiting promises that we are ready now @@ -307,7 +293,7 @@ export class CodeWindow implements ICodeWindow { } } - public ready(): TPromise { + ready(): TPromise { return new TPromise((c) => { if (this._readyState === ReadyState.READY) { return c(this); @@ -318,7 +304,7 @@ export class CodeWindow implements ICodeWindow { }); } - public get readyState(): ReadyState { + get readyState(): ReadyState { return this._readyState; } @@ -371,7 +357,7 @@ export class CodeWindow implements ICodeWindow { } // To prevent flashing, we set the window visible after the page has finished to load but before Code is loaded - if (!this._win.isVisible()) { + if (this._win && !this._win.isVisible()) { if (this.windowState.mode === WindowMode.Maximized) { this._win.maximize(); } @@ -397,6 +383,23 @@ export class CodeWindow implements ICodeWindow { this._lastFocusTime = Date.now(); }); + // Window (Un)Maximize + this._win.on('maximize', (e) => { + if (this.currentConfig) { + this.currentConfig.maximized = true; + } + + app.emit('browser-window-maximize', e, this._win); + }); + + this._win.on('unmaximize', (e) => { + if (this.currentConfig) { + this.currentConfig.maximized = false; + } + + app.emit('browser-window-unmaximize', e, this._win); + }); + // Window Fullscreen this._win.on('enter-full-screen', () => { this.sendWhenReady('vscode:enterFullScreen'); @@ -497,7 +500,7 @@ export class CodeWindow implements ICodeWindow { }); } - public load(config: IWindowConfiguration, isReload?: boolean): void { + load(config: IWindowConfiguration, isReload?: boolean, disableExtensions?: boolean): void { // If this is the first time the window is loaded, we associate the paths // directly with the window because we assume the loading will just work @@ -514,6 +517,13 @@ export class CodeWindow implements ICodeWindow { this._readyState = ReadyState.NAVIGATING; } + // Add disable-extensions to the config, but do not preserve it on currentConfig or + // pendingLoadConfig so that it is applied only on this load + const configuration = objects.assign({}, config); + if (disableExtensions !== undefined) { + configuration['disable-extensions'] = disableExtensions; + } + // Clear Document Edited if needed if (isMacintosh && this._win.isDocumentEdited()) { if (!isReload || !this.backupMainService.isHotExitEnabled()) { @@ -532,7 +542,7 @@ export class CodeWindow implements ICodeWindow { // Load URL mark('main:loadWindow'); - this._win.loadURL(this.getUrl(config)); + this._win.loadURL(this.getUrl(configuration)); // Make window visible if it did not open in N seconds because this indicates an error // Only do this when running out of sources and not when running tests @@ -547,7 +557,7 @@ export class CodeWindow implements ICodeWindow { } } - public reload(configuration?: IWindowConfiguration, cli?: ParsedArgs): void { + reload(configuration?: IWindowConfiguration, cli?: ParsedArgs): void { // If config is not provided, copy our current one if (!configuration) { @@ -570,14 +580,11 @@ export class CodeWindow implements ICodeWindow { configuration['extensions-dir'] = cli['extensions-dir']; } - if (cli) { - configuration['disable-extensions'] = cli['disable-extensions']; - } - configuration.isInitialStartup = false; // since this is a reload // Load config - this.load(configuration, true); + const disableExtensions = cli ? cli['disable-extensions'] : undefined; + this.load(configuration, true, disableExtensions); } private getUrl(windowConfiguration: IWindowConfiguration): string { @@ -608,6 +615,10 @@ export class CodeWindow implements ICodeWindow { windowConfiguration.baseTheme = this.getBaseTheme(); windowConfiguration.backgroundColor = this.getBackgroundColor(); + // Title style related + windowConfiguration.maximized = this._win.isMaximized(); + windowConfiguration.frameless = this.hasHiddenTitleBarStyle() && !isMacintosh; + // Perf Counters windowConfiguration.perfEntries = exportEntries(); windowConfiguration.perfStartTime = (global).perfStartTime; @@ -650,7 +661,7 @@ export class CodeWindow implements ICodeWindow { return background; } - public serializeWindowState(): IWindowState { + serializeWindowState(): IWindowState { if (!this._win) { return defaultWindowState(); } @@ -806,14 +817,14 @@ export class CodeWindow implements ICodeWindow { return null; } - public getBounds(): Electron.Rectangle { + getBounds(): Electron.Rectangle { const pos = this._win.getPosition(); const dimension = this._win.getSize(); return { x: pos[0], y: pos[1], width: dimension[0], height: dimension[1] }; } - public toggleFullScreen(): void { + toggleFullScreen(): void { const willBeFullScreen = !this._win.isFullScreen(); // set fullscreen flag on window @@ -888,7 +899,7 @@ export class CodeWindow implements ICodeWindow { } } - public onWindowTitleDoubleClick(): void { + onWindowTitleDoubleClick(): void { // Respect system settings on mac with regards to title click on windows title if (isMacintosh) { @@ -915,25 +926,25 @@ export class CodeWindow implements ICodeWindow { } } - public close(): void { + close(): void { if (this._win) { this._win.close(); } } - public sendWhenReady(channel: string, ...args: any[]): void { + sendWhenReady(channel: string, ...args: any[]): void { this.ready().then(() => { this.send(channel, ...args); }); } - public send(channel: string, ...args: any[]): void { + send(channel: string, ...args: any[]): void { if (this._win) { this._win.webContents.send(channel, ...args); } } - public updateTouchBar(groups: ICommandAction[][]): void { + updateTouchBar(groups: ISerializableCommandAction[][]): void { if (!isMacintosh) { return; // only supported on macOS } @@ -959,15 +970,10 @@ export class CodeWindow implements ICodeWindow { this.touchBarGroups.push(groupTouchBar); } - // Ugly workaround for native crash on macOS 10.12.1. We are not - // leveraging the API for changing the ESC touch bar item. - // See https://github.com/electron/electron/issues/10442 - (this._win)._setEscapeTouchBarItem = () => { }; - this._win.setTouchBar(new TouchBar({ items: this.touchBarGroups })); } - private createTouchBarGroup(items: ICommandAction[] = []): Electron.TouchBarSegmentedControl { + private createTouchBarGroup(items: ISerializableCommandAction[] = []): Electron.TouchBarSegmentedControl { // Group Segments const segments = this.createTouchBarGroupSegments(items); @@ -985,11 +991,11 @@ export class CodeWindow implements ICodeWindow { return control; } - private createTouchBarGroupSegments(items: ICommandAction[] = []): ITouchBarSegment[] { + private createTouchBarGroupSegments(items: ISerializableCommandAction[] = []): ITouchBarSegment[] { const segments: ITouchBarSegment[] = items.map(item => { let icon: Electron.NativeImage; - if (item.iconPath) { - icon = nativeImage.createFromPath(item.iconPath.dark); + if (item.iconLocation && item.iconLocation.dark.scheme === 'file') { + icon = nativeImage.createFromPath(URI.revive(item.iconLocation.dark).fsPath); if (icon.isEmpty()) { icon = void 0; } @@ -1005,7 +1011,7 @@ export class CodeWindow implements ICodeWindow { return segments; } - public dispose(): void { + dispose(): void { if (this.showTimeoutHandle) { clearTimeout(this.showTimeoutHandle); } diff --git a/src/vs/code/electron-main/windows.ts b/src/vs/code/electron-main/windows.ts index f97c2d05a8..143adaf178 100644 --- a/src/vs/code/electron-main/windows.ts +++ b/src/vs/code/electron-main/windows.ts @@ -6,7 +6,7 @@ 'use strict'; import { basename, normalize, join, dirname } from 'path'; -import * as fs from 'original-fs'; +import * as fs from 'fs'; import { localize } from 'vs/nls'; import * as arrays from 'vs/base/common/arrays'; import { assign, mixin, equals } from 'vs/base/common/objects'; @@ -20,23 +20,23 @@ import { ILifecycleService, UnloadReason, IWindowUnloadEvent } from 'vs/platform import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { ILogService } from 'vs/platform/log/common/log'; import { IWindowSettings, OpenContext, IPath, IWindowConfiguration, INativeOpenDialogOptions, ReadyState, IPathsToWaitFor, IEnterWorkspaceResult, IMessageBoxResult } from 'vs/platform/windows/common/windows'; -import { getLastActiveWindow, findBestWindowOrFolderForFile, findWindowOnWorkspace, findWindowOnExtensionDevelopmentPath, findWindowOnWorkspaceOrFolderPath } from 'vs/code/node/windowsFinder'; +import { getLastActiveWindow, findBestWindowOrFolderForFile, findWindowOnWorkspace, findWindowOnExtensionDevelopmentPath, findWindowOnWorkspaceOrFolderUri } from 'vs/code/node/windowsFinder'; import { Event as CommonEvent, Emitter } from 'vs/base/common/event'; import product from 'vs/platform/node/product'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; -import { isEqual } from 'vs/base/common/paths'; import { IWindowsMainService, IOpenConfiguration, IWindowsCountChangedEvent, ICodeWindow, IWindowState as ISingleWindowState, WindowMode } from 'vs/platform/windows/electron-main/windows'; import { IHistoryMainService } from 'vs/platform/history/common/history'; import { IProcessEnvironment, isLinux, isMacintosh, isWindows } from 'vs/base/common/platform'; import { TPromise } from 'vs/base/common/winjs.base'; -import { IWorkspacesMainService, IWorkspaceIdentifier, ISingleFolderWorkspaceIdentifier, WORKSPACE_FILTER, isSingleFolderWorkspaceIdentifier, IWorkspaceFolderCreationData } from 'vs/platform/workspaces/common/workspaces'; +import { IWorkspacesMainService, IWorkspaceIdentifier, WORKSPACE_FILTER, IWorkspaceFolderCreationData, ISingleFolderWorkspaceIdentifier, isSingleFolderWorkspaceIdentifier } from 'vs/platform/workspaces/common/workspaces'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { mnemonicButtonLabel } from 'vs/base/common/labels'; import { Schemas } from 'vs/base/common/network'; -import { normalizeNFC } from 'vs/base/common/strings'; +import { normalizeNFC } from 'vs/base/common/normalization'; import URI from 'vs/base/common/uri'; import { Queue } from 'vs/base/common/async'; import { exists } from 'vs/base/node/pfs'; +import { getComparisonKey, isEqual, hasToIgnoreCase } from 'vs/base/common/resources'; enum WindowError { UNRESPONSIVE, @@ -49,11 +49,15 @@ interface INewWindowState extends ISingleWindowState { interface IWindowState { workspace?: IWorkspaceIdentifier; - folderPath?: string; + folderUri?: URI; backupPath: string; uiState: ISingleWindowState; } +interface IBackwardCompatibleWindowState extends IWindowState { + folderPath?: string; +} + interface IWindowsState { lastActiveWindow?: IWindowState; lastPluginDevelopmentHostWindow?: IWindowState; @@ -67,7 +71,7 @@ interface IOpenBrowserWindowOptions { cli?: ParsedArgs; workspace?: IWorkspaceIdentifier; - folderPath?: string; + folderUri?: URI; initialStartup?: boolean; @@ -88,7 +92,7 @@ interface IPathToOpen extends IPath { workspace?: IWorkspaceIdentifier; // the folder path for a Code instance to open - folderPath?: string; + folderUri?: URI; // the backup spath for a Code instance to use backupPath?: string; @@ -144,7 +148,7 @@ export class WindowsManager implements IWindowsMainService { @IWorkspacesMainService private workspacesMainService: IWorkspacesMainService, @IInstantiationService private instantiationService: IInstantiationService ) { - this.windowsState = this.stateService.getItem(WindowsManager.windowsStateStorageKey) || { openedWindows: [] }; + this.windowsState = this.getWindowsState(); if (!Array.isArray(this.windowsState.openedWindows)) { this.windowsState.openedWindows = []; } @@ -153,7 +157,31 @@ export class WindowsManager implements IWindowsMainService { this.workspacesManager = new WorkspacesManager(workspacesMainService, backupMainService, environmentService, this); } - public ready(initialUserEnv: IProcessEnvironment): void { + private getWindowsState(): IWindowsState { + const windowsState = this.stateService.getItem(WindowsManager.windowsStateStorageKey) || { openedWindows: [] }; + if (windowsState.lastActiveWindow) { + windowsState.lastActiveWindow = this.revive(windowsState.lastActiveWindow); + } + if (windowsState.lastPluginDevelopmentHostWindow) { + windowsState.lastPluginDevelopmentHostWindow = this.revive(windowsState.lastPluginDevelopmentHostWindow); + } + if (windowsState.openedWindows) { + windowsState.openedWindows = windowsState.openedWindows.map(windowState => this.revive(windowState)); + } + return windowsState; + } + + private revive(windowState: IWindowState): IWindowState { + if (windowState.folderUri) { + windowState.folderUri = URI.revive(windowState.folderUri); + } + if ((windowState).folderPath) { + windowState.folderUri = URI.file((windowState).folderPath); + } + return windowState; + } + + ready(initialUserEnv: IProcessEnvironment): void { this.initialUserEnv = initialUserEnv; this.registerListeners(); @@ -294,10 +322,10 @@ export class WindowsManager implements IWindowsMainService { } // Any non extension host window with same workspace or folder - else if (!win.isExtensionDevelopmentHost && (!!win.openedWorkspace || !!win.openedFolderPath)) { + else if (!win.isExtensionDevelopmentHost && (!!win.openedWorkspace || !!win.openedFolderUri)) { this.windowsState.openedWindows.forEach(o => { const sameWorkspace = win.openedWorkspace && o.workspace && o.workspace.id === win.openedWorkspace.id; - const sameFolder = win.openedFolderPath && isEqual(o.folderPath, win.openedFolderPath, !isLinux /* ignorecase */); + const sameFolder = win.openedFolderUri && o.folderUri && isEqual(o.folderUri, win.openedFolderUri, hasToIgnoreCase(o.folderUri)); if (sameWorkspace || sameFolder) { o.uiState = state.uiState; @@ -317,23 +345,24 @@ export class WindowsManager implements IWindowsMainService { private toWindowState(win: ICodeWindow): IWindowState { return { workspace: win.openedWorkspace, - folderPath: win.openedFolderPath, + folderUri: win.openedFolderUri, backupPath: win.backupPath, uiState: win.serializeWindowState() }; } - public open(openConfig: IOpenConfiguration): ICodeWindow[] { + open(openConfig: IOpenConfiguration): ICodeWindow[] { + this.logService.trace('windowsManager#open'); openConfig = this.validateOpenConfig(openConfig); let pathsToOpen = this.getPathsToOpen(openConfig); // When run with --add, take the folders that are to be opened as // folders that should be added to the currently active window. - let foldersToAdd: IPath[] = []; + let foldersToAdd: URI[] = []; if (openConfig.addMode) { - foldersToAdd = pathsToOpen.filter(path => !!path.folderPath).map(path => ({ filePath: path.folderPath })); - pathsToOpen = pathsToOpen.filter(path => !path.folderPath); + foldersToAdd = pathsToOpen.filter(path => !!path.folderUri).map(path => path.folderUri); + pathsToOpen = pathsToOpen.filter(path => !path.folderUri); } let filesToOpen = pathsToOpen.filter(path => !!path.filePath && !path.createFilePath); @@ -362,12 +391,12 @@ export class WindowsManager implements IWindowsMainService { // // These are windows to open to show either folders or files (including diffing files or creating them) // - const foldersToOpen = arrays.distinct(pathsToOpen.filter(win => win.folderPath && !win.filePath).map(win => win.folderPath), folder => isLinux ? folder : folder.toLowerCase()); // prevent duplicates + const foldersToOpen = arrays.distinct(pathsToOpen.filter(win => win.folderUri && !win.filePath).map(win => win.folderUri), folder => getComparisonKey(folder)); // prevent duplicates // // These are windows to restore because of hot-exit or from previous session (only performed once on startup!) // - let foldersToRestore: string[] = []; + let foldersToRestore: URI[] = []; let workspacesToRestore: IWorkspaceIdentifier[] = []; let emptyToRestore: string[] = []; if (openConfig.initialStartup && !openConfig.cli.extensionDevelopmentPath && !openConfig.cli['disable-restore-windows']) { @@ -377,21 +406,22 @@ export class WindowsManager implements IWindowsMainService { workspacesToRestore.push(...this.workspacesMainService.getUntitledWorkspacesSync()); // collect from previous window session emptyToRestore = this.backupMainService.getEmptyWindowBackupPaths(); - emptyToRestore.push(...pathsToOpen.filter(w => !w.workspace && !w.folderPath && w.backupPath).map(w => basename(w.backupPath))); // add empty windows with backupPath + emptyToRestore.push(...pathsToOpen.filter(w => !w.workspace && !w.folderUri && w.backupPath).map(w => basename(w.backupPath))); // add empty windows with backupPath emptyToRestore = arrays.distinct(emptyToRestore); // prevent duplicates } // // These are empty windows to open // - const emptyToOpen = pathsToOpen.filter(win => !win.workspace && !win.folderPath && !win.filePath && !win.backupPath).length; + const emptyToOpen = pathsToOpen.filter(win => !win.workspace && !win.folderUri && !win.filePath && !win.backupPath).length; // Open based on config const usedWindows = this.doOpen(openConfig, workspacesToOpen, workspacesToRestore, foldersToOpen, foldersToRestore, emptyToRestore, emptyToOpen, filesToOpen, filesToCreate, filesToDiff, filesToWait, foldersToAdd); // Make sure to pass focus to the most relevant of the windows if we open multiple if (usedWindows.length > 1) { - let focusLastActive = this.windowsState.lastActiveWindow && !openConfig.forceEmpty && !openConfig.cli._.length && (!openConfig.pathsToOpen || !openConfig.pathsToOpen.length); + + let focusLastActive = this.windowsState.lastActiveWindow && !openConfig.forceEmpty && !openConfig.cli._.length && !(openConfig.cli['folder-uri'] || []).length && !(openConfig.urisToOpen || []).length; let focusLastOpened = true; let focusLastWindow = true; @@ -410,9 +440,9 @@ export class WindowsManager implements IWindowsMainService { for (let i = usedWindows.length - 1; i >= 0; i--) { const usedWindow = usedWindows[i]; if ( - (usedWindow.openedWorkspace && workspacesToRestore.some(workspace => workspace.id === usedWindow.openedWorkspace.id)) || // skip over restored workspace - (usedWindow.openedFolderPath && foldersToRestore.some(folder => folder === usedWindow.openedFolderPath)) || // skip over restored folder - (usedWindow.backupPath && emptyToRestore.some(empty => empty === basename(usedWindow.backupPath))) // skip over restored empty window + (usedWindow.openedWorkspace && workspacesToRestore.some(workspace => workspace.id === usedWindow.openedWorkspace.id)) || // skip over restored workspace + (usedWindow.openedFolderUri && foldersToRestore.some(folder => isEqual(folder, usedWindow.openedFolderUri, hasToIgnoreCase(folder)))) || // skip over restored folder + (usedWindow.backupPath && emptyToRestore.some(empty => empty === basename(usedWindow.backupPath))) // skip over restored empty window ) { continue; } @@ -436,8 +466,8 @@ export class WindowsManager implements IWindowsMainService { const recentlyOpenedFiles: string[] = []; pathsToOpen.forEach(win => { - if (win.workspace || win.folderPath) { - recentlyOpenedWorkspaces.push(win.workspace || win.folderPath); + if (win.workspace || win.folderUri) { + recentlyOpenedWorkspaces.push(win.workspace || win.folderUri); } else if (win.filePath) { recentlyOpenedFiles.push(win.filePath); } @@ -472,15 +502,15 @@ export class WindowsManager implements IWindowsMainService { openConfig: IOpenConfiguration, workspacesToOpen: IWorkspaceIdentifier[], workspacesToRestore: IWorkspaceIdentifier[], - foldersToOpen: string[], - foldersToRestore: string[], + foldersToOpen: URI[], + foldersToRestore: URI[], emptyToRestore: string[], emptyToOpen: number, filesToOpen: IPath[], filesToCreate: IPath[], filesToDiff: IPath[], filesToWait: IPathsToWaitFor, - foldersToAdd: IPath[] + foldersToAdd: URI[] ) { const usedWindows: ICodeWindow[] = []; @@ -510,13 +540,14 @@ export class WindowsManager implements IWindowsMainService { reuseWindow: openConfig.forceReuseWindow, context: openConfig.context, filePath: fileToCheck && fileToCheck.filePath, - userHome: this.environmentService.userHome, workspaceResolver: workspace => this.workspacesMainService.resolveWorkspaceSync(workspace.configPath) }); // Special case: we started with --wait and we got back a folder to open. In this case // we actually prefer to not open the folder but operate purely on the file. if (typeof bestWindowOrFolder === 'string' && filesToWait) { + //TODO: #54483 Ben This should not happen + console.error(`This should not happen`, bestWindowOrFolder, WindowsManager.WINDOWS); bestWindowOrFolder = !openFilesInNewWindow ? this.getLastActiveWindow() : null; } @@ -529,8 +560,8 @@ export class WindowsManager implements IWindowsMainService { } // Window is single folder - else if (bestWindowOrFolder.openedFolderPath) { - foldersToOpen.push(bestWindowOrFolder.openedFolderPath); + else if (bestWindowOrFolder.openedFolderUri) { + foldersToOpen.push(bestWindowOrFolder.openedFolderUri); } // Window is empty @@ -549,7 +580,9 @@ export class WindowsManager implements IWindowsMainService { // We found a suitable folder to open: add it to foldersToOpen else if (typeof bestWindowOrFolder === 'string') { - foldersToOpen.push(bestWindowOrFolder); + //TODO: #54483 Ben This should not happen + // foldersToOpen.push(bestWindowOrFolder); + console.error(`This should not happen`, bestWindowOrFolder, WindowsManager.WINDOWS); } // Finally, if no window or folder is found, just open the files in an empty window @@ -614,7 +647,8 @@ export class WindowsManager implements IWindowsMainService { } // Handle folders to open (instructed and to restore) - const allFoldersToOpen = arrays.distinct([...foldersToRestore, ...foldersToOpen], folder => isLinux ? folder : folder.toLowerCase()); // prevent duplicates + const allFoldersToOpen = arrays.distinct([...foldersToRestore, ...foldersToOpen], folder => getComparisonKey(folder)); // prevent duplicates + if (allFoldersToOpen.length > 0) { // Check for existing instances @@ -636,12 +670,13 @@ export class WindowsManager implements IWindowsMainService { // Open remaining ones allFoldersToOpen.forEach(folderToOpen => { - if (windowsOnFolderPath.some(win => isEqual(win.openedFolderPath, folderToOpen, !isLinux /* ignorecase */))) { + + if (windowsOnFolderPath.some(win => isEqual(win.openedFolderUri, folderToOpen, hasToIgnoreCase(win.openedFolderUri)))) { return; // ignore folders that are already open } // Do open folder - usedWindows.push(this.doOpenFolderOrWorkspace(openConfig, { folderPath: folderToOpen }, openFolderInNewWindow, filesToOpen, filesToCreate, filesToDiff, filesToWait)); + usedWindows.push(this.doOpenFolderOrWorkspace(openConfig, { folderUri: folderToOpen }, openFolderInNewWindow, filesToOpen, filesToCreate, filesToDiff, filesToWait)); // Reset these because we handled them filesToOpen = []; @@ -706,7 +741,7 @@ export class WindowsManager implements IWindowsMainService { return window; } - private doAddFoldersToExistingWidow(window: ICodeWindow, foldersToAdd: IPath[]): ICodeWindow { + private doAddFoldersToExistingWidow(window: ICodeWindow, foldersToAdd: URI[]): ICodeWindow { window.focus(); // make sure window has focus window.ready().then(readyWindow => { @@ -716,18 +751,22 @@ export class WindowsManager implements IWindowsMainService { return window; } - private doOpenFolderOrWorkspace(openConfig: IOpenConfiguration, folderOrWorkspace: IPathToOpen, openInNewWindow: boolean, filesToOpen: IPath[], filesToCreate: IPath[], filesToDiff: IPath[], filesToWait: IPathsToWaitFor, windowToUse?: ICodeWindow): ICodeWindow { + private doOpenFolderOrWorkspace(openConfig: IOpenConfiguration, folderOrWorkspace: IPathToOpen, forceNewWindow: boolean, filesToOpen: IPath[], filesToCreate: IPath[], filesToDiff: IPath[], filesToWait: IPathsToWaitFor, windowToUse?: ICodeWindow): ICodeWindow { + if (!forceNewWindow && !windowToUse && typeof openConfig.contextWindowId === 'number') { + windowToUse = this.getWindowById(openConfig.contextWindowId); // fix for https://github.com/Microsoft/vscode/issues/49587 + } + const browserWindow = this.openInBrowserWindow({ userEnv: openConfig.userEnv, cli: openConfig.cli, initialStartup: openConfig.initialStartup, workspace: folderOrWorkspace.workspace, - folderPath: folderOrWorkspace.folderPath, + folderUri: folderOrWorkspace.folderUri, filesToOpen, filesToCreate, filesToDiff, filesToWait, - forceNewWindow: openInNewWindow, + forceNewWindow, windowToUse }); @@ -739,7 +778,7 @@ export class WindowsManager implements IWindowsMainService { let isCommandLineOrAPICall = false; // Extract paths: from API - if (openConfig.pathsToOpen && openConfig.pathsToOpen.length > 0) { + if (openConfig.urisToOpen && openConfig.urisToOpen.length > 0) { windowsToOpen = this.doExtractPathsFromAPI(openConfig); isCommandLineOrAPICall = true; } @@ -750,7 +789,7 @@ export class WindowsManager implements IWindowsMainService { } // Extract paths: from CLI - else if (openConfig.cli._.length > 0) { + else if (openConfig.cli._.length > 0 || (openConfig.cli['folder-uri'] || []).length > 0) { windowsToOpen = this.doExtractPathsFromCLI(openConfig.cli); isCommandLineOrAPICall = true; } @@ -765,13 +804,13 @@ export class WindowsManager implements IWindowsMainService { // If we are in addMode, we should not do this because in that case all // folders should be added to the existing window. if (!openConfig.addMode && isCommandLineOrAPICall) { - const foldersToOpen = windowsToOpen.filter(path => !!path.folderPath); + const foldersToOpen = windowsToOpen.filter(path => !!path.folderUri); if (foldersToOpen.length > 1) { - const workspace = this.workspacesMainService.createWorkspaceSync(foldersToOpen.map(folder => ({ uri: URI.file(folder.folderPath) }))); + const workspace = this.workspacesMainService.createWorkspaceSync(foldersToOpen.map(folder => ({ uri: folder.folderUri }))); // Add workspace and remove folders thereby windowsToOpen.push({ workspace }); - windowsToOpen = windowsToOpen.filter(path => !path.folderPath); + windowsToOpen = windowsToOpen.filter(path => !path.folderUri); } } @@ -779,8 +818,8 @@ export class WindowsManager implements IWindowsMainService { } private doExtractPathsFromAPI(openConfig: IOpenConfiguration): IPath[] { - let pathsToOpen = openConfig.pathsToOpen.map(pathToOpen => { - const path = this.parsePath(pathToOpen, { gotoLineMode: openConfig.cli && openConfig.cli.goto, forceOpenWorkspaceAsFile: openConfig.forceOpenWorkspaceAsFile }); + let pathsToOpen = openConfig.urisToOpen.map(pathToOpen => { + const path = this.parseUri(pathToOpen, { gotoLineMode: openConfig.cli && openConfig.cli.goto, forceOpenWorkspaceAsFile: openConfig.forceOpenWorkspaceAsFile }); // Warn if the requested path to open does not exist if (!path) { @@ -789,7 +828,7 @@ export class WindowsManager implements IWindowsMainService { type: 'info', buttons: [localize('ok', "OK")], message: localize('pathNotExistTitle', "Path does not exist"), - detail: localize('pathNotExistDetail', "The path '{0}' does not seem to exist anymore on disk.", pathToOpen), + detail: localize('pathNotExistDetail', "The path '{0}' does not seem to exist anymore on disk.", pathToOpen.scheme === Schemas.file ? pathToOpen.fsPath : pathToOpen.path), noLink: true }; @@ -806,7 +845,20 @@ export class WindowsManager implements IWindowsMainService { } private doExtractPathsFromCLI(cli: ParsedArgs): IPath[] { - const pathsToOpen = arrays.coalesce(cli._.map(candidate => this.parsePath(candidate, { ignoreFileNotFound: true, gotoLineMode: cli.goto }))); + const pathsToOpen = []; + + // folder uris + if (cli['folder-uri'] && cli['folder-uri'].length) { + const arg = cli['folder-uri']; + const folderUris: string[] = typeof arg === 'string' ? [arg] : arg; + pathsToOpen.push(...arrays.coalesce(folderUris.map(candidate => this.parseUri(this.parseFolderUriArg(candidate), { ignoreFileNotFound: true, gotoLineMode: cli.goto })))); + } + + // folder or file paths + if (cli._ && cli._.length) { + pathsToOpen.push(...arrays.coalesce(cli._.map(candidate => this.parsePath(candidate, { ignoreFileNotFound: true, gotoLineMode: cli.goto })))); + } + if (pathsToOpen.length > 0) { return pathsToOpen; } @@ -839,9 +891,9 @@ export class WindowsManager implements IWindowsMainService { } // folder (if path is valid) - else if (lastActiveWindow.folderPath) { - const validatedFolder = this.parsePath(lastActiveWindow.folderPath); - if (validatedFolder && validatedFolder.folderPath) { + else if (lastActiveWindow.folderUri) { + const validatedFolder = this.parseUri(lastActiveWindow.folderUri); + if (validatedFolder && validatedFolder.folderUri) { return [validatedFolder]; } } @@ -867,16 +919,16 @@ export class WindowsManager implements IWindowsMainService { windowsToOpen.push(...workspaceCandidates.map(candidate => this.parsePath(candidate.configPath)).filter(window => window && window.workspace)); // Folders - const folderCandidates = this.windowsState.openedWindows.filter(w => !!w.folderPath).map(w => w.folderPath); - if (lastActiveWindow && lastActiveWindow.folderPath) { - folderCandidates.push(lastActiveWindow.folderPath); + const folderCandidates = this.windowsState.openedWindows.filter(w => !!w.folderUri).map(w => w.folderUri); + if (lastActiveWindow && lastActiveWindow.folderUri) { + folderCandidates.push(lastActiveWindow.folderUri); } - windowsToOpen.push(...folderCandidates.map(candidate => this.parsePath(candidate)).filter(window => window && window.folderPath)); + windowsToOpen.push(...folderCandidates.map(candidate => this.parseUri(candidate)).filter(window => window && window.folderUri)); // Windows that were Empty if (restoreWindows === 'all') { - const lastOpenedEmpty = this.windowsState.openedWindows.filter(w => !w.workspace && !w.folderPath && w.backupPath).map(w => w.backupPath); - const lastActiveEmpty = lastActiveWindow && !lastActiveWindow.workspace && !lastActiveWindow.folderPath && lastActiveWindow.backupPath; + const lastOpenedEmpty = this.windowsState.openedWindows.filter(w => !w.workspace && !w.folderUri && w.backupPath).map(w => w.backupPath); + const lastActiveEmpty = lastActiveWindow && !lastActiveWindow.workspace && !lastActiveWindow.folderUri && lastActiveWindow.backupPath; if (lastActiveEmpty) { lastOpenedEmpty.push(lastActiveEmpty); } @@ -911,6 +963,28 @@ export class WindowsManager implements IWindowsMainService { return restoreWindows; } + private parseFolderUriArg(arg: string): URI { + // Do not support if user has passed folder path on Windows + if (isWindows && /^([a-z])\:(.*)$/i.test(arg)) { + return null; + } + return URI.parse(arg); + } + + private parseUri(anyUri: URI, options?: { ignoreFileNotFound?: boolean, gotoLineMode?: boolean, forceOpenWorkspaceAsFile?: boolean; }): IPathToOpen { + if (!anyUri || !anyUri.scheme) { + return null; + } + + if (anyUri.scheme === Schemas.file) { + return this.parsePath(anyUri.fsPath, options); + } + + return { + folderUri: anyUri + }; + } + private parsePath(anyPath: string, options?: { ignoreFileNotFound?: boolean, gotoLineMode?: boolean, forceOpenWorkspaceAsFile?: boolean; }): IPathToOpen { if (!anyPath) { return null; @@ -951,7 +1025,7 @@ export class WindowsManager implements IWindowsMainService { // over to us) else if (candidateStat.isDirectory()) { return { - folderPath: candidate + folderUri: URI.file(candidate) }; } } @@ -1007,7 +1081,7 @@ export class WindowsManager implements IWindowsMainService { return { openFolderInNewWindow, openFilesInNewWindow }; } - public openExtensionDevelopmentHostWindow(openConfig: IOpenConfiguration): void { + openExtensionDevelopmentHostWindow(openConfig: IOpenConfiguration): void { // Reload an existing extension development host window on the same path // We currently do not allow more than one extension development window @@ -1021,25 +1095,39 @@ export class WindowsManager implements IWindowsMainService { } // Fill in previously opened workspace unless an explicit path is provided and we are not unit testing - if (openConfig.cli._.length === 0 && !openConfig.cli.extensionTestsPath) { + if (openConfig.cli._.length === 0 && (openConfig.cli['folder-uri'] || []).length === 0 && !openConfig.cli.extensionTestsPath) { const extensionDevelopmentWindowState = this.windowsState.lastPluginDevelopmentHostWindow; - const workspaceToOpen = extensionDevelopmentWindowState && (extensionDevelopmentWindowState.workspace || extensionDevelopmentWindowState.folderPath); + const workspaceToOpen = extensionDevelopmentWindowState && (extensionDevelopmentWindowState.workspace || extensionDevelopmentWindowState.folderUri); if (workspaceToOpen) { - openConfig.cli._ = [isSingleFolderWorkspaceIdentifier(workspaceToOpen) ? workspaceToOpen : workspaceToOpen.configPath]; + if (isSingleFolderWorkspaceIdentifier(workspaceToOpen)) { + if (workspaceToOpen.scheme === Schemas.file) { + openConfig.cli._ = [workspaceToOpen.fsPath]; + } else { + openConfig.cli['folder-uri'] = [workspaceToOpen.toString()]; + } + } else { + openConfig.cli._ = [workspaceToOpen.configPath]; + } } } // Make sure we are not asked to open a workspace or folder that is already opened - if (openConfig.cli._.some(path => !!findWindowOnWorkspaceOrFolderPath(WindowsManager.WINDOWS, path))) { + if (openConfig.cli._.some(path => !!findWindowOnWorkspaceOrFolderUri(WindowsManager.WINDOWS, URI.file(path)))) { openConfig.cli._ = []; } + if (openConfig.cli['folder-uri']) { + const arg = openConfig.cli['folder-uri']; + const folderUris: string[] = typeof arg === 'string' ? [arg] : arg; + if (folderUris.some(uri => !!findWindowOnWorkspaceOrFolderUri(WindowsManager.WINDOWS, this.parseFolderUriArg(uri)))) { + openConfig.cli['folder-uri'] = []; + } + } // Open it - this.open({ context: openConfig.context, cli: openConfig.cli, forceNewWindow: true, forceEmpty: openConfig.cli._.length === 0, userEnv: openConfig.userEnv }); + this.open({ context: openConfig.context, cli: openConfig.cli, forceNewWindow: true, forceEmpty: openConfig.cli._.length === 0 && (openConfig.cli['folder-uri'] || []).length === 0, userEnv: openConfig.userEnv }); } private openInBrowserWindow(options: IOpenBrowserWindowOptions): ICodeWindow { - // Build IWindowConfiguration from config and options const configuration: IWindowConfiguration = mixin({}, options.cli); // inherit all properties from CLI configuration.appRoot = this.environmentService.appRoot; @@ -1048,7 +1136,7 @@ export class WindowsManager implements IWindowsMainService { configuration.userEnv = assign({}, this.initialUserEnv, options.userEnv || {}); configuration.isInitialStartup = options.initialStartup; configuration.workspace = options.workspace; - configuration.folderPath = options.folderPath; + configuration.folderUri = options.folderUri; configuration.filesToOpen = options.filesToOpen; configuration.filesToCreate = options.filesToCreate; configuration.filesToDiff = options.filesToDiff; @@ -1138,8 +1226,8 @@ export class WindowsManager implements IWindowsMainService { if (!configuration.extensionDevelopmentPath) { if (configuration.workspace) { configuration.backupPath = this.backupMainService.registerWorkspaceBackupSync(configuration.workspace); - } else if (configuration.folderPath) { - configuration.backupPath = this.backupMainService.registerFolderBackupSync(configuration.folderPath); + } else if (configuration.folderUri) { + configuration.backupPath = this.backupMainService.registerFolderBackupSync(configuration.folderUri); } else { configuration.backupPath = this.backupMainService.registerEmptyWindowBackupSync(options.emptyWindowBackupFolder); } @@ -1176,8 +1264,8 @@ export class WindowsManager implements IWindowsMainService { } // Known Folder - load from stored settings - if (configuration.folderPath) { - const stateForFolder = this.windowsState.openedWindows.filter(o => isEqual(o.folderPath, configuration.folderPath, !isLinux /* ignorecase */)).map(o => o.uiState); + if (configuration.folderUri) { + const stateForFolder = this.windowsState.openedWindows.filter(o => o.folderUri && isEqual(o.folderUri, configuration.folderUri, hasToIgnoreCase(o.folderUri))).map(o => o.uiState); if (stateForFolder.length) { return stateForFolder[0]; } @@ -1283,7 +1371,7 @@ export class WindowsManager implements IWindowsMainService { return state; } - public reload(win: ICodeWindow, cli?: ParsedArgs): void { + reload(win: ICodeWindow, cli?: ParsedArgs): void { // Only reload when the window has not vetoed this this.lifecycleService.unload(win, UnloadReason.RELOAD).done(veto => { @@ -1296,18 +1384,22 @@ export class WindowsManager implements IWindowsMainService { }); } - public closeWorkspace(win: ICodeWindow): void { + closeWorkspace(win: ICodeWindow): void { this.openInBrowserWindow({ cli: this.environmentService.args, windowToUse: win }); } - public saveAndEnterWorkspace(win: ICodeWindow, path: string): TPromise { + saveAndEnterWorkspace(win: ICodeWindow, path: string): TPromise { return this.workspacesManager.saveAndEnterWorkspace(win, path).then(result => this.doEnterWorkspace(win, result)); } - public createAndEnterWorkspace(win: ICodeWindow, folders?: IWorkspaceFolderCreationData[], path?: string): TPromise { + enterWorkspace(win: ICodeWindow, path: string): TPromise { + return this.workspacesManager.enterWorkspace(win, path).then(result => this.doEnterWorkspace(win, result)); + } + + createAndEnterWorkspace(win: ICodeWindow, folders?: IWorkspaceFolderCreationData[], path?: string): TPromise { return this.workspacesManager.createAndEnterWorkspace(win, folders, path).then(result => this.doEnterWorkspace(win, result)); } @@ -1322,7 +1414,7 @@ export class WindowsManager implements IWindowsMainService { return result; } - public pickWorkspaceAndOpen(options: INativeOpenDialogOptions): void { + pickWorkspaceAndOpen(options: INativeOpenDialogOptions): void { this.workspacesManager.pickWorkspaceAndOpen(options); } @@ -1363,7 +1455,7 @@ export class WindowsManager implements IWindowsMainService { })); } - public focusLastActive(cli: ParsedArgs, context: OpenContext): ICodeWindow { + focusLastActive(cli: ParsedArgs, context: OpenContext): ICodeWindow { const lastActive = this.getLastActiveWindow(); if (lastActive) { lastActive.focus(); @@ -1375,15 +1467,15 @@ export class WindowsManager implements IWindowsMainService { return this.open({ context, cli, forceEmpty: true })[0]; } - public getLastActiveWindow(): ICodeWindow { + getLastActiveWindow(): ICodeWindow { return getLastActiveWindow(WindowsManager.WINDOWS); } - public openNewWindow(context: OpenContext): ICodeWindow[] { + openNewWindow(context: OpenContext): ICodeWindow[] { return this.open({ context, cli: this.environmentService.args, forceNewWindow: true, forceEmpty: true }); } - public waitForWindowCloseOrLoad(windowId: number): TPromise { + waitForWindowCloseOrLoad(windowId: number): TPromise { return new TPromise(c => { function handler(id: number) { if (id === windowId) { @@ -1399,7 +1491,7 @@ export class WindowsManager implements IWindowsMainService { }); } - public sendToFocused(channel: string, ...args: any[]): void { + sendToFocused(channel: string, ...args: any[]): void { const focusedWindow = this.getFocusedWindow() || this.getLastActiveWindow(); if (focusedWindow) { @@ -1407,7 +1499,7 @@ export class WindowsManager implements IWindowsMainService { } } - public sendToAll(channel: string, payload?: any, windowIdsToIgnore?: number[]): void { + sendToAll(channel: string, payload?: any, windowIdsToIgnore?: number[]): void { WindowsManager.WINDOWS.forEach(w => { if (windowIdsToIgnore && windowIdsToIgnore.indexOf(w.id) >= 0) { return; // do not send if we are instructed to ignore it @@ -1417,7 +1509,7 @@ export class WindowsManager implements IWindowsMainService { }); } - public getFocusedWindow(): ICodeWindow { + getFocusedWindow(): ICodeWindow { const win = BrowserWindow.getFocusedWindow(); if (win) { return this.getWindowById(win.id); @@ -1426,7 +1518,7 @@ export class WindowsManager implements IWindowsMainService { return null; } - public getWindowById(windowId: number): ICodeWindow { + getWindowById(windowId: number): ICodeWindow { const res = WindowsManager.WINDOWS.filter(w => w.id === windowId); if (res && res.length === 1) { return res[0]; @@ -1435,11 +1527,11 @@ export class WindowsManager implements IWindowsMainService { return null; } - public getWindows(): ICodeWindow[] { + getWindows(): ICodeWindow[] { return WindowsManager.WINDOWS; } - public getWindowCount(): number { + getWindowCount(): number { return WindowsManager.WINDOWS.length; } @@ -1507,15 +1599,15 @@ export class WindowsManager implements IWindowsMainService { this._onWindowClose.fire(win.id); } - public pickFileFolderAndOpen(options: INativeOpenDialogOptions): void { + pickFileFolderAndOpen(options: INativeOpenDialogOptions): void { this.doPickAndOpen(options, true /* pick folders */, true /* pick files */); } - public pickFolderAndOpen(options: INativeOpenDialogOptions): void { + pickFolderAndOpen(options: INativeOpenDialogOptions): void { this.doPickAndOpen(options, true /* pick folders */, false /* pick files */); } - public pickFileAndOpen(options: INativeOpenDialogOptions): void { + pickFileAndOpen(options: INativeOpenDialogOptions): void { this.doPickAndOpen(options, false /* pick folders */, true /* pick files */); } @@ -1553,19 +1645,19 @@ export class WindowsManager implements IWindowsMainService { this.dialogs.pickAndOpen(internalOptions); } - public showMessageBox(options: Electron.MessageBoxOptions, win?: ICodeWindow): TPromise { + showMessageBox(options: Electron.MessageBoxOptions, win?: ICodeWindow): TPromise { return this.dialogs.showMessageBox(options, win); } - public showSaveDialog(options: Electron.SaveDialogOptions, win?: ICodeWindow): TPromise { + showSaveDialog(options: Electron.SaveDialogOptions, win?: ICodeWindow): TPromise { return this.dialogs.showSaveDialog(options, win); } - public showOpenDialog(options: Electron.OpenDialogOptions, win?: ICodeWindow): TPromise { + showOpenDialog(options: Electron.OpenDialogOptions, win?: ICodeWindow): TPromise { return this.dialogs.showOpenDialog(options, win); } - public quit(): void { + quit(): void { // If the user selected to exit from an extension development host window, do not quit, but just // close the window unless this is the last window that is opened. @@ -1605,8 +1697,8 @@ class Dialogs { this.noWindowDialogQueue = new Queue(); } - public pickAndOpen(options: INativeOpenDialogOptions): void { - this.getFileOrFolderPaths(options).then(paths => { + pickAndOpen(options: INativeOpenDialogOptions): void { + this.getFileOrFolderUris(options).then(paths => { const numberOfPaths = paths ? paths.length : 0; // Telemetry @@ -1624,7 +1716,7 @@ class Dialogs { this.windowsMainService.open({ context: OpenContext.DIALOG, cli: this.environmentService.args, - pathsToOpen: paths, + urisToOpen: paths, forceNewWindow: options.forceNewWindow, forceOpenWorkspaceAsFile: options.dialogOptions && !equals(options.dialogOptions.filters, WORKSPACE_FILTER) }); @@ -1632,7 +1724,7 @@ class Dialogs { }); } - private getFileOrFolderPaths(options: IInternalNativeOpenDialogOptions): TPromise { + private getFileOrFolderUris(options: IInternalNativeOpenDialogOptions): TPromise { // Ensure dialog options if (!options.dialogOptions) { @@ -1670,7 +1762,7 @@ class Dialogs { // Remember path in storage for next time this.stateService.setItem(Dialogs.workingDirPickerStorageKey, dirname(paths[0])); - return paths; + return paths.map(path => URI.file(path)); } return void 0; @@ -1691,7 +1783,7 @@ class Dialogs { return windowDialogQueue; } - public showMessageBox(options: Electron.MessageBoxOptions, window?: ICodeWindow): TPromise { + showMessageBox(options: Electron.MessageBoxOptions, window?: ICodeWindow): TPromise { return this.getDialogQueue(window).queue(() => { return new TPromise((c, e) => { dialog.showMessageBox(window ? window.win : void 0, options, (response: number, checkboxChecked: boolean) => { @@ -1701,7 +1793,7 @@ class Dialogs { }); } - public showSaveDialog(options: Electron.SaveDialogOptions, window?: ICodeWindow): TPromise { + showSaveDialog(options: Electron.SaveDialogOptions, window?: ICodeWindow): TPromise { function normalizePath(path: string): string { if (path && isMacintosh) { @@ -1720,7 +1812,7 @@ class Dialogs { }); } - public showOpenDialog(options: Electron.OpenDialogOptions, window?: ICodeWindow): TPromise { + showOpenDialog(options: Electron.OpenDialogOptions, window?: ICodeWindow): TPromise { function normalizePaths(paths: string[]): string[] { if (paths && paths.length > 0 && isMacintosh) { @@ -1764,7 +1856,7 @@ class WorkspacesManager { ) { } - public saveAndEnterWorkspace(window: ICodeWindow, path: string): TPromise { + saveAndEnterWorkspace(window: ICodeWindow, path: string): TPromise { if (!window || !window.win || window.readyState !== ReadyState.READY || !window.openedWorkspace || !path || !this.isValidTargetWorkspacePath(window, path)) { return TPromise.as(null); // return early if the window is not ready or disposed or does not have a workspace } @@ -1772,7 +1864,24 @@ class WorkspacesManager { return this.doSaveAndOpenWorkspace(window, window.openedWorkspace, path); } - public createAndEnterWorkspace(window: ICodeWindow, folders?: IWorkspaceFolderCreationData[], path?: string): TPromise { + enterWorkspace(window: ICodeWindow, path: string): TPromise { + if (!window || !window.win || window.readyState !== ReadyState.READY) { + return TPromise.as(null); // return early if the window is not ready or disposed + } + + return this.isValidTargetWorkspacePath(window, path).then(isValid => { + if (!isValid) { + return TPromise.as(null); // return early if the workspace is not valid + } + + return this.workspacesMainService.resolveWorkspace(path).then(workspace => { + return this.doOpenWorkspace(window, workspace); + }); + }); + + } + + createAndEnterWorkspace(window: ICodeWindow, folders?: IWorkspaceFolderCreationData[], path?: string): TPromise { if (!window || !window.win || window.readyState !== ReadyState.READY) { return TPromise.as(null); // return early if the window is not ready or disposed } @@ -1823,25 +1932,27 @@ class WorkspacesManager { savePromise = TPromise.as(workspace); } - return savePromise.then(workspace => { - window.focus(); - - // Register window for backups and migrate current backups over - let backupPath: string; - if (!window.config.extensionDevelopmentPath) { - backupPath = this.backupMainService.registerWorkspaceBackupSync(workspace, window.config.backupPath); - } - - // Update window configuration properly based on transition to workspace - window.config.folderPath = void 0; - window.config.workspace = workspace; - window.config.backupPath = backupPath; - - return { workspace, backupPath }; - }); + return savePromise.then(workspace => this.doOpenWorkspace(window, workspace)); } - public pickWorkspaceAndOpen(options: INativeOpenDialogOptions): void { + private doOpenWorkspace(window: ICodeWindow, workspace: IWorkspaceIdentifier): IEnterWorkspaceResult { + window.focus(); + + // Register window for backups and migrate current backups over + let backupPath: string; + if (!window.config.extensionDevelopmentPath) { + backupPath = this.backupMainService.registerWorkspaceBackupSync(workspace, window.config.backupPath); + } + + // Update window configuration properly based on transition to workspace + window.config.folderUri = void 0; + window.config.workspace = workspace; + window.config.backupPath = backupPath; + + return { workspace, backupPath }; + } + + pickWorkspaceAndOpen(options: INativeOpenDialogOptions): void { const window = this.windowsMainService.getWindowById(options.windowId) || this.windowsMainService.getFocusedWindow() || this.windowsMainService.getLastActiveWindow(); this.windowsMainService.pickFileAndOpen({ @@ -1859,7 +1970,7 @@ class WorkspacesManager { }); } - public promptToSaveUntitledWorkspace(window: ICodeWindow, workspace: IWorkspaceIdentifier): TPromise { + promptToSaveUntitledWorkspace(window: ICodeWindow, workspace: IWorkspaceIdentifier): TPromise { enum ConfirmResult { SAVE, DONT_SAVE, @@ -1927,7 +2038,7 @@ class WorkspacesManager { private getUntitledWorkspaceSaveDialogDefaultPath(workspace?: IWorkspaceIdentifier | ISingleFolderWorkspaceIdentifier): string { if (workspace) { if (isSingleFolderWorkspaceIdentifier(workspace)) { - return dirname(workspace); + return workspace.scheme === Schemas.file ? dirname(workspace.fsPath) : void 0; } const resolvedWorkspace = this.workspacesMainService.resolveWorkspaceSync(workspace.configPath); diff --git a/src/vs/code/node/cli.ts b/src/vs/code/node/cli.ts index faca473ecd..22356b5858 100644 --- a/src/vs/code/node/cli.ts +++ b/src/vs/code/node/cli.ts @@ -31,7 +31,7 @@ interface IMainCli { main: (argv: ParsedArgs) => TPromise; } -export async function main(argv: string[]): TPromise { +export async function main(argv: string[]): Promise { let args: ParsedArgs; try { @@ -318,7 +318,7 @@ export async function main(argv: string[]): TPromise { env }; - if (typeof args['upload-logs'] !== undefined) { + if (typeof args['upload-logs'] !== 'undefined') { options['stdio'] = ['pipe', 'pipe', 'pipe']; } else if (!verbose) { options['stdio'] = 'ignore'; diff --git a/src/vs/code/node/cliProcessMain.ts b/src/vs/code/node/cliProcessMain.ts index e56a122d65..fda72ea752 100644 --- a/src/vs/code/node/cliProcessMain.ts +++ b/src/vs/code/node/cliProcessMain.ts @@ -7,6 +7,7 @@ import { localize } from 'vs/nls'; import product from 'vs/platform/node/product'; import pkg from 'vs/platform/node/package'; import * as path from 'path'; +import * as semver from 'semver'; import { TPromise } from 'vs/base/common/winjs.base'; import { sequence } from 'vs/base/common/async'; @@ -38,6 +39,8 @@ import { ILogService, getLogLevel } from 'vs/platform/log/common/log'; import { isPromiseCanceledError } from 'vs/base/common/errors'; import { IDialogService } from 'vs/platform/dialogs/common/dialogs'; import { CommandLineDialogService } from 'vs/platform/dialogs/node/dialogService'; +import { areSameExtensions, getGalleryExtensionIdFromLocal } from 'vs/platform/extensionManagement/common/extensionManagementUtil'; +import Severity from 'vs/base/common/severity'; const notFound = (id: string) => localize('notFound', "Extension '{0}' not found.", id); const notInstalled = (id: string) => localize('notInstalled', "Extension '{0}' is not installed.", id); @@ -58,26 +61,28 @@ class Main { constructor( @IEnvironmentService private environmentService: IEnvironmentService, @IExtensionManagementService private extensionManagementService: IExtensionManagementService, - @IExtensionGalleryService private extensionGalleryService: IExtensionGalleryService + @IExtensionGalleryService private extensionGalleryService: IExtensionGalleryService, + @IDialogService private dialogService: IDialogService ) { } run(argv: ParsedArgs): TPromise { // TODO@joao - make this contributable + let returnPromise: TPromise; if (argv['install-source']) { - return this.setInstallSource(argv['install-source']); + returnPromise = this.setInstallSource(argv['install-source']); } else if (argv['list-extensions']) { - return this.listExtensions(argv['show-versions']); + returnPromise = this.listExtensions(argv['show-versions']); } else if (argv['install-extension']) { const arg = argv['install-extension']; const args: string[] = typeof arg === 'string' ? [arg] : arg; - return this.installExtension(args); + returnPromise = this.installExtension(args); } else if (argv['uninstall-extension']) { const arg = argv['uninstall-extension']; const ids: string[] = typeof arg === 'string' ? [arg] : arg; - return this.uninstallExtension(ids); + returnPromise = this.uninstallExtension(ids); } - return undefined; + return returnPromise || TPromise.as(null); } private setInstallSource(installSource: string): TPromise { @@ -111,15 +116,8 @@ class Main { const galleryTasks: Task[] = extensions .filter(e => !/\.vsix$/i.test(e)) .map(id => () => { - return this.extensionManagementService.getInstalled(LocalExtensionType.User).then(installed => { - const isInstalled = installed.some(e => getId(e.manifest) === id); - - if (isInstalled) { - console.log(localize('alreadyInstalled', "Extension '{0}' is already installed.", id)); - return TPromise.as(null); - } - - return this.extensionGalleryService.query({ names: [id], source: 'cli' }) + return this.extensionManagementService.getInstalled(LocalExtensionType.User) + .then(installed => this.extensionGalleryService.query({ names: [id], source: 'cli' }) .then>(null, err => { if (err.responseText) { try { @@ -129,7 +127,6 @@ class Main { // noop } } - return TPromise.wrapError(err); }) .then(result => { @@ -139,29 +136,52 @@ class Main { return TPromise.wrapError(new Error(`${notFound(id)}\n${useId}`)); } - console.log(localize('foundExtension', "Found '{0}' in the marketplace.", id)); - console.log(localize('installing', "Installing...")); + const [installedExtension] = installed.filter(e => areSameExtensions({ id: getGalleryExtensionIdFromLocal(e) }, { id })); + if (installedExtension) { + const outdated = semver.gt(extension.version, installedExtension.manifest.version); + if (outdated) { + const updateMessage = localize('updateMessage', "Extension '{0}' v{1} is already installed, but a newer version {2} is available in the marketplace. Would you like to update?", id, installedExtension.manifest.version, extension.version); + return this.dialogService.show(Severity.Info, updateMessage, [localize('yes', "Yes"), localize('no', "No")]) + .then(option => { + if (option === 0) { + return this.installFromGallery(id, extension); + } + console.log(localize('cancelInstall', "Cancelled installing Extension '{0}'.", id)); + return TPromise.as(null); + }); - return this.extensionManagementService.installFromGallery(extension) - .then( - () => console.log(localize('successInstall', "Extension '{0}' v{1} was successfully installed!", id, extension.version)), - error => { - if (isPromiseCanceledError(error)) { - console.log(localize('cancelVsixInstall', "Cancelled installing Extension '{0}'.", id)); - return null; - } else { - return TPromise.wrapError(error); - } - }); - }); - }); + } else { + console.log(localize('alreadyInstalled', "Extension '{0}' is already installed.", id)); + return TPromise.as(null); + } + } else { + console.log(localize('foundExtension', "Found '{0}' in the marketplace.", id)); + return this.installFromGallery(id, extension); + } + + })); }); return sequence([...vsixTasks, ...galleryTasks]); } + private installFromGallery(id: string, extension: IGalleryExtension): TPromise { + console.log(localize('installing', "Installing...")); + return this.extensionManagementService.installFromGallery(extension) + .then( + () => console.log(localize('successInstall', "Extension '{0}' v{1} was successfully installed!", id, extension.version)), + error => { + if (isPromiseCanceledError(error)) { + console.log(localize('cancelVsixInstall', "Cancelled installing Extension '{0}'.", id)); + return null; + } else { + return TPromise.wrapError(error); + } + }); + } + private uninstallExtension(extensions: string[]): TPromise { - async function getExtensionId(extensionDescription: string): TPromise { + async function getExtensionId(extensionDescription: string): Promise { if (!/\.vsix$/i.test(extensionDescription)) { return extensionDescription; } @@ -174,7 +194,7 @@ class Main { return sequence(extensions.map(extension => () => { return getExtensionId(extension).then(id => { return this.extensionManagementService.getInstalled(LocalExtensionType.User).then(installed => { - const [extension] = installed.filter(e => getId(e.manifest) === id); + const [extension] = installed.filter(e => areSameExtensions({ id: getGalleryExtensionIdFromLocal(e) }, { id })); if (!extension) { return TPromise.wrapError(new Error(`${notInstalled(id)}\n${useId}`)); @@ -221,17 +241,13 @@ export function main(argv: ParsedArgs): TPromise { services.set(IExtensionGalleryService, new SyncDescriptor(ExtensionGalleryService)); services.set(IDialogService, new SyncDescriptor(CommandLineDialogService)); + const appenders: AppInsightsAppender[] = []; if (isBuilt && !extensionDevelopmentPath && !envService.args['disable-telemetry'] && product.enableTelemetry) { - const appenders: AppInsightsAppender[] = []; if (product.aiConfig && product.aiConfig.asimovKey) { - appenders.push(new AppInsightsAppender(eventPrefix, null, product.aiConfig.asimovKey)); + appenders.push(new AppInsightsAppender(eventPrefix, null, product.aiConfig.asimovKey, logService)); } - // It is important to dispose the AI adapter properly because - // only then they flush remaining data. - process.once('exit', () => appenders.forEach(a => a.dispose())); - const config: ITelemetryServiceConfig = { appender: combinedAppender(...appenders), commonProperties: resolveCommonProperties(product.commit, pkg.version, stateService.getItem('telemetry.machineId'), installSourcePath), @@ -246,7 +262,10 @@ export function main(argv: ParsedArgs): TPromise { const instantiationService2 = instantiationService.createChild(services); const main = instantiationService2.createInstance(Main); - return main.run(argv); + return main.run(argv).then(() => { + // Dispose the AI adapter so that remaining data gets flushed. + return combinedAppender(...appenders).dispose(); + }); }); }); } diff --git a/src/vs/code/node/windowsFinder.ts b/src/vs/code/node/windowsFinder.ts index 6f54221d00..eb9fc8c995 100644 --- a/src/vs/code/node/windowsFinder.ts +++ b/src/vs/code/node/windowsFinder.ts @@ -8,12 +8,14 @@ import * as platform from 'vs/base/common/platform'; import * as paths from 'vs/base/common/paths'; import { OpenContext } from 'vs/platform/windows/common/windows'; -import { IWorkspaceIdentifier, ISingleFolderWorkspaceIdentifier, isSingleFolderWorkspaceIdentifier, IResolvedWorkspace } from 'vs/platform/workspaces/common/workspaces'; +import { IWorkspaceIdentifier, IResolvedWorkspace, ISingleFolderWorkspaceIdentifier, isSingleFolderWorkspaceIdentifier } from 'vs/platform/workspaces/common/workspaces'; import { Schemas } from 'vs/base/common/network'; +import URI from 'vs/base/common/uri'; +import { hasToIgnoreCase, isEqual } from 'vs/base/common/resources'; export interface ISimpleWindow { openedWorkspace?: IWorkspaceIdentifier; - openedFolderPath?: string; + openedFolderUri?: URI; openedFilePath?: string; extensionDevelopmentPath?: string; lastFocusTime: number; @@ -30,7 +32,7 @@ export interface IBestWindowOrFolderOptions { workspaceResolver: (workspace: IWorkspaceIdentifier) => IResolvedWorkspace; } -export function findBestWindowOrFolderForFile({ windows, newWindow, reuseWindow, context, filePath, userHome, codeSettingsFolder, workspaceResolver }: IBestWindowOrFolderOptions): W | string { +export function findBestWindowOrFolderForFile({ windows, newWindow, reuseWindow, context, filePath, workspaceResolver }: IBestWindowOrFolderOptions): W { if (!newWindow && filePath && (context === OpenContext.DESKTOP || context === OpenContext.CLI || context === OpenContext.DOCK)) { const windowOnFilePath = findWindowOnFilePath(windows, filePath, workspaceResolver); if (windowOnFilePath) { @@ -54,9 +56,9 @@ function findWindowOnFilePath(windows: W[], filePath: s } // Then go with single folder windows that are parent of the provided file path - const singleFolderWindowsOnFilePath = windows.filter(window => typeof window.openedFolderPath === 'string' && paths.isEqualOrParent(filePath, window.openedFolderPath, !platform.isLinux /* ignorecase */)); + const singleFolderWindowsOnFilePath = windows.filter(window => window.openedFolderUri && window.openedFolderUri.scheme === Schemas.file && paths.isEqualOrParent(filePath, window.openedFolderUri.fsPath, !platform.isLinux /* ignorecase */)); if (singleFolderWindowsOnFilePath.length) { - return singleFolderWindowsOnFilePath.sort((a, b) => -(a.openedFolderPath.length - b.openedFolderPath.length))[0]; + return singleFolderWindowsOnFilePath.sort((a, b) => -(a.openedFolderUri.path.length - b.openedFolderUri.path.length))[0]; } return null; @@ -73,7 +75,7 @@ export function findWindowOnWorkspace(windows: W[], wor // match on folder if (isSingleFolderWorkspaceIdentifier(workspace)) { - if (typeof window.openedFolderPath === 'string' && (paths.isEqual(window.openedFolderPath, workspace, !platform.isLinux /* ignorecase */))) { + if (window.openedFolderUri && isEqual(window.openedFolderUri, workspace, hasToIgnoreCase(window.openedFolderUri))) { return true; } } @@ -101,16 +103,16 @@ export function findWindowOnExtensionDevelopmentPath(wi })[0]; } -export function findWindowOnWorkspaceOrFolderPath(windows: W[], path: string): W { +export function findWindowOnWorkspaceOrFolderUri(windows: W[], uri: URI): W { return windows.filter(window => { // check for workspace config path - if (window.openedWorkspace && paths.isEqual(window.openedWorkspace.configPath, path, !platform.isLinux /* ignorecase */)) { + if (window.openedWorkspace && isEqual(URI.file(window.openedWorkspace.configPath), uri, !platform.isLinux /* ignorecase */)) { return true; } // check for folder path - if (window.openedFolderPath && paths.isEqual(window.openedFolderPath, path, !platform.isLinux /* ignorecase */)) { + if (window.openedFolderUri && isEqual(window.openedFolderUri, uri, hasToIgnoreCase(uri))) { return true; } diff --git a/src/vs/code/test/node/windowsFinder.test.ts b/src/vs/code/test/node/windowsFinder.test.ts index bbb7e7d2f9..4744e14aa3 100644 --- a/src/vs/code/test/node/windowsFinder.test.ts +++ b/src/vs/code/test/node/windowsFinder.test.ts @@ -10,6 +10,7 @@ import { findBestWindowOrFolderForFile, ISimpleWindow, IBestWindowOrFolderOption import { OpenContext } from 'vs/platform/windows/common/windows'; import { IWorkspaceIdentifier } from 'vs/platform/workspaces/common/workspaces'; import { toWorkspaceFolders } from 'vs/platform/workspace/common/workspace'; +import URI from 'vs/base/common/uri'; const fixturesFolder = require.toUrl('./fixtures'); @@ -30,10 +31,10 @@ function options(custom?: Partial>): I }; } -const vscodeFolderWindow = { lastFocusTime: 1, openedFolderPath: path.join(fixturesFolder, 'vscode_folder') }; -const lastActiveWindow = { lastFocusTime: 3, openedFolderPath: null }; -const noVscodeFolderWindow = { lastFocusTime: 2, openedFolderPath: path.join(fixturesFolder, 'no_vscode_folder') }; -const windows = [ +const vscodeFolderWindow: ISimpleWindow = { lastFocusTime: 1, openedFolderUri: URI.file(path.join(fixturesFolder, 'vscode_folder')) }; +const lastActiveWindow: ISimpleWindow = { lastFocusTime: 3, openedFolderUri: null }; +const noVscodeFolderWindow: ISimpleWindow = { lastFocusTime: 2, openedFolderUri: URI.file(path.join(fixturesFolder, 'no_vscode_folder')) }; +const windows: ISimpleWindow[] = [ vscodeFolderWindow, lastActiveWindow, noVscodeFolderWindow, @@ -103,7 +104,7 @@ suite('WindowsFinder', () => { windows, filePath: path.join(fixturesFolder, 'vscode_folder', 'file.txt') })), vscodeFolderWindow); - const window = { lastFocusTime: 1, openedFolderPath: path.join(fixturesFolder, 'vscode_folder', 'nested_folder') }; + const window: ISimpleWindow = { lastFocusTime: 1, openedFolderUri: URI.file(path.join(fixturesFolder, 'vscode_folder', 'nested_folder')) }; assert.equal(findBestWindowOrFolderForFile(options({ windows: [window], filePath: path.join(fixturesFolder, 'vscode_folder', 'nested_folder', 'subfolder', 'file.txt') @@ -111,8 +112,8 @@ suite('WindowsFinder', () => { }); test('More specific existing window wins', () => { - const window = { lastFocusTime: 2, openedFolderPath: path.join(fixturesFolder, 'no_vscode_folder') }; - const nestedFolderWindow = { lastFocusTime: 1, openedFolderPath: path.join(fixturesFolder, 'no_vscode_folder', 'nested_folder') }; + const window: ISimpleWindow = { lastFocusTime: 2, openedFolderUri: URI.file(path.join(fixturesFolder, 'no_vscode_folder')) }; + const nestedFolderWindow: ISimpleWindow = { lastFocusTime: 1, openedFolderUri: URI.file(path.join(fixturesFolder, 'no_vscode_folder', 'nested_folder')) }; assert.equal(findBestWindowOrFolderForFile(options({ windows: [window, nestedFolderWindow], filePath: path.join(fixturesFolder, 'no_vscode_folder', 'nested_folder', 'subfolder', 'file.txt') @@ -120,7 +121,7 @@ suite('WindowsFinder', () => { }); test('Workspace folder wins', () => { - const window = { lastFocusTime: 1, openedWorkspace: testWorkspace }; + const window: ISimpleWindow = { lastFocusTime: 1, openedWorkspace: testWorkspace }; assert.equal(findBestWindowOrFolderForFile(options({ windows: [window], filePath: path.join(fixturesFolder, 'vscode_workspace_2_folder', 'nested_vscode_folder', 'subfolder', 'file.txt') diff --git a/src/vs/editor/browser/codeEditor.ts b/src/vs/editor/browser/codeEditor.ts deleted file mode 100644 index 58d616bffd..0000000000 --- a/src/vs/editor/browser/codeEditor.ts +++ /dev/null @@ -1,39 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the Source EULA. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ -'use strict'; - -import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { ICommandService } from 'vs/platform/commands/common/commands'; -import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; -import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService'; -import { CodeEditorWidget } from 'vs/editor/browser/widget/codeEditorWidget'; -import { EditorAction, EditorExtensionsRegistry, IEditorContributionCtor } from 'vs/editor/browser/editorExtensions'; -import { IEditorOptions } from 'vs/editor/common/config/editorOptions'; -import { IThemeService } from 'vs/platform/theme/common/themeService'; -import { INotificationService } from 'vs/platform/notification/common/notification'; - -export class CodeEditor extends CodeEditorWidget { - - constructor( - domElement: HTMLElement, - options: IEditorOptions, - @IInstantiationService instantiationService: IInstantiationService, - @ICodeEditorService codeEditorService: ICodeEditorService, - @ICommandService commandService: ICommandService, - @IContextKeyService contextKeyService: IContextKeyService, - @IThemeService themeService: IThemeService, - @INotificationService notificationService: INotificationService - ) { - super(domElement, options, false, instantiationService, codeEditorService, commandService, contextKeyService, themeService, notificationService); - } - - protected _getContributions(): IEditorContributionCtor[] { - return EditorExtensionsRegistry.getEditorContributions(); - } - - protected _getActions(): EditorAction[] { - return EditorExtensionsRegistry.getEditorActions(); - } -} diff --git a/src/vs/editor/browser/controller/coreCommands.ts b/src/vs/editor/browser/controller/coreCommands.ts index 8e8ce234e3..f568e346fd 100644 --- a/src/vs/editor/browser/controller/coreCommands.ts +++ b/src/vs/editor/browser/controller/coreCommands.ts @@ -5,6 +5,7 @@ 'use strict'; +import * as nls from 'vs/nls'; import { Position } from 'vs/editor/common/core/position'; import { Range } from 'vs/editor/common/core/range'; import * as editorCommon from 'vs/editor/common/editorCommon'; @@ -16,19 +17,19 @@ import { registerEditorCommand, ICommandOptions, EditorCommand, Command } from ' import { IColumnSelectResult, ColumnSelection } from 'vs/editor/common/controller/cursorColumnSelection'; import { EditorContextKeys } from 'vs/editor/common/editorContextKeys'; import { KeyMod, KeyCode } from 'vs/base/common/keyCodes'; -import { KeybindingsRegistry } from 'vs/platform/keybinding/common/keybindingsRegistry'; +import { KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry'; import H = editorCommon.Handler; -import { ICodeEditorService, getCodeEditor } from 'vs/editor/browser/services/codeEditorService'; +import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService'; import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; import * as types from 'vs/base/common/types'; import { ICommandHandlerDescription } from 'vs/platform/commands/common/commands'; -import { IEditorService } from 'vs/platform/editor/common/editor'; import { TypeOperations } from 'vs/editor/common/controller/cursorTypeOperations'; import { DeleteOperations } from 'vs/editor/common/controller/cursorDeleteOperations'; import { VerticalRevealType } from 'vs/editor/common/view/viewEvents'; import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; +import { MenuId } from 'vs/platform/actions/common/actions'; -const CORE_WEIGHT = KeybindingsRegistry.WEIGHT.editorCore(); +const CORE_WEIGHT = KeybindingWeight.EditorCore; export abstract class CoreEditorCommand extends EditorCommand { public runEditorCommand(accessor: ServicesAccessor, editor: ICodeEditor, args: any): void { @@ -704,10 +705,6 @@ export namespace CoreNavigationCommands { public runCoreEditorCommand(cursors: ICursors, args: any): void { const context = cursors.context; - if (context.config.readOnly) { - return; - } - let newState: CursorState; if (args.wholeLine) { newState = CursorMoveCommands.line(context, cursors.getPrimaryCursor(), false, args.position, args.viewPosition); @@ -769,10 +766,6 @@ export namespace CoreNavigationCommands { public runCoreEditorCommand(cursors: ICursors, args: any): void { const context = cursors.context; - if (context.config.readOnly) { - return; - } - const lastAddedCursorIndex = cursors.getLastAddedCursorIndex(); let newStates = cursors.getAll().slice(0); @@ -1251,9 +1244,6 @@ export namespace CoreNavigationCommands { public runCoreEditorCommand(cursors: ICursors, args: any): void { const context = cursors.context; - if (context.config.readOnly) { - return; - } const lastAddedCursorIndex = cursors.getLastAddedCursorIndex(); @@ -1312,12 +1302,6 @@ export namespace CoreNavigationCommands { } public runCoreEditorCommand(cursors: ICursors, args: any): void { - const context = cursors.context; - - if (context.config.readOnly) { - return; - } - const lastAddedCursorIndex = cursors.getLastAddedCursorIndex(); let newStates = cursors.getAll().slice(0); @@ -1637,14 +1621,8 @@ function findFocusedEditor(accessor: ServicesAccessor): ICodeEditor { return accessor.get(ICodeEditorService).getFocusedCodeEditor(); } -function getWorkbenchActiveEditor(accessor: ServicesAccessor): ICodeEditor { - const editorService = accessor.get(IEditorService); - let activeEditor = (editorService).getActiveEditor && (editorService).getActiveEditor(); - return getCodeEditor(activeEditor); -} - function registerCommand(command: Command) { - KeybindingsRegistry.registerCommandAndKeybindingRule(command.toCommandAndKeybindingRule(CORE_WEIGHT)); + command.register(); } /** @@ -1668,7 +1646,7 @@ class EditorOrNativeTextInputCommand extends Command { let focusedEditor = findFocusedEditor(accessor); // Only if editor text focus (i.e. not if editor has widget focus). - if (focusedEditor && focusedEditor.isFocused()) { + if (focusedEditor && focusedEditor.hasTextFocus()) { return this._runEditorHandler(focusedEditor, args); } @@ -1679,8 +1657,8 @@ class EditorOrNativeTextInputCommand extends Command { return; } - // Redirecting to last active editor - let activeEditor = getWorkbenchActiveEditor(accessor); + // Redirecting to active editor + let activeEditor = accessor.get(ICodeEditorService).getActiveCodeEditor(); if (activeEditor) { activeEditor.focus(); return this._runEditorHandler(activeEditor, args); @@ -1728,11 +1706,17 @@ registerCommand(new EditorOrNativeTextInputCommand({ editorHandler: CoreNavigationCommands.SelectAll, inputHandler: 'selectAll', id: 'editor.action.selectAll', - precondition: null, + precondition: EditorContextKeys.textInputFocus, kbOpts: { weight: CORE_WEIGHT, kbExpr: null, primary: KeyMod.CtrlCmd | KeyCode.KEY_A + }, + menubarOpts: { + menuId: MenuId.MenubarSelectionMenu, + group: '1_basic', + title: nls.localize({ key: 'miSelectAll', comment: ['&& denotes a mnemonic'] }, "&&Select All"), + order: 1 } })); @@ -1745,6 +1729,12 @@ registerCommand(new EditorOrNativeTextInputCommand({ weight: CORE_WEIGHT, kbExpr: EditorContextKeys.textInputFocus, primary: KeyMod.CtrlCmd | KeyCode.KEY_Z + }, + menubarOpts: { + menuId: MenuId.MenubarEditMenu, + group: '1_do', + title: nls.localize({ key: 'miUndo', comment: ['&& denotes a mnemonic'] }, "&&Undo"), + order: 1 } })); registerCommand(new EditorHandlerCommand('default:' + H.Undo, H.Undo)); @@ -1760,6 +1750,12 @@ registerCommand(new EditorOrNativeTextInputCommand({ primary: KeyMod.CtrlCmd | KeyCode.KEY_Y, secondary: [KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.KEY_Z], mac: { primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.KEY_Z } + }, + menubarOpts: { + menuId: MenuId.MenubarEditMenu, + group: '1_do', + title: nls.localize({ key: 'miRedo', comment: ['&& denotes a mnemonic'] }, "&&Redo"), + order: 2 } })); registerCommand(new EditorHandlerCommand('default:' + H.Redo, H.Redo)); diff --git a/src/vs/editor/browser/controller/mouseTarget.ts b/src/vs/editor/browser/controller/mouseTarget.ts index 0e2edf6862..3dce8c6b0d 100644 --- a/src/vs/editor/browser/controller/mouseTarget.ts +++ b/src/vs/editor/browser/controller/mouseTarget.ts @@ -28,6 +28,7 @@ export interface IViewZoneData { export interface IMarginData { isAfterLines: boolean; + glyphMarginLeft: number; glyphMarginWidth: number; lineNumbersWidth: number; offsetX: number; @@ -602,6 +603,7 @@ export class MouseTargetFactory { let offset = Math.abs(request.pos.x - request.editorPos.x); const detail: IMarginData = { isAfterLines: res.isAfterLines, + glyphMarginLeft: ctx.layoutInfo.glyphMarginLeft, glyphMarginWidth: ctx.layoutInfo.glyphMarginWidth, lineNumbersWidth: ctx.layoutInfo.lineNumbersWidth, offsetX: offset diff --git a/src/vs/editor/browser/controller/textAreaInput.ts b/src/vs/editor/browser/controller/textAreaInput.ts index caf5729c0b..5a75552b14 100644 --- a/src/vs/editor/browser/controller/textAreaInput.ts +++ b/src/vs/editor/browser/controller/textAreaInput.ts @@ -126,7 +126,8 @@ export class TextAreaInput extends Disposable { this._nextCommand = ReadFromTextArea.Type; this._register(dom.addStandardDisposableListener(textArea.domNode, 'keydown', (e: IKeyboardEvent) => { - if (this._isDoingComposition && e.keyCode === KeyCode.KEY_IN_COMPOSITION) { + if (this._isDoingComposition && + (e.keyCode === KeyCode.KEY_IN_COMPOSITION || e.keyCode === KeyCode.Backspace)) { // Stop propagation for keyDown events if the IME is processing key input e.stopPropagation(); } @@ -204,15 +205,6 @@ export class TextAreaInput extends Disposable { this._register(dom.addDisposableListener(textArea.domNode, 'compositionupdate', (e: CompositionEvent) => { this._lastTextAreaEvent = TextAreaInputEventType.compositionupdate; - if (browser.isChromev56) { - // See https://github.com/Microsoft/monaco-editor/issues/320 - // where compositionupdate .data is broken in Chrome v55 and v56 - // See https://bugs.chromium.org/p/chromium/issues/detail?id=677050#c9 - // The textArea doesn't get the composition update yet, the value of textarea is still obsolete - // so we can't correct e at this moment. - return; - } - if (compositionDataInValid(e.locale)) { const [newState, typeInput] = deduceInputFromTextAreaValue(/*couldBeEmojiInput*/false, /*couldBeTypingAtOffset0*/false); this._textAreaState = newState; @@ -265,17 +257,6 @@ export class TextAreaInput extends Disposable { this._textArea.setIgnoreSelectionChangeTime('received input event'); if (this._isDoingComposition) { - // See https://github.com/Microsoft/monaco-editor/issues/320 - if (browser.isChromev56) { - const [newState, typeInput] = deduceComposition(this._textArea.getValue()); - this._textAreaState = newState; - - this._onType.fire(typeInput); - let e: ICompositionData = { - data: typeInput.text - }; - this._onCompositionUpdate.fire(e); - } return; } @@ -286,7 +267,6 @@ export class TextAreaInput extends Disposable { } this._textAreaState = newState; - // console.log('==> DEDUCED INPUT: ' + JSON.stringify(typeInput)); if (this._nextCommand === ReadFromTextArea.Type) { if (typeInput.text !== '') { this._onType.fire(typeInput); @@ -501,7 +481,7 @@ export class TextAreaInput extends Disposable { } let copyHTML: string = null; - if (!browser.isEdgeOrIE && (copyPlainText.length < 65536 || CopyOptions.forceCopyWithSyntaxHighlighting)) { + if (browser.hasClipboardSupport() && (copyPlainText.length < 65536 || CopyOptions.forceCopyWithSyntaxHighlighting)) { copyHTML = this._host.getHTMLToCopy(); } ClipboardEventUtils.setTextData(e, copyPlainText, copyHTML); diff --git a/src/vs/editor/browser/controller/textAreaState.ts b/src/vs/editor/browser/controller/textAreaState.ts index b0fa4ae129..b147de3b7e 100644 --- a/src/vs/editor/browser/controller/textAreaState.ts +++ b/src/vs/editor/browser/controller/textAreaState.ts @@ -121,7 +121,7 @@ export class TextAreaState { // See https://github.com/Microsoft/vscode/issues/42251 // where typing always happens at offset 0 in the textarea // when using a custom title area in OSX and moving the window - if (strings.endsWith(currentValue, previousValue)) { + if (!strings.startsWith(currentValue, previousValue) && strings.endsWith(currentValue, previousValue)) { // Looks like something was typed at offset 0 // ==> pretend we placed the cursor at offset 0 to begin with... previousSelectionStart = 0; diff --git a/src/vs/editor/browser/editorBrowser.ts b/src/vs/editor/browser/editorBrowser.ts index 444470398c..14e647d9db 100644 --- a/src/vs/editor/browser/editorBrowser.ts +++ b/src/vs/editor/browser/editorBrowser.ts @@ -53,6 +53,11 @@ export interface IViewZone { * If neither `heightInPx` nor `heightInLines` is specified, a default of `heightInLines` = 1 will be chosen. */ heightInPx?: number; + /** + * The minimum width in px of the view zone. + * If this is set, the editor will ensure that the scroll width is >= than this value. + */ + minWidthInPx?: number; /** * The dom node of the view zone */ @@ -360,12 +365,12 @@ export interface ICodeEditor extends editorCommon.IEditor { */ onDidChangeModelDecorations(listener: (e: IModelDecorationsChangedEvent) => void): IDisposable; /** - * An event emitted when the text inside this editor gained focus (i.e. cursor blinking). + * An event emitted when the text inside this editor gained focus (i.e. cursor starts blinking). * @event */ onDidFocusEditorText(listener: () => void): IDisposable; /** - * An event emitted when the text inside this editor lost focus. + * An event emitted when the text inside this editor lost focus (i.e. cursor stops blinking). * @event */ onDidBlurEditorText(listener: () => void): IDisposable; @@ -373,12 +378,12 @@ export interface ICodeEditor extends editorCommon.IEditor { * An event emitted when the text inside this editor or an editor widget gained focus. * @event */ - onDidFocusEditor(listener: () => void): IDisposable; + onDidFocusEditorWidget(listener: () => void): IDisposable; /** * An event emitted when the text inside this editor or an editor widget lost focus. * @event */ - onDidBlurEditor(listener: () => void): IDisposable; + onDidBlurEditorWidget(listener: () => void): IDisposable; /** * An event emitted before interpreting typed characters (on the keyboard). * @event @@ -472,7 +477,7 @@ export interface ICodeEditor extends editorCommon.IEditor { restoreViewState(state: editorCommon.ICodeEditorViewState): void; /** - * Returns true if this editor or one of its widgets has keyboard focus. + * Returns true if the text inside this editor or an editor widget has focus. */ hasWidgetFocus(): boolean; @@ -573,9 +578,9 @@ export interface ICodeEditor extends editorCommon.IEditor { * The edits will land on the undo-redo stack, but no "undo stop" will be pushed. * @param source The source of the call. * @param edits The edits to execute. - * @param endCursoState Cursor state after the edits were applied. + * @param endCursorState Cursor state after the edits were applied. */ - executeEdits(source: string, edits: IIdentifiedSingleEditOperation[], endCursoState?: Selection[]): boolean; + executeEdits(source: string, edits: IIdentifiedSingleEditOperation[], endCursorState?: Selection[]): boolean; /** * Execute multiple (concommitent) commands on the editor. @@ -834,3 +839,18 @@ export function isDiffEditor(thing: any): thing is IDiffEditor { return false; } } + +/** + *@internal + */ +export function getCodeEditor(thing: any): ICodeEditor { + if (isCodeEditor(thing)) { + return thing; + } + + if (isDiffEditor(thing)) { + return thing.getModifiedEditor(); + } + + return null; +} diff --git a/src/vs/editor/browser/editorDom.ts b/src/vs/editor/browser/editorDom.ts index ee2f5a665d..9504e1825d 100644 --- a/src/vs/editor/browser/editorDom.ts +++ b/src/vs/editor/browser/editorDom.ts @@ -14,13 +14,11 @@ import { GlobalMouseMoveMonitor } from 'vs/base/browser/globalMouseMoveMonitor'; */ export class PageCoordinates { _pageCoordinatesBrand: void; - public readonly x: number; - public readonly y: number; - constructor(x: number, y: number) { - this.x = x; - this.y = y; - } + constructor( + public readonly x: number, + public readonly y: number + ) { } public toClientCoordinates(): ClientCoordinates { return new ClientCoordinates(this.x - dom.StandardWindow.scrollX, this.y - dom.StandardWindow.scrollY); @@ -37,13 +35,10 @@ export class PageCoordinates { export class ClientCoordinates { _clientCoordinatesBrand: void; - public readonly clientX: number; - public readonly clientY: number; - - constructor(clientX: number, clientY: number) { - this.clientX = clientX; - this.clientY = clientY; - } + constructor( + public readonly clientX: number, + public readonly clientY: number + ) { } public toPageCoordinates(): PageCoordinates { return new PageCoordinates(this.clientX + dom.StandardWindow.scrollX, this.clientY + dom.StandardWindow.scrollY); @@ -56,17 +51,12 @@ export class ClientCoordinates { export class EditorPagePosition { _editorPagePositionBrand: void; - public readonly x: number; - public readonly y: number; - public readonly width: number; - public readonly height: number; - - constructor(x: number, y: number, width: number, height: number) { - this.x = x; - this.y = y; - this.width = width; - this.height = height; - } + constructor( + public readonly x: number, + public readonly y: number, + public readonly width: number, + public readonly height: number + ) { } } export function createEditorPagePosition(editorViewDomNode: HTMLElement): EditorPagePosition { diff --git a/src/vs/editor/browser/editorExtensions.ts b/src/vs/editor/browser/editorExtensions.ts index 66625ae73d..08e9207582 100644 --- a/src/vs/editor/browser/editorExtensions.ts +++ b/src/vs/editor/browser/editorExtensions.ts @@ -9,18 +9,18 @@ import URI from 'vs/base/common/uri'; import { TPromise } from 'vs/base/common/winjs.base'; import { ServicesAccessor, IConstructorSignature1 } from 'vs/platform/instantiation/common/instantiation'; import { CommandsRegistry, ICommandHandlerDescription } from 'vs/platform/commands/common/commands'; -import { KeybindingsRegistry, ICommandAndKeybindingRule, IKeybindings } from 'vs/platform/keybinding/common/keybindingsRegistry'; +import { KeybindingsRegistry, IKeybindings } from 'vs/platform/keybinding/common/keybindingsRegistry'; import { Registry } from 'vs/platform/registry/common/platform'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { Position } from 'vs/editor/common/core/position'; import * as editorCommon from 'vs/editor/common/editorCommon'; import { IModelService } from 'vs/editor/common/services/modelService'; -import { MenuId, MenuRegistry, IMenuItem } from 'vs/platform/actions/common/actions'; -import { IEditorService } from 'vs/platform/editor/common/editor'; +import { MenuId, MenuRegistry } from 'vs/platform/actions/common/actions'; import { IContextKeyService, ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; -import { ICodeEditorService, getCodeEditor } from 'vs/editor/browser/services/codeEditorService'; +import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService'; import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; import { ITextModel } from 'vs/editor/common/model'; +import { IPosition } from 'vs/base/browser/ui/contextview/contextview'; export type ServicesAccessor = ServicesAccessor; export type IEditorContributionCtor = IConstructorSignature1; @@ -29,53 +29,83 @@ export type IEditorContributionCtor = IConstructorSignature1 this.runCommand(accessor, args), - weight: weight, - when: kbWhen, - primary: kbOpts.primary, - secondary: kbOpts.secondary, - win: kbOpts.win, - linux: kbOpts.linux, - mac: kbOpts.mac, - description: this._description - }; + KeybindingsRegistry.registerCommandAndKeybindingRule({ + id: this.id, + handler: (accessor, args) => this.runCommand(accessor, args), + weight: this._kbOpts.weight, + when: kbWhen, + primary: this._kbOpts.primary, + secondary: this._kbOpts.secondary, + win: this._kbOpts.win, + linux: this._kbOpts.linux, + mac: this._kbOpts.mac, + description: this._description + }); + + } else { + + CommandsRegistry.registerCommand({ + id: this.id, + handler: (accessor, args) => this.runCommand(accessor, args), + description: this._description + }); + } } public abstract runCommand(accessor: ServicesAccessor, args: any): void | TPromise; @@ -85,12 +115,6 @@ export abstract class Command { //#region EditorCommand -function getWorkbenchActiveEditor(accessor: ServicesAccessor): ICodeEditor { - const editorService = accessor.get(IEditorService); - let activeEditor = (editorService).getActiveEditor && (editorService).getActiveEditor(); - return getCodeEditor(activeEditor); -} - export interface IContributionCommandOptions extends ICommandOptions { handler: (controller: T) => void; } @@ -124,14 +148,8 @@ export abstract class EditorCommand extends Command { public runCommand(accessor: ServicesAccessor, args: any): void | TPromise { const codeEditorService = accessor.get(ICodeEditorService); - // Find the editor with text focus - let editor = codeEditorService.getFocusedCodeEditor(); - - if (!editor) { - // Fallback to use what the workbench considers the active editor - editor = getWorkbenchActiveEditor(accessor); - } - + // Find the editor with text focus or active + let editor = codeEditorService.getFocusedCodeEditor() || codeEditorService.getActiveCodeEditor(); if (!editor) { // well, at least we tried... return; @@ -156,8 +174,8 @@ export abstract class EditorCommand extends Command { //#region EditorAction export interface IEditorCommandMenuOptions { - group?: string; - order?: number; + group: string; + order: number; when?: ContextKeyExpr; } export interface IActionOptions extends ICommandOptions { @@ -178,20 +196,21 @@ export abstract class EditorAction extends EditorCommand { this.menuOpts = opts.menuOpts; } - public toMenuItem(): IMenuItem { - if (!this.menuOpts) { - return null; + public register(): void { + + if (this.menuOpts) { + MenuRegistry.appendMenuItem(MenuId.EditorContext, { + command: { + id: this.id, + title: this.label + }, + when: ContextKeyExpr.and(this.precondition, this.menuOpts.when), + group: this.menuOpts.group, + order: this.menuOpts.order + }); } - return { - command: { - id: this.id, - title: this.label - }, - when: ContextKeyExpr.and(this.precondition, this.menuOpts.when), - group: this.menuOpts.group, - order: this.menuOpts.order - }; + super.register(); } public runEditorCommand(accessor: ServicesAccessor, editor: ICodeEditor, args: any): void | TPromise { @@ -223,8 +242,14 @@ export function registerLanguageCommand(id: string, handler: (accessor: Services CommandsRegistry.registerCommand(id, (accessor, args) => handler(accessor, args || {})); } -export function registerDefaultLanguageCommand(id: string, handler: (model: ITextModel, position: Position, args: { [n: string]: any }) => any) { - registerLanguageCommand(id, function (accessor, args) { +interface IDefaultArgs { + resource: URI; + position: IPosition; + [name: string]: any; +} + +export function registerDefaultLanguageCommand(id: string, handler: (model: ITextModel, position: Position, args: IDefaultArgs) => any) { + registerLanguageCommand(id, function (accessor, args: IDefaultArgs) { const { resource, position } = args; if (!(resource instanceof URI)) { @@ -301,14 +326,7 @@ class EditorContributionRegistry { } public registerEditorAction(action: EditorAction) { - - let menuItem = action.toMenuItem(); - if (menuItem) { - MenuRegistry.appendMenuItem(MenuId.EditorContext, menuItem); - } - - KeybindingsRegistry.registerCommandAndKeybindingRule(action.toCommandAndKeybindingRule(KeybindingsRegistry.WEIGHT.editorContrib())); - + action.register(); this.editorActions.push(action); } @@ -321,7 +339,7 @@ class EditorContributionRegistry { } public registerEditorCommand(editorCommand: EditorCommand) { - KeybindingsRegistry.registerCommandAndKeybindingRule(editorCommand.toCommandAndKeybindingRule(KeybindingsRegistry.WEIGHT.editorContrib())); + editorCommand.register(); this.editorCommands[editorCommand.id] = editorCommand; } diff --git a/src/vs/editor/browser/services/abstractCodeEditorService.ts b/src/vs/editor/browser/services/abstractCodeEditorService.ts index 1aca0d8ab9..bc90f68d3f 100644 --- a/src/vs/editor/browser/services/abstractCodeEditorService.ts +++ b/src/vs/editor/browser/services/abstractCodeEditorService.ts @@ -9,6 +9,8 @@ import { IDecorationRenderOptions } from 'vs/editor/common/editorCommon'; import { IModelDecorationOptions, ITextModel } from 'vs/editor/common/model'; import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService'; import { ICodeEditor, IDiffEditor } from 'vs/editor/browser/editorBrowser'; +import { IResourceInput } from 'vs/platform/editor/common/editor'; +import { TPromise } from 'vs/base/common/winjs.base'; export abstract class AbstractCodeEditorService implements ICodeEditorService { @@ -84,7 +86,7 @@ export abstract class AbstractCodeEditorService implements ICodeEditorService { for (let i = 0; i < editors.length; i++) { let editor = editors[i]; - if (editor.isFocused()) { + if (editor.hasTextFocus()) { // bingo! return editor; } @@ -130,6 +132,9 @@ export abstract class AbstractCodeEditorService implements ICodeEditorService { _removeWatcher(w: ModelTransientSettingWatcher): void { delete this._transientWatchers[w.uri]; } + + abstract getActiveCodeEditor(): ICodeEditor; + abstract openCodeEditor(input: IResourceInput, source: ICodeEditor, sideBySide?: boolean): TPromise; } export class ModelTransientSettingWatcher { diff --git a/src/vs/editor/browser/services/bulkEdit.ts b/src/vs/editor/browser/services/bulkEdit.ts deleted file mode 100644 index 3b19c5debd..0000000000 --- a/src/vs/editor/browser/services/bulkEdit.ts +++ /dev/null @@ -1,381 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the Source EULA. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ -'use strict'; - -import * as nls from 'vs/nls'; -import { IDisposable, dispose, IReference } from 'vs/base/common/lifecycle'; -import URI from 'vs/base/common/uri'; -import { TPromise } from 'vs/base/common/winjs.base'; -import { ITextModelService, ITextEditorModel } from 'vs/editor/common/services/resolverService'; -import { IFileService, FileChangeType } from 'vs/platform/files/common/files'; -import { EditOperation } from 'vs/editor/common/core/editOperation'; -import { Range } from 'vs/editor/common/core/range'; -import { Selection } from 'vs/editor/common/core/selection'; -import { IIdentifiedSingleEditOperation, ITextModel, EndOfLineSequence } from 'vs/editor/common/model'; -import { IProgressRunner, emptyProgressRunner, IProgress } from 'vs/platform/progress/common/progress'; -import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; -import { optional } from 'vs/platform/instantiation/common/instantiation'; -import { ResourceTextEdit, ResourceFileEdit, isResourceFileEdit, isResourceTextEdit } from 'vs/editor/common/modes'; -import { getPathLabel } from 'vs/base/common/labels'; - - -abstract class IRecording { - - static start(fileService: IFileService): IRecording { - - const _changes = new Set(); - let stop: IDisposable; - - if (fileService) { - // watch only when there is a fileservice available - stop = fileService.onFileChanges(event => { - for (const change of event.changes) { - if (change.type === FileChangeType.UPDATED) { - _changes.add(change.resource.toString()); - } - } - }); - } - - return { - stop() { return dispose(stop); }, - hasChanged(resource) { return _changes.has(resource.toString()); } - }; - } - - abstract stop(): void; - abstract hasChanged(resource: URI): boolean; -} - -class EditTask implements IDisposable { - - private _initialSelections: Selection[]; - private _endCursorSelection: Selection; - private get _model(): ITextModel { return this._modelReference.object.textEditorModel; } - private _modelReference: IReference; - private _edits: IIdentifiedSingleEditOperation[]; - private _newEol: EndOfLineSequence; - - constructor(modelReference: IReference) { - this._endCursorSelection = null; - this._modelReference = modelReference; - this._edits = []; - } - - dispose() { - if (this._model) { - this._modelReference.dispose(); - this._modelReference = null; - } - } - - addEdit(resourceEdit: ResourceTextEdit): void { - - for (const edit of resourceEdit.edits) { - if (typeof edit.eol === 'number') { - // honor eol-change - this._newEol = edit.eol; - } - if (edit.range || edit.text) { - // create edit operation - let range: Range; - if (!edit.range) { - range = this._model.getFullModelRange(); - } else { - range = Range.lift(edit.range); - } - this._edits.push(EditOperation.replaceMove(range, edit.text)); - } - } - } - - apply(): void { - if (this._edits.length > 0) { - - this._edits = this._edits.map((value, index) => ({ value, index })).sort((a, b) => { - let ret = Range.compareRangesUsingStarts(a.value.range, b.value.range); - if (ret === 0) { - ret = a.index - b.index; - } - return ret; - }).map(element => element.value); - - this._initialSelections = this._getInitialSelections(); - this._model.pushStackElement(); - this._model.pushEditOperations(this._initialSelections, this._edits, (edits) => this._getEndCursorSelections(edits)); - this._model.pushStackElement(); - } - if (this._newEol !== undefined) { - this._model.pushStackElement(); - this._model.setEOL(this._newEol); - this._model.pushStackElement(); - } - } - - protected _getInitialSelections(): Selection[] { - const firstRange = this._edits[0].range; - const initialSelection = new Selection( - firstRange.startLineNumber, - firstRange.startColumn, - firstRange.endLineNumber, - firstRange.endColumn - ); - return [initialSelection]; - } - - private _getEndCursorSelections(inverseEditOperations: IIdentifiedSingleEditOperation[]): Selection[] { - let relevantEditIndex = 0; - for (let i = 0; i < inverseEditOperations.length; i++) { - const editRange = inverseEditOperations[i].range; - for (let j = 0; j < this._initialSelections.length; j++) { - const selectionRange = this._initialSelections[j]; - if (Range.areIntersectingOrTouching(editRange, selectionRange)) { - relevantEditIndex = i; - break; - } - } - } - - const srcRange = inverseEditOperations[relevantEditIndex].range; - this._endCursorSelection = new Selection( - srcRange.endLineNumber, - srcRange.endColumn, - srcRange.endLineNumber, - srcRange.endColumn - ); - return [this._endCursorSelection]; - } - - getEndCursorSelection(): Selection { - return this._endCursorSelection; - } - -} - -class SourceModelEditTask extends EditTask { - - private _knownInitialSelections: Selection[]; - - constructor(modelReference: IReference, initialSelections: Selection[]) { - super(modelReference); - this._knownInitialSelections = initialSelections; - } - - protected _getInitialSelections(): Selection[] { - return this._knownInitialSelections; - } -} - -class BulkEditModel implements IDisposable { - - private _textModelResolverService: ITextModelService; - private _edits = new Map(); - private _tasks: EditTask[]; - private _sourceModel: URI; - private _sourceSelections: Selection[]; - private _sourceModelTask: SourceModelEditTask; - private _progress: IProgress; - - constructor( - textModelResolverService: ITextModelService, - editor: ICodeEditor, - edits: ResourceTextEdit[], - progress: IProgress - ) { - this._textModelResolverService = textModelResolverService; - this._sourceModel = editor ? editor.getModel().uri : undefined; - this._sourceSelections = editor ? editor.getSelections() : undefined; - this._sourceModelTask = undefined; - this._progress = progress; - - edits.forEach(this.addEdit, this); - } - - dispose(): void { - this._tasks = dispose(this._tasks); - } - - addEdit(edit: ResourceTextEdit): void { - let array = this._edits.get(edit.resource.toString()); - if (!array) { - array = []; - this._edits.set(edit.resource.toString(), array); - } - array.push(edit); - } - - async prepare(): TPromise { - - if (this._tasks) { - throw new Error('illegal state - already prepared'); - } - - this._tasks = []; - const promises: TPromise[] = []; - - this._edits.forEach((value, key) => { - const promise = this._textModelResolverService.createModelReference(URI.parse(key)).then(ref => { - const model = ref.object; - - if (!model || !model.textEditorModel) { - throw new Error(`Cannot load file ${key}`); - } - - let task: EditTask; - if (this._sourceModel && model.textEditorModel.uri.toString() === this._sourceModel.toString()) { - this._sourceModelTask = new SourceModelEditTask(ref, this._sourceSelections); - task = this._sourceModelTask; - } else { - task = new EditTask(ref); - } - - value.forEach(edit => task.addEdit(edit)); - this._tasks.push(task); - this._progress.report(undefined); - }); - promises.push(promise); - }); - - await TPromise.join(promises); - - return this; - } - - apply(): Selection { - for (const task of this._tasks) { - task.apply(); - this._progress.report(undefined); - } - return this._sourceModelTask - ? this._sourceModelTask.getEndCursorSelection() - : undefined; - } -} - -export type Edit = ResourceFileEdit | ResourceTextEdit; - -export class BulkEdit { - - static perform(edits: Edit[], textModelService: ITextModelService, fileService: IFileService, editor: ICodeEditor): TPromise { - const edit = new BulkEdit(editor, null, textModelService, fileService); - edit.add(edits); - return edit.perform(); - } - - private _edits: Edit[] = []; - private _editor: ICodeEditor; - private _progress: IProgressRunner; - - constructor( - editor: ICodeEditor, - progress: IProgressRunner, - @ITextModelService private readonly _textModelService: ITextModelService, - @optional(IFileService) private _fileService: IFileService - ) { - this._editor = editor; - this._progress = progress || emptyProgressRunner; - } - - add(edits: Edit[] | Edit): void { - if (Array.isArray(edits)) { - this._edits.push(...edits); - } else { - this._edits.push(edits); - } - } - - ariaMessage(): string { - const editCount = this._edits.reduce((prev, cur) => isResourceFileEdit(cur) ? prev : prev + cur.edits.length, 0); - const resourceCount = this._edits.length; - if (editCount === 0) { - return nls.localize('summary.0', "Made no edits"); - } else if (editCount > 1 && resourceCount > 1) { - return nls.localize('summary.nm', "Made {0} text edits in {1} files", editCount, resourceCount); - } else { - return nls.localize('summary.n0', "Made {0} text edits in one file", editCount, resourceCount); - } - } - - async perform(): TPromise { - - let seen = new Set(); - let total = 0; - - const groups: Edit[][] = []; - let group: Edit[]; - for (const edit of this._edits) { - if (!group - || (isResourceFileEdit(group[0]) && !isResourceFileEdit(edit)) - || (isResourceTextEdit(group[0]) && !isResourceTextEdit(edit)) - ) { - group = []; - groups.push(group); - } - group.push(edit); - - if (isResourceFileEdit(edit)) { - total += 1; - } else if (!seen.has(edit.resource.toString())) { - seen.add(edit.resource.toString()); - total += 2; - } - } - - // define total work and progress callback - // for child operations - this._progress.total(total); - let progress: IProgress = { report: _ => this._progress.worked(1) }; - - // do it. return the last selection computed - // by a text change (can be undefined then) - let res: Selection = undefined; - for (const group of groups) { - if (isResourceFileEdit(group[0])) { - await this._performFileEdits(group, progress); - } else { - res = await this._performTextEdits(group, progress) || res; - } - } - return res; - } - - private async _performFileEdits(edits: ResourceFileEdit[], progress: IProgress) { - for (const edit of edits) { - - progress.report(undefined); - - if (edit.newUri && edit.oldUri) { - await this._fileService.moveFile(edit.oldUri, edit.newUri, false); - } else if (!edit.newUri && edit.oldUri) { - await this._fileService.del(edit.oldUri, true); - } else if (edit.newUri && !edit.oldUri) { - await this._fileService.createFile(edit.newUri, undefined, { overwrite: false }); - } - } - } - - private async _performTextEdits(edits: ResourceTextEdit[], progress: IProgress): TPromise { - - const recording = IRecording.start(this._fileService); - const model = new BulkEditModel(this._textModelService, this._editor, edits, progress); - - await model.prepare(); - - const conflicts = edits - .filter(edit => recording.hasChanged(edit.resource)) - .map(edit => getPathLabel(edit.resource)); - - recording.stop(); - - if (conflicts.length > 0) { - model.dispose(); - throw new Error(nls.localize('conflict', "These files have changed in the meantime: {0}", conflicts.join(', '))); - } - - const selection = await model.apply(); - model.dispose(); - return selection; - } -} diff --git a/src/vs/editor/browser/services/bulkEditService.ts b/src/vs/editor/browser/services/bulkEditService.ts new file mode 100644 index 0000000000..dd885448a6 --- /dev/null +++ b/src/vs/editor/browser/services/bulkEditService.ts @@ -0,0 +1,30 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the Source EULA. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +'use strict'; + +import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; +import { WorkspaceEdit } from 'vs/editor/common/modes'; +import { TPromise } from 'vs/base/common/winjs.base'; +import { ICodeEditor } from '../editorBrowser'; +import { IProgressRunner } from 'vs/platform/progress/common/progress'; + +export const IBulkEditService = createDecorator('IWorkspaceEditService'); + + +export interface IBulkEditOptions { + editor?: ICodeEditor; + progress?: IProgressRunner; +} + +export interface IBulkEditResult { + ariaSummary: string; +} + +export interface IBulkEditService { + _serviceBrand: any; + + apply(edit: WorkspaceEdit, options: IBulkEditOptions): TPromise; +} + diff --git a/src/vs/editor/browser/services/codeEditorService.ts b/src/vs/editor/browser/services/codeEditorService.ts index a67155a780..43575eb75c 100644 --- a/src/vs/editor/browser/services/codeEditorService.ts +++ b/src/vs/editor/browser/services/codeEditorService.ts @@ -8,8 +8,9 @@ import { Event } from 'vs/base/common/event'; import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; import { IDecorationRenderOptions } from 'vs/editor/common/editorCommon'; import { IModelDecorationOptions, ITextModel } from 'vs/editor/common/model'; -import { IEditor } from 'vs/platform/editor/common/editor'; -import { ICodeEditor, IDiffEditor, isCodeEditor, isDiffEditor } from 'vs/editor/browser/editorBrowser'; +import { ICodeEditor, IDiffEditor } from 'vs/editor/browser/editorBrowser'; +import { IResourceInput } from 'vs/platform/editor/common/editor'; +import { TPromise } from 'vs/base/common/winjs.base'; export const ICodeEditorService = createDecorator('codeEditorService'); @@ -41,40 +42,7 @@ export interface ICodeEditorService { setTransientModelProperty(model: ITextModel, key: string, value: any): void; getTransientModelProperty(model: ITextModel, key: string): any; -} -/** - * Uses `editor.getControl()` and returns either a `codeEditor` or a `diffEditor` or nothing. - */ -export function getCodeOrDiffEditor(editor: IEditor): { codeEditor: ICodeEditor; diffEditor: IDiffEditor } { - if (editor) { - let control = editor.getControl(); - if (control) { - if (isCodeEditor(control)) { - return { - codeEditor: control, - diffEditor: null - }; - } - if (isDiffEditor(control)) { - return { - codeEditor: null, - diffEditor: control - }; - } - } - } - - return { - codeEditor: null, - diffEditor: null - }; -} - -/** - * Uses `editor.getControl()` and returns either the code editor, or the modified editor of a diff editor or nothing. - */ -export function getCodeEditor(editor: IEditor): ICodeEditor { - let r = getCodeOrDiffEditor(editor); - return r.codeEditor || (r.diffEditor && r.diffEditor.getModifiedEditor()) || null; + getActiveCodeEditor(): ICodeEditor; + openCodeEditor(input: IResourceInput, source: ICodeEditor, sideBySide?: boolean): TPromise; } diff --git a/src/vs/editor/browser/services/codeEditorServiceImpl.ts b/src/vs/editor/browser/services/codeEditorServiceImpl.ts index eaf391fcca..ee1671827a 100644 --- a/src/vs/editor/browser/services/codeEditorServiceImpl.ts +++ b/src/vs/editor/browser/services/codeEditorServiceImpl.ts @@ -12,8 +12,11 @@ import { IModelDecorationOptions, IModelDecorationOverviewRulerOptions, Overview import { AbstractCodeEditorService } from 'vs/editor/browser/services/abstractCodeEditorService'; import { IDisposable, dispose as disposeAll } from 'vs/base/common/lifecycle'; import { IThemeService, ITheme, ThemeColor } from 'vs/platform/theme/common/themeService'; +import { IResourceInput } from 'vs/platform/editor/common/editor'; +import { TPromise } from 'vs/base/common/winjs.base'; +import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; -export class CodeEditorServiceImpl extends AbstractCodeEditorService { +export abstract class CodeEditorServiceImpl extends AbstractCodeEditorService { private _styleSheet: HTMLStyleElement; private _decorationOptionProviders: { [key: string]: IModelDecorationOptionsProvider }; @@ -65,6 +68,8 @@ export class CodeEditorServiceImpl extends AbstractCodeEditorService { return provider.getOptions(this, writable); } + abstract getActiveCodeEditor(): ICodeEditor; + abstract openCodeEditor(input: IResourceInput, source: ICodeEditor, sideBySide?: boolean): TPromise; } interface IModelDecorationOptionsProvider extends IDisposable { @@ -205,9 +210,9 @@ class DecorationTypeOptionsProvider implements IModelDecorationOptionsProvider { } -const _CSS_MAP = { +const _CSS_MAP: { [prop: string]: string; } = { color: 'color:{0} !important;', - opacity: 'opacity:{0};', + opacity: 'opacity:{0}; will-change: opacity;', // TODO@Ben: 'will-change: opacity' is a workaround for https://github.com/Microsoft/vscode/issues/52196 backgroundColor: 'background-color:{0};', outline: 'outline:{0};', diff --git a/src/vs/platform/opener/browser/openerService.ts b/src/vs/editor/browser/services/openerService.ts similarity index 90% rename from src/vs/platform/opener/browser/openerService.ts rename to src/vs/editor/browser/services/openerService.ts index 2e264bcd1d..2a928d3ca2 100644 --- a/src/vs/platform/opener/browser/openerService.ts +++ b/src/vs/editor/browser/services/openerService.ts @@ -9,7 +9,7 @@ import * as dom from 'vs/base/browser/dom'; import { parse } from 'vs/base/common/marshalling'; import { Schemas } from 'vs/base/common/network'; import { TPromise } from 'vs/base/common/winjs.base'; -import { IEditorService } from 'vs/platform/editor/common/editor'; +import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService'; import { normalize } from 'vs/base/common/paths'; import { ICommandService, CommandsRegistry } from 'vs/platform/commands/common/commands'; import { IOpenerService } from 'vs/platform/opener/common/opener'; @@ -22,7 +22,7 @@ export class OpenerService implements IOpenerService { _serviceBrand: any; constructor( - @IEditorService private readonly _editorService: IEditorService, + @ICodeEditorService private readonly _editorService: ICodeEditorService, @ICommandService private readonly _commandService: ICommandService, @optional(ITelemetryService) private _telemetryService: ITelemetryService = NullTelemetryService ) { @@ -81,7 +81,7 @@ export class OpenerService implements IOpenerService { } else if (resource.scheme === Schemas.file) { resource = resource.with({ path: normalize(resource.path) }); // workaround for non-normalized paths (https://github.com/Microsoft/vscode/issues/12954) } - promise = this._editorService.openEditor({ resource, options: { selection, } }, options && options.openToSide); + promise = this._editorService.openCodeEditor({ resource, options: { selection, } }, this._editorService.getFocusedCodeEditor(), options && options.openToSide); } return promise; diff --git a/src/vs/editor/browser/view/viewController.ts b/src/vs/editor/browser/view/viewController.ts index fef2d42543..e23fe521cf 100644 --- a/src/vs/editor/browser/view/viewController.ts +++ b/src/vs/editor/browser/view/viewController.ts @@ -11,7 +11,7 @@ import { IEditorMouseEvent } from 'vs/editor/browser/editorBrowser'; import { IViewModel } from 'vs/editor/common/viewModel/viewModel'; import { ViewOutgoingEvents } from 'vs/editor/browser/view/viewOutgoingEvents'; import { CoreNavigationCommands, CoreEditorCommand } from 'vs/editor/browser/controller/coreCommands'; -import { Configuration } from 'vs/editor/browser/config/configuration'; +import { IConfiguration } from 'vs/editor/common/editorCommon'; export interface ExecCoreEditorCommandFunc { (editorCommand: CoreEditorCommand, args: any): void; @@ -47,14 +47,14 @@ export interface ICommandDelegate { export class ViewController { - private readonly configuration: Configuration; + private readonly configuration: IConfiguration; private readonly viewModel: IViewModel; private readonly _execCoreEditorCommandFunc: ExecCoreEditorCommandFunc; private readonly outgoingEvents: ViewOutgoingEvents; private readonly commandDelegate: ICommandDelegate; constructor( - configuration: Configuration, + configuration: IConfiguration, viewModel: IViewModel, execCommandFunc: ExecCoreEditorCommandFunc, outgoingEvents: ViewOutgoingEvents, diff --git a/src/vs/editor/browser/view/viewImpl.ts b/src/vs/editor/browser/view/viewImpl.ts index 2ae1986c75..689e8b681b 100644 --- a/src/vs/editor/browser/view/viewImpl.ts +++ b/src/vs/editor/browser/view/viewImpl.ts @@ -10,7 +10,7 @@ import * as dom from 'vs/base/browser/dom'; import { FastDomNode, createFastDomNode } from 'vs/base/browser/fastDomNode'; import { Range } from 'vs/editor/common/core/range'; import { ViewEventHandler } from 'vs/editor/common/viewModel/viewEventHandler'; -import { Configuration } from 'vs/editor/browser/config/configuration'; +import { IConfiguration } from 'vs/editor/common/editorCommon'; import { TextAreaHandler, ITextAreaHandlerHelper } from 'vs/editor/browser/controller/textAreaHandler'; import { PointerHandler } from 'vs/editor/browser/controller/pointerHandler'; import * as editorBrowser from 'vs/editor/browser/editorBrowser'; @@ -93,7 +93,7 @@ export class View extends ViewEventHandler { constructor( commandDelegate: ICommandDelegate, - configuration: Configuration, + configuration: IConfiguration, themeService: IThemeService, model: IViewModel, cursor: Cursor, diff --git a/src/vs/editor/browser/viewParts/indentGuides/indentGuides.ts b/src/vs/editor/browser/viewParts/indentGuides/indentGuides.ts index e15a36d4f5..fa3ccadf1a 100644 --- a/src/vs/editor/browser/viewParts/indentGuides/indentGuides.ts +++ b/src/vs/editor/browser/viewParts/indentGuides/indentGuides.ts @@ -22,6 +22,7 @@ export class IndentGuidesOverlay extends DynamicViewOverlay { private _spaceWidth: number; private _renderResult: string[]; private _enabled: boolean; + private _activeIndentEnabled: boolean; constructor(context: ViewContext) { super(); @@ -30,6 +31,7 @@ export class IndentGuidesOverlay extends DynamicViewOverlay { this._lineHeight = this._context.configuration.editor.lineHeight; this._spaceWidth = this._context.configuration.editor.fontInfo.spaceWidth; this._enabled = this._context.configuration.editor.viewInfo.renderIndentGuides; + this._activeIndentEnabled = this._context.configuration.editor.viewInfo.highlightActiveIndentGuide; this._renderResult = null; this._context.addEventHandler(this); @@ -53,6 +55,7 @@ export class IndentGuidesOverlay extends DynamicViewOverlay { } if (e.viewInfo) { this._enabled = this._context.configuration.editor.viewInfo.renderIndentGuides; + this._activeIndentEnabled = this._context.configuration.editor.viewInfo.highlightActiveIndentGuide; } return true; } @@ -105,6 +108,7 @@ export class IndentGuidesOverlay extends DynamicViewOverlay { const visibleEndLineNumber = ctx.visibleRange.endLineNumber; const tabSize = this._context.model.getTabSize(); const tabWidth = tabSize * this._spaceWidth; + const scrollWidth = ctx.scrollWidth; const lineHeight = this._lineHeight; const indentGuideWidth = tabWidth; @@ -113,7 +117,7 @@ export class IndentGuidesOverlay extends DynamicViewOverlay { let activeIndentStartLineNumber = 0; let activeIndentEndLineNumber = 0; let activeIndentLevel = 0; - if (this._primaryLineNumber) { + if (this._activeIndentEnabled && this._primaryLineNumber) { const activeIndentInfo = this._context.model.getActiveIndentGuide(this._primaryLineNumber, visibleStartLineNumber, visibleEndLineNumber); activeIndentStartLineNumber = activeIndentInfo.startLineNumber; activeIndentEndLineNumber = activeIndentInfo.endLineNumber; @@ -133,6 +137,9 @@ export class IndentGuidesOverlay extends DynamicViewOverlay { let className = (containsActiveIndentGuide && i === activeIndentLevel ? 'cigra' : 'cigr'); result += `
    `; left += tabWidth; + if (left > scrollWidth) { + break; + } } output[lineIndex] = result; diff --git a/src/vs/editor/browser/viewParts/lines/viewLine.ts b/src/vs/editor/browser/viewParts/lines/viewLine.ts index e4763e084b..65fcb98d46 100644 --- a/src/vs/editor/browser/viewParts/lines/viewLine.ts +++ b/src/vs/editor/browser/viewParts/lines/viewLine.ts @@ -191,6 +191,7 @@ export class ViewLine implements IVisibleLine { let renderLineInput = new RenderLineInput( options.useMonospaceOptimizations, lineData.content, + lineData.continuesWithWrappedLine, lineData.isBasicASCII, lineData.containsRTL, lineData.minColumn - 1, @@ -230,7 +231,7 @@ export class ViewLine implements IVisibleLine { // Another rounding error has been observed on Linux in VSCode, where width // rounding errors add up to an observable large number... // --- - // Also see another example of rounding errors on Windows in + // Also see another example of rounding errors on Windows in // https://github.com/Microsoft/vscode/issues/33178 renderedViewLine = new FastRenderedViewLine( this._renderedViewLine ? this._renderedViewLine.domNode : null, diff --git a/src/vs/editor/browser/viewParts/lines/viewLines.ts b/src/vs/editor/browser/viewParts/lines/viewLines.ts index b2e887a4ab..11061ef45d 100644 --- a/src/vs/editor/browser/viewParts/lines/viewLines.ts +++ b/src/vs/editor/browser/viewParts/lines/viewLines.ts @@ -271,6 +271,7 @@ export class ViewLines extends ViewPart implements IVisibleLinesHost, return this._visibleLines.onTokensChanged(e); } public onZonesChanged(e: viewEvents.ViewZonesChangedEvent): boolean { + this._context.viewLayout.onMaxLineWidthChanged(this._maxLineWidth); return this._visibleLines.onZonesChanged(e); } public onThemeChanged(e: viewEvents.ViewThemeChangedEvent): boolean { diff --git a/src/vs/editor/browser/viewParts/minimap/minimap.ts b/src/vs/editor/browser/viewParts/minimap/minimap.ts index 51dc863fee..d0ab942a8e 100644 --- a/src/vs/editor/browser/viewParts/minimap/minimap.ts +++ b/src/vs/editor/browser/viewParts/minimap/minimap.ts @@ -913,6 +913,11 @@ export class Minimap extends ViewPart { minimapCharRenderer.x1BlockRenderChar(target, dx, dy, tokenColor, backgroundColor, useLighterFont); } dx += charWidth; + + if (dx > maxDx) { + // hit edge of minimap + return; + } } } } diff --git a/src/vs/editor/browser/viewParts/viewZones/viewZones.ts b/src/vs/editor/browser/viewParts/viewZones/viewZones.ts index 3e3db20172..d7a525d75e 100644 --- a/src/vs/editor/browser/viewParts/viewZones/viewZones.ts +++ b/src/vs/editor/browser/viewParts/viewZones/viewZones.ts @@ -25,6 +25,7 @@ export interface IMyViewZone { interface IComputedViewZoneProps { afterViewLineNumber: number; heightInPx: number; + minWidthInPx: number; } export class ViewZones extends ViewPart { @@ -138,7 +139,8 @@ export class ViewZones extends ViewPart { if (zone.afterLineNumber === 0) { return { afterViewLineNumber: 0, - heightInPx: this._heightInPixels(zone) + heightInPx: this._heightInPixels(zone), + minWidthInPx: this._minWidthInPixels(zone) }; } @@ -177,13 +179,14 @@ export class ViewZones extends ViewPart { let isVisible = this._context.model.coordinatesConverter.modelPositionIsVisible(zoneBeforeModelPosition); return { afterViewLineNumber: viewPosition.lineNumber, - heightInPx: (isVisible ? this._heightInPixels(zone) : 0) + heightInPx: (isVisible ? this._heightInPixels(zone) : 0), + minWidthInPx: this._minWidthInPixels(zone) }; } public addZone(zone: IViewZone): number { let props = this._computeWhitespaceProps(zone); - let whitespaceId = this._context.viewLayout.addWhitespace(props.afterViewLineNumber, this._getZoneOrdinal(zone), props.heightInPx); + let whitespaceId = this._context.viewLayout.addWhitespace(props.afterViewLineNumber, this._getZoneOrdinal(zone), props.heightInPx, props.minWidthInPx); let myZone: IMyViewZone = { whitespaceId: whitespaceId, @@ -275,6 +278,13 @@ export class ViewZones extends ViewPart { return this._lineHeight; } + private _minWidthInPixels(zone: IViewZone): number { + if (typeof zone.minWidthInPx === 'number') { + return zone.minWidthInPx; + } + return 0; + } + private _safeCallOnComputedHeight(zone: IViewZone, height: number): void { if (typeof zone.onComputedHeight === 'function') { try { diff --git a/src/vs/editor/browser/widget/codeEditorWidget.ts b/src/vs/editor/browser/widget/codeEditorWidget.ts index d2fd6c9cda..4740c2da8f 100644 --- a/src/vs/editor/browser/widget/codeEditorWidget.ts +++ b/src/vs/editor/browser/widget/codeEditorWidget.ts @@ -6,37 +6,129 @@ import 'vs/css!./media/editor'; import 'vs/css!./media/tokens'; -import { onUnexpectedError } from 'vs/base/common/errors'; -import { TPromise } from 'vs/base/common/winjs.base'; +import * as nls from 'vs/nls'; import * as dom from 'vs/base/browser/dom'; -import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { ICommandService } from 'vs/platform/commands/common/commands'; -import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; -import { CommonCodeEditor } from 'vs/editor/common/commonCodeEditor'; -import { CommonEditorConfiguration } from 'vs/editor/common/config/commonEditorConfig'; -import * as editorCommon from 'vs/editor/common/editorCommon'; -import { EditorAction, EditorExtensionsRegistry, IEditorContributionCtor } from 'vs/editor/browser/editorExtensions'; -import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService'; -import { Configuration } from 'vs/editor/browser/config/configuration'; -import * as editorBrowser from 'vs/editor/browser/editorBrowser'; -import { View, IOverlayWidgetData, IContentWidgetData } from 'vs/editor/browser/view/viewImpl'; -import { Disposable, IDisposable } from 'vs/base/common/lifecycle'; +import { onUnexpectedError } from 'vs/base/common/errors'; import { Event, Emitter } from 'vs/base/common/event'; -import { IKeyboardEvent } from 'vs/base/browser/keyboardEvent'; -import { InternalEditorAction } from 'vs/editor/common/editorAction'; -import { IEditorOptions } from 'vs/editor/common/config/editorOptions'; -import { IPosition, Position } from 'vs/editor/common/core/position'; -import { CoreEditorCommand } from 'vs/editor/browser/controller/coreCommands'; -import { IThemeService, registerThemingParticipant } from 'vs/platform/theme/common/themeService'; -import { editorErrorForeground, editorErrorBorder, editorWarningForeground, editorWarningBorder, editorInfoBorder, editorInfoForeground, editorHintForeground, editorHintBorder } from 'vs/editor/common/view/editorColorRegistry'; -import { Color } from 'vs/base/common/color'; -import { IMouseEvent } from 'vs/base/browser/mouseEvent'; -import { ClassName } from 'vs/editor/common/model/intervalTree'; -import { ITextModel, IModelDecorationOptions } from 'vs/editor/common/model'; -import { ICommandDelegate } from 'vs/editor/browser/view/viewController'; +import { Disposable, IDisposable, dispose } from 'vs/base/common/lifecycle'; +import { TPromise } from 'vs/base/common/winjs.base'; +import { ServicesAccessor, IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; +import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection'; +import { IContextKey, IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; +import { Configuration } from 'vs/editor/browser/config/configuration'; +import { Cursor, CursorStateChangedEvent } from 'vs/editor/common/controller/cursor'; +import { CursorColumns, ICursors, CursorConfiguration } from 'vs/editor/common/controller/cursorCommon'; +import { Position, IPosition } from 'vs/editor/common/core/position'; +import { Range, IRange } from 'vs/editor/common/core/range'; +import { Selection, ISelection } from 'vs/editor/common/core/selection'; +import * as editorCommon from 'vs/editor/common/editorCommon'; +import { ViewModel } from 'vs/editor/common/viewModel/viewModelImpl'; +import { hash } from 'vs/base/common/hash'; +import { IModelContentChangedEvent, IModelDecorationsChangedEvent, IModelLanguageChangedEvent, IModelOptionsChangedEvent, IModelLanguageConfigurationChangedEvent } from 'vs/editor/common/model/textModelEvents'; +import * as editorOptions from 'vs/editor/common/config/editorOptions'; +import { ICursorPositionChangedEvent, ICursorSelectionChangedEvent } from 'vs/editor/common/controller/cursorEvents'; +import { EditorContextKeys } from 'vs/editor/common/editorContextKeys'; +import { VerticalRevealType } from 'vs/editor/common/view/viewEvents'; +import { ModelDecorationOptions } from 'vs/editor/common/model/textModel'; +import { IEditorWhitespace } from 'vs/editor/common/viewLayout/whitespaceComputer'; +import * as modes from 'vs/editor/common/modes'; +import { Schemas } from 'vs/base/common/network'; +import { ITextModel, EndOfLinePreference, IIdentifiedSingleEditOperation, IModelDecorationsChangeAccessor, IModelDecoration, IModelDeltaDecoration, IModelDecorationOptions } from 'vs/editor/common/model'; import { INotificationService } from 'vs/platform/notification/common/notification'; +import * as editorBrowser from 'vs/editor/browser/editorBrowser'; +import { IKeyboardEvent } from 'vs/base/browser/keyboardEvent'; +import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService'; +import { ICommandService } from 'vs/platform/commands/common/commands'; +import { IThemeService, registerThemingParticipant } from 'vs/platform/theme/common/themeService'; +import { IContentWidgetData, IOverlayWidgetData, View } from 'vs/editor/browser/view/viewImpl'; +import { IEditorContributionCtor, EditorExtensionsRegistry } from 'vs/editor/browser/editorExtensions'; +import { IMouseEvent } from 'vs/base/browser/mouseEvent'; +import { InternalEditorAction } from 'vs/editor/common/editorAction'; +import { ICommandDelegate } from 'vs/editor/browser/view/viewController'; +import { CoreEditorCommand } from 'vs/editor/browser/controller/coreCommands'; +import { editorErrorForeground, editorErrorBorder, editorWarningForeground, editorWarningBorder, editorInfoBorder, editorInfoForeground, editorHintForeground, editorHintBorder, editorUnnecessaryCodeOpacity, editorUnnecessaryCodeBorder } from 'vs/editor/common/view/editorColorRegistry'; +import { Color } from 'vs/base/common/color'; +import { ClassName } from 'vs/editor/common/model/intervalTree'; -export abstract class CodeEditorWidget extends CommonCodeEditor implements editorBrowser.ICodeEditor { +let EDITOR_ID = 0; + +const SHOW_UNUSED_ENABLED_CLASS = 'showUnused'; + +export interface ICodeEditorWidgetOptions { + /** + * Is this a simple widget (not a real code editor) ? + * Defaults to false. + */ + isSimpleWidget?: boolean; + + /** + * Contributions to instantiate. + * Defaults to EditorExtensionsRegistry.getEditorContributions(). + */ + contributions?: IEditorContributionCtor[]; + + /** + * Telemetry data associated with this CodeEditorWidget. + * Defaults to null. + */ + telemetryData?: object; +} + +export class CodeEditorWidget extends Disposable implements editorBrowser.ICodeEditor { + + //#region Eventing + private readonly _onDidDispose: Emitter = this._register(new Emitter()); + public readonly onDidDispose: Event = this._onDidDispose.event; + + private readonly _onDidChangeModelContent: Emitter = this._register(new Emitter()); + public readonly onDidChangeModelContent: Event = this._onDidChangeModelContent.event; + + private readonly _onDidChangeModelLanguage: Emitter = this._register(new Emitter()); + public readonly onDidChangeModelLanguage: Event = this._onDidChangeModelLanguage.event; + + private readonly _onDidChangeModelLanguageConfiguration: Emitter = this._register(new Emitter()); + public readonly onDidChangeModelLanguageConfiguration: Event = this._onDidChangeModelLanguageConfiguration.event; + + private readonly _onDidChangeModelOptions: Emitter = this._register(new Emitter()); + public readonly onDidChangeModelOptions: Event = this._onDidChangeModelOptions.event; + + private readonly _onDidChangeModelDecorations: Emitter = this._register(new Emitter()); + public readonly onDidChangeModelDecorations: Event = this._onDidChangeModelDecorations.event; + + private readonly _onDidChangeConfiguration: Emitter = this._register(new Emitter()); + public readonly onDidChangeConfiguration: Event = this._onDidChangeConfiguration.event; + + protected readonly _onDidChangeModel: Emitter = this._register(new Emitter()); + public readonly onDidChangeModel: Event = this._onDidChangeModel.event; + + private readonly _onDidChangeCursorPosition: Emitter = this._register(new Emitter()); + public readonly onDidChangeCursorPosition: Event = this._onDidChangeCursorPosition.event; + + private readonly _onDidChangeCursorSelection: Emitter = this._register(new Emitter()); + public readonly onDidChangeCursorSelection: Event = this._onDidChangeCursorSelection.event; + + private readonly _onDidAttemptReadOnlyEdit: Emitter = this._register(new Emitter()); + public readonly onDidAttemptReadOnlyEdit: Event = this._onDidAttemptReadOnlyEdit.event; + + private readonly _onDidLayoutChange: Emitter = this._register(new Emitter()); + public readonly onDidLayoutChange: Event = this._onDidLayoutChange.event; + + private _editorTextFocus: BooleanEventEmitter = this._register(new BooleanEventEmitter()); + public readonly onDidFocusEditorText: Event = this._editorTextFocus.onDidChangeToTrue; + public readonly onDidBlurEditorText: Event = this._editorTextFocus.onDidChangeToFalse; + + private _editorWidgetFocus: BooleanEventEmitter = this._register(new BooleanEventEmitter()); + public readonly onDidFocusEditorWidget: Event = this._editorWidgetFocus.onDidChangeToTrue; + public readonly onDidBlurEditorWidget: Event = this._editorWidgetFocus.onDidChangeToFalse; + + private readonly _onWillType: Emitter = this._register(new Emitter()); + public readonly onWillType = this._onWillType.event; + + private readonly _onDidType: Emitter = this._register(new Emitter()); + public readonly onDidType = this._onDidType.event; + + private readonly _onDidPaste: Emitter = this._register(new Emitter()); + public readonly onDidPaste = this._onDidPaste.event; private readonly _onMouseUp: Emitter = this._register(new Emitter()); public readonly onMouseUp: Event = this._onMouseUp.event; @@ -70,25 +162,50 @@ export abstract class CodeEditorWidget extends CommonCodeEditor implements edito private readonly _onDidChangeViewZones: Emitter = this._register(new Emitter()); public readonly onDidChangeViewZones: Event = this._onDidChangeViewZones.event; + //#endregion - private _codeEditorService: ICodeEditorService; - private _commandService: ICommandService; - private _themeService: IThemeService; + public readonly isSimpleWidget: boolean; + private readonly _telemetryData: object; + + private readonly domElement: HTMLElement; + private readonly id: number; + private readonly _configuration: editorCommon.IConfiguration; + + protected _contributions: { [key: string]: editorCommon.IEditorContribution; }; + protected _actions: { [key: string]: editorCommon.IEditorAction; }; + + // --- Members logically associated to a model + protected model: ITextModel; + private listenersToRemove: IDisposable[]; + private hasView: boolean; + + private viewModel: ViewModel; + protected cursor: Cursor; + + protected readonly _instantiationService: IInstantiationService; + protected readonly _contextKeyService: IContextKeyService; + private readonly _notificationService: INotificationService; + private readonly _codeEditorService: ICodeEditorService; + private readonly _commandService: ICommandService; + private readonly _themeService: IThemeService; - protected domElement: HTMLElement; private _focusTracker: CodeEditorWidgetFocusTracker; - _configuration: Configuration; - private contentWidgets: { [key: string]: IContentWidgetData; }; private overlayWidgets: { [key: string]: IOverlayWidgetData; }; - _view: View; + protected _view: View; + + /** + * map from "parent" decoration type to live decoration ids. + */ + private _decorationTypeKeysToIds: { [decorationTypeKey: string]: string[] }; + private _decorationTypeSubtypes: { [decorationTypeKey: string]: { [subtype: string]: boolean } }; constructor( domElement: HTMLElement, - options: IEditorOptions, - isSimpleWidget: boolean, + options: editorOptions.IEditorOptions, + codeEditorWidgetOptions: ICodeEditorWidgetOptions, @IInstantiationService instantiationService: IInstantiationService, @ICodeEditorService codeEditorService: ICodeEditorService, @ICommandService commandService: ICommandService, @@ -96,20 +213,56 @@ export abstract class CodeEditorWidget extends CommonCodeEditor implements edito @IThemeService themeService: IThemeService, @INotificationService notificationService: INotificationService ) { - super(domElement, options, isSimpleWidget, instantiationService, contextKeyService, notificationService); + super(); + this.domElement = domElement; + this.id = (++EDITOR_ID); + this._decorationTypeKeysToIds = {}; + this._decorationTypeSubtypes = {}; + this.isSimpleWidget = codeEditorWidgetOptions.isSimpleWidget || false; + this._telemetryData = codeEditorWidgetOptions.telemetryData || null; + + options = options || {}; + this._configuration = this._register(this._createConfiguration(options)); + this._register(this._configuration.onDidChange((e) => { + this._onDidChangeConfiguration.fire(e); + + if (e.layoutInfo) { + this._onDidLayoutChange.fire(this._configuration.editor.layoutInfo); + } + if (this._configuration.editor.showUnused) { + this.domElement.classList.add(SHOW_UNUSED_ENABLED_CLASS); + } else { + this.domElement.classList.remove(SHOW_UNUSED_ENABLED_CLASS); + } + })); + + this._contextKeyService = this._register(contextKeyService.createScoped(this.domElement)); + this._notificationService = notificationService; this._codeEditorService = codeEditorService; this._commandService = commandService; this._themeService = themeService; + this._register(new EditorContextKeysManager(this, this._contextKeyService)); + this._register(new EditorModeContext(this, this._contextKeyService)); + + this._instantiationService = instantiationService.createChild(new ServiceCollection([IContextKeyService, this._contextKeyService])); + + this._attachModel(null); + + this._contributions = {}; + this._actions = {}; this._focusTracker = new CodeEditorWidgetFocusTracker(domElement); this._focusTracker.onChange(() => { - this._editorFocus.setValue(this._focusTracker.hasFocus()); + this._editorWidgetFocus.setValue(this._focusTracker.hasFocus()); }); this.contentWidgets = {}; this.overlayWidgets = {}; - let contributions = this._getContributions(); + let contributions: IEditorContributionCtor[] = codeEditorWidgetOptions.contributions; + if (!Array.isArray(contributions)) { + contributions = EditorExtensionsRegistry.getEditorContributions(); + } for (let i = 0, len = contributions.length; i < len; i++) { let ctor = contributions[i]; try { @@ -120,7 +273,7 @@ export abstract class CodeEditorWidget extends CommonCodeEditor implements edito } } - this._getActions().forEach((action) => { + EditorExtensionsRegistry.getEditorActions().forEach((action) => { const internalAction = new InternalEditorAction( action.id, action.label, @@ -139,13 +292,18 @@ export abstract class CodeEditorWidget extends CommonCodeEditor implements edito this._codeEditorService.addCodeEditor(this); } - protected abstract _getContributions(): IEditorContributionCtor[]; - protected abstract _getActions(): EditorAction[]; - - protected _createConfiguration(options: IEditorOptions): CommonEditorConfiguration { + protected _createConfiguration(options: editorOptions.IEditorOptions): editorCommon.IConfiguration { return new Configuration(options, this.domElement); } + public getId(): string { + return this.getEditorType() + ':' + this.id; + } + + public getEditorType(): string { + return editorCommon.EditorType.ICodeEditor; + } + public dispose(): void { this._codeEditorService.removeCodeEditor(this); @@ -153,9 +311,781 @@ export abstract class CodeEditorWidget extends CommonCodeEditor implements edito this.overlayWidgets = {}; this._focusTracker.dispose(); + + let keys = Object.keys(this._contributions); + for (let i = 0, len = keys.length; i < len; i++) { + let contributionId = keys[i]; + this._contributions[contributionId].dispose(); + } + this._contributions = {}; + + // editor actions don't need to be disposed + this._actions = {}; + this._removeDecorationTypes(); + this._postDetachModelCleanup(this._detachModel()); + + this._onDidDispose.fire(); + super.dispose(); } + public invokeWithinContext(fn: (accessor: ServicesAccessor) => T): T { + return this._instantiationService.invokeFunction(fn); + } + + public updateOptions(newOptions: editorOptions.IEditorOptions): void { + this._configuration.updateOptions(newOptions); + } + + public getConfiguration(): editorOptions.InternalEditorOptions { + return this._configuration.editor; + } + + public getRawConfiguration(): editorOptions.IEditorOptions { + return this._configuration.getRawOptions(); + } + + public getValue(options: { preserveBOM: boolean; lineEnding: string; } = null): string { + if (this.model) { + let preserveBOM: boolean = (options && options.preserveBOM) ? true : false; + let eolPreference = EndOfLinePreference.TextDefined; + if (options && options.lineEnding && options.lineEnding === '\n') { + eolPreference = EndOfLinePreference.LF; + } else if (options && options.lineEnding && options.lineEnding === '\r\n') { + eolPreference = EndOfLinePreference.CRLF; + } + return this.model.getValue(eolPreference, preserveBOM); + } + return ''; + } + + public setValue(newValue: string): void { + if (this.model) { + this.model.setValue(newValue); + } + } + + public getModel(): ITextModel { + return this.model; + } + + public setModel(model: ITextModel = null): void { + if (this.model === model) { + // Current model is the new model + return; + } + + let detachedModel = this._detachModel(); + this._attachModel(model); + + let e: editorCommon.IModelChangedEvent = { + oldModelUrl: detachedModel ? detachedModel.uri : null, + newModelUrl: model ? model.uri : null + }; + + this._removeDecorationTypes(); + this._onDidChangeModel.fire(e); + this._postDetachModelCleanup(detachedModel); + } + + private _removeDecorationTypes(): void { + this._decorationTypeKeysToIds = {}; + if (this._decorationTypeSubtypes) { + for (let decorationType in this._decorationTypeSubtypes) { + let subTypes = this._decorationTypeSubtypes[decorationType]; + for (let subType in subTypes) { + this._removeDecorationType(decorationType + '-' + subType); + } + } + this._decorationTypeSubtypes = {}; + } + } + + public getVisibleRanges(): Range[] { + if (!this.hasView) { + return []; + } + return this.viewModel.getVisibleRanges(); + } + + public getWhitespaces(): IEditorWhitespace[] { + if (!this.hasView) { + return []; + } + return this.viewModel.viewLayout.getWhitespaces(); + } + + private _getVerticalOffsetForPosition(modelLineNumber: number, modelColumn: number): number { + let modelPosition = this.model.validatePosition({ + lineNumber: modelLineNumber, + column: modelColumn + }); + let viewPosition = this.viewModel.coordinatesConverter.convertModelPositionToViewPosition(modelPosition); + return this.viewModel.viewLayout.getVerticalOffsetForLineNumber(viewPosition.lineNumber); + } + + public getTopForLineNumber(lineNumber: number): number { + if (!this.hasView) { + return -1; + } + return this._getVerticalOffsetForPosition(lineNumber, 1); + } + + public getTopForPosition(lineNumber: number, column: number): number { + if (!this.hasView) { + return -1; + } + return this._getVerticalOffsetForPosition(lineNumber, column); + } + + public setHiddenAreas(ranges: IRange[]): void { + if (this.viewModel) { + this.viewModel.setHiddenAreas(ranges.map(r => Range.lift(r))); + } + } + + public getVisibleColumnFromPosition(rawPosition: IPosition): number { + if (!this.model) { + return rawPosition.column; + } + + let position = this.model.validatePosition(rawPosition); + let tabSize = this.model.getOptions().tabSize; + + return CursorColumns.visibleColumnFromColumn(this.model.getLineContent(position.lineNumber), position.column, tabSize) + 1; + } + + public getPosition(): Position { + if (!this.cursor) { + return null; + } + return this.cursor.getPosition().clone(); + } + + public setPosition(position: IPosition): void { + if (!this.cursor) { + return; + } + if (!Position.isIPosition(position)) { + throw new Error('Invalid arguments'); + } + this.cursor.setSelections('api', [{ + selectionStartLineNumber: position.lineNumber, + selectionStartColumn: position.column, + positionLineNumber: position.lineNumber, + positionColumn: position.column + }]); + } + + private _sendRevealRange(modelRange: Range, verticalType: VerticalRevealType, revealHorizontal: boolean, scrollType: editorCommon.ScrollType): void { + if (!this.model || !this.cursor) { + return; + } + if (!Range.isIRange(modelRange)) { + throw new Error('Invalid arguments'); + } + const validatedModelRange = this.model.validateRange(modelRange); + const viewRange = this.viewModel.coordinatesConverter.convertModelRangeToViewRange(validatedModelRange); + + this.cursor.emitCursorRevealRange(viewRange, verticalType, revealHorizontal, scrollType); + } + + public revealLine(lineNumber: number, scrollType: editorCommon.ScrollType = editorCommon.ScrollType.Smooth): void { + this._revealLine(lineNumber, VerticalRevealType.Simple, scrollType); + } + + public revealLineInCenter(lineNumber: number, scrollType: editorCommon.ScrollType = editorCommon.ScrollType.Smooth): void { + this._revealLine(lineNumber, VerticalRevealType.Center, scrollType); + } + + public revealLineInCenterIfOutsideViewport(lineNumber: number, scrollType: editorCommon.ScrollType = editorCommon.ScrollType.Smooth): void { + this._revealLine(lineNumber, VerticalRevealType.CenterIfOutsideViewport, scrollType); + } + + private _revealLine(lineNumber: number, revealType: VerticalRevealType, scrollType: editorCommon.ScrollType): void { + if (typeof lineNumber !== 'number') { + throw new Error('Invalid arguments'); + } + + this._sendRevealRange( + new Range(lineNumber, 1, lineNumber, 1), + revealType, + false, + scrollType + ); + } + + public revealPosition(position: IPosition, scrollType: editorCommon.ScrollType = editorCommon.ScrollType.Smooth): void { + this._revealPosition( + position, + VerticalRevealType.Simple, + true, + scrollType + ); + } + + public revealPositionInCenter(position: IPosition, scrollType: editorCommon.ScrollType = editorCommon.ScrollType.Smooth): void { + this._revealPosition( + position, + VerticalRevealType.Center, + true, + scrollType + ); + } + + public revealPositionInCenterIfOutsideViewport(position: IPosition, scrollType: editorCommon.ScrollType = editorCommon.ScrollType.Smooth): void { + this._revealPosition( + position, + VerticalRevealType.CenterIfOutsideViewport, + true, + scrollType + ); + } + + private _revealPosition(position: IPosition, verticalType: VerticalRevealType, revealHorizontal: boolean, scrollType: editorCommon.ScrollType): void { + if (!Position.isIPosition(position)) { + throw new Error('Invalid arguments'); + } + + this._sendRevealRange( + new Range(position.lineNumber, position.column, position.lineNumber, position.column), + verticalType, + revealHorizontal, + scrollType + ); + } + + public getSelection(): Selection { + if (!this.cursor) { + return null; + } + return this.cursor.getSelection().clone(); + } + + public getSelections(): Selection[] { + if (!this.cursor) { + return null; + } + let selections = this.cursor.getSelections(); + let result: Selection[] = []; + for (let i = 0, len = selections.length; i < len; i++) { + result[i] = selections[i].clone(); + } + return result; + } + + public setSelection(range: IRange): void; + public setSelection(editorRange: Range): void; + public setSelection(selection: ISelection): void; + public setSelection(editorSelection: Selection): void; + public setSelection(something: any): void { + let isSelection = Selection.isISelection(something); + let isRange = Range.isIRange(something); + + if (!isSelection && !isRange) { + throw new Error('Invalid arguments'); + } + + if (isSelection) { + this._setSelectionImpl(something); + } else if (isRange) { + // act as if it was an IRange + let selection: ISelection = { + selectionStartLineNumber: something.startLineNumber, + selectionStartColumn: something.startColumn, + positionLineNumber: something.endLineNumber, + positionColumn: something.endColumn + }; + this._setSelectionImpl(selection); + } + } + + private _setSelectionImpl(sel: ISelection): void { + if (!this.cursor) { + return; + } + let selection = new Selection(sel.selectionStartLineNumber, sel.selectionStartColumn, sel.positionLineNumber, sel.positionColumn); + this.cursor.setSelections('api', [selection]); + } + + public revealLines(startLineNumber: number, endLineNumber: number, scrollType: editorCommon.ScrollType = editorCommon.ScrollType.Smooth): void { + this._revealLines( + startLineNumber, + endLineNumber, + VerticalRevealType.Simple, + scrollType + ); + } + + public revealLinesInCenter(startLineNumber: number, endLineNumber: number, scrollType: editorCommon.ScrollType = editorCommon.ScrollType.Smooth): void { + this._revealLines( + startLineNumber, + endLineNumber, + VerticalRevealType.Center, + scrollType + ); + } + + public revealLinesInCenterIfOutsideViewport(startLineNumber: number, endLineNumber: number, scrollType: editorCommon.ScrollType = editorCommon.ScrollType.Smooth): void { + this._revealLines( + startLineNumber, + endLineNumber, + VerticalRevealType.CenterIfOutsideViewport, + scrollType + ); + } + + private _revealLines(startLineNumber: number, endLineNumber: number, verticalType: VerticalRevealType, scrollType: editorCommon.ScrollType): void { + if (typeof startLineNumber !== 'number' || typeof endLineNumber !== 'number') { + throw new Error('Invalid arguments'); + } + + this._sendRevealRange( + new Range(startLineNumber, 1, endLineNumber, 1), + verticalType, + false, + scrollType + ); + } + + public revealRange(range: IRange, scrollType: editorCommon.ScrollType = editorCommon.ScrollType.Smooth, revealVerticalInCenter: boolean = false, revealHorizontal: boolean = true): void { + this._revealRange( + range, + revealVerticalInCenter ? VerticalRevealType.Center : VerticalRevealType.Simple, + revealHorizontal, + scrollType + ); + } + + public revealRangeInCenter(range: IRange, scrollType: editorCommon.ScrollType = editorCommon.ScrollType.Smooth): void { + this._revealRange( + range, + VerticalRevealType.Center, + true, + scrollType + ); + } + + public revealRangeInCenterIfOutsideViewport(range: IRange, scrollType: editorCommon.ScrollType = editorCommon.ScrollType.Smooth): void { + this._revealRange( + range, + VerticalRevealType.CenterIfOutsideViewport, + true, + scrollType + ); + } + + public revealRangeAtTop(range: IRange, scrollType: editorCommon.ScrollType = editorCommon.ScrollType.Smooth): void { + this._revealRange( + range, + VerticalRevealType.Top, + true, + scrollType + ); + } + + private _revealRange(range: IRange, verticalType: VerticalRevealType, revealHorizontal: boolean, scrollType: editorCommon.ScrollType): void { + if (!Range.isIRange(range)) { + throw new Error('Invalid arguments'); + } + + this._sendRevealRange( + Range.lift(range), + verticalType, + revealHorizontal, + scrollType + ); + } + + public setSelections(ranges: ISelection[]): void { + if (!this.cursor) { + return; + } + if (!ranges || ranges.length === 0) { + throw new Error('Invalid arguments'); + } + for (let i = 0, len = ranges.length; i < len; i++) { + if (!Selection.isISelection(ranges[i])) { + throw new Error('Invalid arguments'); + } + } + this.cursor.setSelections('api', ranges); + } + + public getScrollWidth(): number { + if (!this.hasView) { + return -1; + } + return this.viewModel.viewLayout.getScrollWidth(); + } + public getScrollLeft(): number { + if (!this.hasView) { + return -1; + } + return this.viewModel.viewLayout.getCurrentScrollLeft(); + } + + public getScrollHeight(): number { + if (!this.hasView) { + return -1; + } + return this.viewModel.viewLayout.getScrollHeight(); + } + public getScrollTop(): number { + if (!this.hasView) { + return -1; + } + return this.viewModel.viewLayout.getCurrentScrollTop(); + } + + public setScrollLeft(newScrollLeft: number): void { + if (!this.hasView) { + return; + } + if (typeof newScrollLeft !== 'number') { + throw new Error('Invalid arguments'); + } + this.viewModel.viewLayout.setScrollPositionNow({ + scrollLeft: newScrollLeft + }); + } + public setScrollTop(newScrollTop: number): void { + if (!this.hasView) { + return; + } + if (typeof newScrollTop !== 'number') { + throw new Error('Invalid arguments'); + } + this.viewModel.viewLayout.setScrollPositionNow({ + scrollTop: newScrollTop + }); + } + public setScrollPosition(position: editorCommon.INewScrollPosition): void { + if (!this.hasView) { + return; + } + this.viewModel.viewLayout.setScrollPositionNow(position); + } + + public saveViewState(): editorCommon.ICodeEditorViewState { + if (!this.cursor || !this.hasView) { + return null; + } + const contributionsState: { [key: string]: any } = {}; + + const keys = Object.keys(this._contributions); + for (let i = 0, len = keys.length; i < len; i++) { + const id = keys[i]; + const contribution = this._contributions[id]; + if (typeof contribution.saveViewState === 'function') { + contributionsState[id] = contribution.saveViewState(); + } + } + + const cursorState = this.cursor.saveState(); + const viewState = this.viewModel.saveState(); + return { + cursorState: cursorState, + viewState: viewState, + contributionsState: contributionsState + }; + } + + public restoreViewState(s: editorCommon.ICodeEditorViewState): void { + if (!this.cursor || !this.hasView) { + return; + } + if (s && s.cursorState && s.viewState) { + let codeEditorState = s; + let cursorState = codeEditorState.cursorState; + if (Array.isArray(cursorState)) { + this.cursor.restoreState(cursorState); + } else { + // Backwards compatibility + this.cursor.restoreState([cursorState]); + } + + let contributionsState = s.contributionsState || {}; + let keys = Object.keys(this._contributions); + for (let i = 0, len = keys.length; i < len; i++) { + let id = keys[i]; + let contribution = this._contributions[id]; + if (typeof contribution.restoreViewState === 'function') { + contribution.restoreViewState(contributionsState[id]); + } + } + + const reducedState = this.viewModel.reduceRestoreState(s.viewState); + const linesViewportData = this.viewModel.viewLayout.getLinesViewportDataAtScrollTop(reducedState.scrollTop); + const startPosition = this.viewModel.coordinatesConverter.convertViewPositionToModelPosition(new Position(linesViewportData.startLineNumber, 1)); + const endPosition = this.viewModel.coordinatesConverter.convertViewPositionToModelPosition(new Position(linesViewportData.endLineNumber, 1)); + this.model.tokenizeViewport(startPosition.lineNumber, endPosition.lineNumber); + this._view.restoreState(reducedState); + } + } + + public onVisible(): void { + } + + public onHide(): void { + } + + public getContribution(id: string): T { + return (this._contributions[id] || null); + } + + public getActions(): editorCommon.IEditorAction[] { + let result: editorCommon.IEditorAction[] = []; + + let keys = Object.keys(this._actions); + for (let i = 0, len = keys.length; i < len; i++) { + let id = keys[i]; + result.push(this._actions[id]); + } + + return result; + } + + public getSupportedActions(): editorCommon.IEditorAction[] { + let result = this.getActions(); + + result = result.filter(action => action.isSupported()); + + return result; + } + + public getAction(id: string): editorCommon.IEditorAction { + return this._actions[id] || null; + } + + public trigger(source: string, handlerId: string, payload: any): void { + payload = payload || {}; + + // Special case for typing + if (handlerId === editorCommon.Handler.Type) { + if (!this.cursor || typeof payload.text !== 'string' || payload.text.length === 0) { + // nothing to do + return; + } + if (source === 'keyboard') { + this._onWillType.fire(payload.text); + } + this.cursor.trigger(source, handlerId, payload); + if (source === 'keyboard') { + this._onDidType.fire(payload.text); + } + return; + } + + // Special case for pasting + if (handlerId === editorCommon.Handler.Paste) { + if (!this.cursor || typeof payload.text !== 'string' || payload.text.length === 0) { + // nothing to do + return; + } + const startPosition = this.cursor.getSelection().getStartPosition(); + this.cursor.trigger(source, handlerId, payload); + const endPosition = this.cursor.getSelection().getStartPosition(); + if (source === 'keyboard') { + this._onDidPaste.fire( + new Range(startPosition.lineNumber, startPosition.column, endPosition.lineNumber, endPosition.column) + ); + } + return; + } + + const action = this.getAction(handlerId); + if (action) { + TPromise.as(action.run()).then(null, onUnexpectedError); + return; + } + + if (!this.cursor) { + return; + } + + if (this._triggerEditorCommand(source, handlerId, payload)) { + return; + } + + this.cursor.trigger(source, handlerId, payload); + } + + private _triggerEditorCommand(source: string, handlerId: string, payload: any): boolean { + const command = EditorExtensionsRegistry.getEditorCommand(handlerId); + if (command) { + payload = payload || {}; + payload.source = source; + TPromise.as(command.runEditorCommand(null, this, payload)).done(null, onUnexpectedError); + return true; + } + + return false; + } + + public _getCursors(): ICursors { + return this.cursor; + } + + public _getCursorConfiguration(): CursorConfiguration { + return this.cursor.context.config; + } + + public pushUndoStop(): boolean { + if (!this.model) { + return false; + } + if (this._configuration.editor.readOnly) { + // read only editor => sorry! + return false; + } + this.model.pushStackElement(); + return true; + } + + public executeEdits(source: string, edits: IIdentifiedSingleEditOperation[], endCursorState?: Selection[]): boolean { + if (!this.cursor) { + // no view, no cursor + return false; + } + if (this._configuration.editor.readOnly) { + // read only editor => sorry! + return false; + } + + this.model.pushEditOperations(this.cursor.getSelections(), edits, () => { + return endCursorState ? endCursorState : null; + }); + + if (endCursorState) { + this.cursor.setSelections(source, endCursorState); + } + + return true; + } + + public executeCommand(source: string, command: editorCommon.ICommand): void { + if (!this.cursor) { + return; + } + this.cursor.trigger(source, editorCommon.Handler.ExecuteCommand, command); + } + + public executeCommands(source: string, commands: editorCommon.ICommand[]): void { + if (!this.cursor) { + return; + } + this.cursor.trigger(source, editorCommon.Handler.ExecuteCommands, commands); + } + + public changeDecorations(callback: (changeAccessor: IModelDecorationsChangeAccessor) => any): any { + if (!this.model) { + // console.warn('Cannot change decorations on editor that is not attached to a model'); + // callback will not be called + return null; + } + return this.model.changeDecorations(callback, this.id); + } + + public getLineDecorations(lineNumber: number): IModelDecoration[] { + if (!this.model) { + return null; + } + return this.model.getLineDecorations(lineNumber, this.id, this._configuration.editor.readOnly); + } + + public deltaDecorations(oldDecorations: string[], newDecorations: IModelDeltaDecoration[]): string[] { + if (!this.model) { + return []; + } + + if (oldDecorations.length === 0 && newDecorations.length === 0) { + return oldDecorations; + } + + return this.model.deltaDecorations(oldDecorations, newDecorations, this.id); + } + + public setDecorations(decorationTypeKey: string, decorationOptions: editorCommon.IDecorationOptions[]): void { + + let newDecorationsSubTypes: { [key: string]: boolean } = {}; + let oldDecorationsSubTypes = this._decorationTypeSubtypes[decorationTypeKey] || {}; + this._decorationTypeSubtypes[decorationTypeKey] = newDecorationsSubTypes; + + let newModelDecorations: IModelDeltaDecoration[] = []; + + for (let decorationOption of decorationOptions) { + let typeKey = decorationTypeKey; + if (decorationOption.renderOptions) { + // identify custom reder options by a hash code over all keys and values + // For custom render options register a decoration type if necessary + let subType = hash(decorationOption.renderOptions).toString(16); + // The fact that `decorationTypeKey` appears in the typeKey has no influence + // it is just a mechanism to get predictable and unique keys (repeatable for the same options and unique across clients) + typeKey = decorationTypeKey + '-' + subType; + if (!oldDecorationsSubTypes[subType] && !newDecorationsSubTypes[subType]) { + // decoration type did not exist before, register new one + this._registerDecorationType(typeKey, decorationOption.renderOptions, decorationTypeKey); + } + newDecorationsSubTypes[subType] = true; + } + let opts = this._resolveDecorationOptions(typeKey, !!decorationOption.hoverMessage); + if (decorationOption.hoverMessage) { + opts.hoverMessage = decorationOption.hoverMessage; + } + newModelDecorations.push({ range: decorationOption.range, options: opts }); + } + + // remove decoration sub types that are no longer used, deregister decoration type if necessary + for (let subType in oldDecorationsSubTypes) { + if (!newDecorationsSubTypes[subType]) { + this._removeDecorationType(decorationTypeKey + '-' + subType); + } + } + + // update all decorations + let oldDecorationsIds = this._decorationTypeKeysToIds[decorationTypeKey] || []; + this._decorationTypeKeysToIds[decorationTypeKey] = this.deltaDecorations(oldDecorationsIds, newModelDecorations); + } + + public setDecorationsFast(decorationTypeKey: string, ranges: IRange[]): void { + + // remove decoration sub types that are no longer used, deregister decoration type if necessary + let oldDecorationsSubTypes = this._decorationTypeSubtypes[decorationTypeKey] || {}; + for (let subType in oldDecorationsSubTypes) { + this._removeDecorationType(decorationTypeKey + '-' + subType); + } + this._decorationTypeSubtypes[decorationTypeKey] = {}; + + const opts = ModelDecorationOptions.createDynamic(this._resolveDecorationOptions(decorationTypeKey, false)); + let newModelDecorations: IModelDeltaDecoration[] = new Array(ranges.length); + for (let i = 0, len = ranges.length; i < len; i++) { + newModelDecorations[i] = { range: ranges[i], options: opts }; + } + + // update all decorations + let oldDecorationsIds = this._decorationTypeKeysToIds[decorationTypeKey] || []; + this._decorationTypeKeysToIds[decorationTypeKey] = this.deltaDecorations(oldDecorationsIds, newModelDecorations); + } + + public removeDecorations(decorationTypeKey: string): void { + // remove decorations for type and sub type + let oldDecorationsIds = this._decorationTypeKeysToIds[decorationTypeKey]; + if (oldDecorationsIds) { + this.deltaDecorations(oldDecorationsIds, []); + } + if (this._decorationTypeKeysToIds.hasOwnProperty(decorationTypeKey)) { + delete this._decorationTypeKeysToIds[decorationTypeKey]; + } + if (this._decorationTypeSubtypes.hasOwnProperty(decorationTypeKey)) { + delete this._decorationTypeSubtypes[decorationTypeKey]; + } + } + + public getLayoutInfo(): editorOptions.EditorLayoutInfo { + return this._configuration.editor.layoutInfo; + } + public createOverviewRuler(cssClassName: string): editorBrowser.IOverviewRuler { return this._view.createOverviewRuler(cssClassName); } @@ -186,7 +1116,7 @@ export abstract class CodeEditorWidget extends CommonCodeEditor implements edito this._view.focus(); } - public isFocused(): boolean { + public hasTextFocus(): boolean { return this.hasView && this._view.isFocused(); } @@ -325,10 +1255,80 @@ export abstract class CodeEditorWidget extends CommonCodeEditor implements edito Configuration.applyFontInfoSlow(target, this._configuration.editor.fontInfo); } - _attachModel(model: ITextModel): void { + protected _attachModel(model: ITextModel): void { this._view = null; - super._attachModel(model); + this.model = model ? model : null; + this.listenersToRemove = []; + this.viewModel = null; + this.cursor = null; + + if (this.model) { + this.domElement.setAttribute('data-mode-id', this.model.getLanguageIdentifier().language); + this._configuration.setIsDominatedByLongLines(this.model.isDominatedByLongLines()); + this._configuration.setMaxLineNumber(this.model.getLineCount()); + + this.model.onBeforeAttached(); + + this.viewModel = new ViewModel(this.id, this._configuration, this.model, (callback) => dom.scheduleAtNextAnimationFrame(callback)); + + this.listenersToRemove.push(this.model.onDidChangeDecorations((e) => this._onDidChangeModelDecorations.fire(e))); + this.listenersToRemove.push(this.model.onDidChangeLanguage((e) => { + if (!this.model) { + return; + } + this.domElement.setAttribute('data-mode-id', this.model.getLanguageIdentifier().language); + this._onDidChangeModelLanguage.fire(e); + })); + this.listenersToRemove.push(this.model.onDidChangeLanguageConfiguration((e) => this._onDidChangeModelLanguageConfiguration.fire(e))); + this.listenersToRemove.push(this.model.onDidChangeContent((e) => this._onDidChangeModelContent.fire(e))); + this.listenersToRemove.push(this.model.onDidChangeOptions((e) => this._onDidChangeModelOptions.fire(e))); + // Someone might destroy the model from under the editor, so prevent any exceptions by setting a null model + this.listenersToRemove.push(this.model.onWillDispose(() => this.setModel(null))); + + this.cursor = new Cursor( + this._configuration, + this.model, + this.viewModel + ); + + this._createView(); + + this.listenersToRemove.push(this.cursor.onDidReachMaxCursorCount(() => { + this._notificationService.warn(nls.localize('cursors.maximum', "The number of cursors has been limited to {0}.", Cursor.MAX_CURSOR_COUNT)); + })); + + this.listenersToRemove.push(this.cursor.onDidAttemptReadOnlyEdit(() => { + this._onDidAttemptReadOnlyEdit.fire(void 0); + })); + + this.listenersToRemove.push(this.cursor.onDidChange((e: CursorStateChangedEvent) => { + + let positions: Position[] = []; + for (let i = 0, len = e.selections.length; i < len; i++) { + positions[i] = e.selections[i].getPosition(); + } + + const e1: ICursorPositionChangedEvent = { + position: positions[0], + secondaryPositions: positions.slice(1), + reason: e.reason, + source: e.source + }; + this._onDidChangeCursorPosition.fire(e1); + + const e2: ICursorSelectionChangedEvent = { + selection: e.selections[0], + secondarySelections: e.selections.slice(1), + source: e.source, + reason: e.reason + }; + this._onDidChangeCursorSelection.fire(e2); + })); + + } else { + this.hasView = false; + } if (this._view) { this.domElement.appendChild(this._view.domNode.domNode); @@ -351,31 +1351,27 @@ export abstract class CodeEditorWidget extends CommonCodeEditor implements edito } } - protected _scheduleAtNextAnimationFrame(callback: () => void): IDisposable { - return dom.scheduleAtNextAnimationFrame(callback); - } - protected _createView(): void { let commandDelegate: ICommandDelegate; if (this.isSimpleWidget) { commandDelegate = { paste: (source: string, text: string, pasteOnNewLine: boolean, multicursorText: string[]) => { - this.cursor.trigger(source, editorCommon.Handler.Paste, { text, pasteOnNewLine, multicursorText }); + this.trigger(source, editorCommon.Handler.Paste, { text, pasteOnNewLine, multicursorText }); }, type: (source: string, text: string) => { - this.cursor.trigger(source, editorCommon.Handler.Type, { text }); + this.trigger(source, editorCommon.Handler.Type, { text }); }, replacePreviousChar: (source: string, text: string, replaceCharCnt: number) => { - this.cursor.trigger(source, editorCommon.Handler.ReplacePreviousChar, { text, replaceCharCnt }); + this.trigger(source, editorCommon.Handler.ReplacePreviousChar, { text, replaceCharCnt }); }, compositionStart: (source: string) => { - this.cursor.trigger(source, editorCommon.Handler.CompositionStart, undefined); + this.trigger(source, editorCommon.Handler.CompositionStart, undefined); }, compositionEnd: (source: string) => { - this.cursor.trigger(source, editorCommon.Handler.CompositionEnd, undefined); + this.trigger(source, editorCommon.Handler.CompositionEnd, undefined); }, cut: (source: string) => { - this.cursor.trigger(source, editorCommon.Handler.Cut, undefined); + this.trigger(source, editorCommon.Handler.Cut, undefined); } }; } else { @@ -429,7 +1425,7 @@ export abstract class CodeEditorWidget extends CommonCodeEditor implements edito viewEventBus.onDidGainFocus = () => { this._editorTextFocus.setValue(true); // In IE, the focus is not synchronous, so we give it a little help - this._editorFocus.setValue(true); + this._editorWidgetFocus.setValue(true); }; viewEventBus.onDidScroll = (e) => this._onDidScrollChange.fire(e); @@ -445,22 +1441,13 @@ export abstract class CodeEditorWidget extends CommonCodeEditor implements edito viewEventBus.onKeyDown = (e) => this._onKeyDown.fire(e); } - public restoreViewState(s: editorCommon.ICodeEditorViewState): void { - super.restoreViewState(s); - if (!this.cursor || !this.hasView) { - return; - } - if (s && s.cursorState && s.viewState) { - const reducedState = this.viewModel.reduceRestoreState(s.viewState); - const linesViewportData = this.viewModel.viewLayout.getLinesViewportDataAtScrollTop(reducedState.scrollTop); - const startPosition = this.viewModel.coordinatesConverter.convertViewPositionToModelPosition(new Position(linesViewportData.startLineNumber, 1)); - const endPosition = this.viewModel.coordinatesConverter.convertViewPositionToModelPosition(new Position(linesViewportData.endLineNumber, 1)); - this.model.tokenizeViewport(startPosition.lineNumber, endPosition.lineNumber); - this._view.restoreState(reducedState); + protected _postDetachModelCleanup(detachedModel: ITextModel): void { + if (detachedModel) { + detachedModel.removeAllDecorationsWithOwnerId(this.id); } } - protected _detachModel(): ITextModel { + private _detachModel(): ITextModel { let removeDomNode: HTMLElement = null; if (this._view) { @@ -469,7 +1456,28 @@ export abstract class CodeEditorWidget extends CommonCodeEditor implements edito this._view = null; } - let result = super._detachModel(); + if (this.model) { + this.model.onBeforeDetached(); + } + + this.hasView = false; + + this.listenersToRemove = dispose(this.listenersToRemove); + + if (this.cursor) { + this.cursor.dispose(); + this.cursor = null; + } + + if (this.viewModel) { + this.viewModel.dispose(); + this.viewModel = null; + } + + let result = this.model; + this.model = null; + + this.domElement.removeAttribute('data-mode-id'); if (removeDomNode) { this.domElement.removeChild(removeDomNode); @@ -478,32 +1486,253 @@ export abstract class CodeEditorWidget extends CommonCodeEditor implements edito return result; } - // BEGIN decorations - - protected _registerDecorationType(key: string, options: editorCommon.IDecorationRenderOptions, parentTypeKey?: string): void { + private _registerDecorationType(key: string, options: editorCommon.IDecorationRenderOptions, parentTypeKey?: string): void { this._codeEditorService.registerDecorationType(key, options, parentTypeKey); } - protected _removeDecorationType(key: string): void { + private _removeDecorationType(key: string): void { this._codeEditorService.removeDecorationType(key); } - protected _resolveDecorationOptions(typeKey: string, writable: boolean): IModelDecorationOptions { + private _resolveDecorationOptions(typeKey: string, writable: boolean): IModelDecorationOptions { return this._codeEditorService.resolveDecorationOptions(typeKey, writable); } - // END decorations + /* __GDPR__FRAGMENT__ + "EditorTelemetryData" : {} + */ + public getTelemetryData(): { [key: string]: any; } { + return this._telemetryData; + } +} - protected _triggerEditorCommand(source: string, handlerId: string, payload: any): boolean { - const command = EditorExtensionsRegistry.getEditorCommand(handlerId); - if (command) { - payload = payload || {}; - payload.source = source; - TPromise.as(command.runEditorCommand(null, this, payload)).done(null, onUnexpectedError); - return true; +const enum BooleanEventValue { + NotSet, + False, + True +} + +export class BooleanEventEmitter extends Disposable { + private readonly _onDidChangeToTrue: Emitter = this._register(new Emitter()); + public readonly onDidChangeToTrue: Event = this._onDidChangeToTrue.event; + + private readonly _onDidChangeToFalse: Emitter = this._register(new Emitter()); + public readonly onDidChangeToFalse: Event = this._onDidChangeToFalse.event; + + private _value: BooleanEventValue; + + constructor() { + super(); + this._value = BooleanEventValue.NotSet; + } + + public setValue(_value: boolean) { + let value = (_value ? BooleanEventValue.True : BooleanEventValue.False); + if (this._value === value) { + return; } + this._value = value; + if (this._value === BooleanEventValue.True) { + this._onDidChangeToTrue.fire(); + } else if (this._value === BooleanEventValue.False) { + this._onDidChangeToFalse.fire(); + } + } +} - return false; +class EditorContextKeysManager extends Disposable { + + private _editor: CodeEditorWidget; + private _editorFocus: IContextKey; + private _textInputFocus: IContextKey; + private _editorTextFocus: IContextKey; + private _editorTabMovesFocus: IContextKey; + private _editorReadonly: IContextKey; + private _hasMultipleSelections: IContextKey; + private _hasNonEmptySelection: IContextKey; + private _canUndo: IContextKey; + private _canRedo: IContextKey; + + constructor( + editor: CodeEditorWidget, + contextKeyService: IContextKeyService + ) { + super(); + + this._editor = editor; + + contextKeyService.createKey('editorId', editor.getId()); + this._editorFocus = EditorContextKeys.focus.bindTo(contextKeyService); + this._textInputFocus = EditorContextKeys.textInputFocus.bindTo(contextKeyService); + this._editorTextFocus = EditorContextKeys.editorTextFocus.bindTo(contextKeyService); + this._editorTabMovesFocus = EditorContextKeys.tabMovesFocus.bindTo(contextKeyService); + this._editorReadonly = EditorContextKeys.readOnly.bindTo(contextKeyService); + this._hasMultipleSelections = EditorContextKeys.hasMultipleSelections.bindTo(contextKeyService); + this._hasNonEmptySelection = EditorContextKeys.hasNonEmptySelection.bindTo(contextKeyService); + this._canUndo = EditorContextKeys.canUndo.bindTo(contextKeyService); + this._canRedo = EditorContextKeys.canRedo.bindTo(contextKeyService); + + this._register(this._editor.onDidChangeConfiguration(() => this._updateFromConfig())); + this._register(this._editor.onDidChangeCursorSelection(() => this._updateFromSelection())); + this._register(this._editor.onDidFocusEditorWidget(() => this._updateFromFocus())); + this._register(this._editor.onDidBlurEditorWidget(() => this._updateFromFocus())); + this._register(this._editor.onDidFocusEditorText(() => this._updateFromFocus())); + this._register(this._editor.onDidBlurEditorText(() => this._updateFromFocus())); + this._register(this._editor.onDidChangeModel(() => this._updateFromModel())); + this._register(this._editor.onDidChangeConfiguration(() => this._updateFromModel())); + + this._updateFromConfig(); + this._updateFromSelection(); + this._updateFromFocus(); + this._updateFromModel(); + } + + private _updateFromConfig(): void { + let config = this._editor.getConfiguration(); + + this._editorTabMovesFocus.set(config.tabFocusMode); + this._editorReadonly.set(config.readOnly); + } + + private _updateFromSelection(): void { + let selections = this._editor.getSelections(); + if (!selections) { + this._hasMultipleSelections.reset(); + this._hasNonEmptySelection.reset(); + } else { + this._hasMultipleSelections.set(selections.length > 1); + this._hasNonEmptySelection.set(selections.some(s => !s.isEmpty())); + } + } + + private _updateFromFocus(): void { + this._editorFocus.set(this._editor.hasWidgetFocus() && !this._editor.isSimpleWidget); + this._editorTextFocus.set(this._editor.hasTextFocus() && !this._editor.isSimpleWidget); + this._textInputFocus.set(this._editor.hasTextFocus()); + } + + private _updateFromModel(): void { + const model = this._editor.getModel(); + this._canUndo.set(model && model.canUndo()); + this._canRedo.set(model && model.canRedo()); + } +} + +export class EditorModeContext extends Disposable { + + private _editor: CodeEditorWidget; + + private _langId: IContextKey; + private _hasCompletionItemProvider: IContextKey; + private _hasCodeActionsProvider: IContextKey; + private _hasCodeLensProvider: IContextKey; + private _hasDefinitionProvider: IContextKey; + private _hasImplementationProvider: IContextKey; + private _hasTypeDefinitionProvider: IContextKey; + private _hasHoverProvider: IContextKey; + private _hasDocumentHighlightProvider: IContextKey; + private _hasDocumentSymbolProvider: IContextKey; + private _hasReferenceProvider: IContextKey; + private _hasRenameProvider: IContextKey; + private _hasDocumentFormattingProvider: IContextKey; + private _hasDocumentSelectionFormattingProvider: IContextKey; + private _hasSignatureHelpProvider: IContextKey; + private _isInWalkThrough: IContextKey; + + constructor( + editor: CodeEditorWidget, + contextKeyService: IContextKeyService + ) { + super(); + this._editor = editor; + + this._langId = EditorContextKeys.languageId.bindTo(contextKeyService); + this._hasCompletionItemProvider = EditorContextKeys.hasCompletionItemProvider.bindTo(contextKeyService); + this._hasCodeActionsProvider = EditorContextKeys.hasCodeActionsProvider.bindTo(contextKeyService); + this._hasCodeLensProvider = EditorContextKeys.hasCodeLensProvider.bindTo(contextKeyService); + this._hasDefinitionProvider = EditorContextKeys.hasDefinitionProvider.bindTo(contextKeyService); + this._hasImplementationProvider = EditorContextKeys.hasImplementationProvider.bindTo(contextKeyService); + this._hasTypeDefinitionProvider = EditorContextKeys.hasTypeDefinitionProvider.bindTo(contextKeyService); + this._hasHoverProvider = EditorContextKeys.hasHoverProvider.bindTo(contextKeyService); + this._hasDocumentHighlightProvider = EditorContextKeys.hasDocumentHighlightProvider.bindTo(contextKeyService); + this._hasDocumentSymbolProvider = EditorContextKeys.hasDocumentSymbolProvider.bindTo(contextKeyService); + this._hasReferenceProvider = EditorContextKeys.hasReferenceProvider.bindTo(contextKeyService); + this._hasRenameProvider = EditorContextKeys.hasRenameProvider.bindTo(contextKeyService); + this._hasDocumentFormattingProvider = EditorContextKeys.hasDocumentFormattingProvider.bindTo(contextKeyService); + this._hasDocumentSelectionFormattingProvider = EditorContextKeys.hasDocumentSelectionFormattingProvider.bindTo(contextKeyService); + this._hasSignatureHelpProvider = EditorContextKeys.hasSignatureHelpProvider.bindTo(contextKeyService); + this._isInWalkThrough = EditorContextKeys.isInEmbeddedEditor.bindTo(contextKeyService); + + const update = () => this._update(); + + // update when model/mode changes + this._register(editor.onDidChangeModel(update)); + this._register(editor.onDidChangeModelLanguage(update)); + + // update when registries change + this._register(modes.SuggestRegistry.onDidChange(update)); + this._register(modes.CodeActionProviderRegistry.onDidChange(update)); + this._register(modes.CodeLensProviderRegistry.onDidChange(update)); + this._register(modes.DefinitionProviderRegistry.onDidChange(update)); + this._register(modes.ImplementationProviderRegistry.onDidChange(update)); + this._register(modes.TypeDefinitionProviderRegistry.onDidChange(update)); + this._register(modes.HoverProviderRegistry.onDidChange(update)); + this._register(modes.DocumentHighlightProviderRegistry.onDidChange(update)); + this._register(modes.DocumentSymbolProviderRegistry.onDidChange(update)); + this._register(modes.ReferenceProviderRegistry.onDidChange(update)); + this._register(modes.RenameProviderRegistry.onDidChange(update)); + this._register(modes.DocumentFormattingEditProviderRegistry.onDidChange(update)); + this._register(modes.DocumentRangeFormattingEditProviderRegistry.onDidChange(update)); + this._register(modes.SignatureHelpProviderRegistry.onDidChange(update)); + + update(); + } + + dispose() { + super.dispose(); + } + + reset() { + this._langId.reset(); + this._hasCompletionItemProvider.reset(); + this._hasCodeActionsProvider.reset(); + this._hasCodeLensProvider.reset(); + this._hasDefinitionProvider.reset(); + this._hasImplementationProvider.reset(); + this._hasTypeDefinitionProvider.reset(); + this._hasHoverProvider.reset(); + this._hasDocumentHighlightProvider.reset(); + this._hasDocumentSymbolProvider.reset(); + this._hasReferenceProvider.reset(); + this._hasRenameProvider.reset(); + this._hasDocumentFormattingProvider.reset(); + this._hasDocumentSelectionFormattingProvider.reset(); + this._hasSignatureHelpProvider.reset(); + this._isInWalkThrough.reset(); + } + + private _update() { + const model = this._editor.getModel(); + if (!model) { + this.reset(); + return; + } + this._langId.set(model.getLanguageIdentifier().language); + this._hasCompletionItemProvider.set(modes.SuggestRegistry.has(model)); + this._hasCodeActionsProvider.set(modes.CodeActionProviderRegistry.has(model)); + this._hasCodeLensProvider.set(modes.CodeLensProviderRegistry.has(model)); + this._hasDefinitionProvider.set(modes.DefinitionProviderRegistry.has(model)); + this._hasImplementationProvider.set(modes.ImplementationProviderRegistry.has(model)); + this._hasTypeDefinitionProvider.set(modes.TypeDefinitionProviderRegistry.has(model)); + this._hasHoverProvider.set(modes.HoverProviderRegistry.has(model)); + this._hasDocumentHighlightProvider.set(modes.DocumentHighlightProviderRegistry.has(model)); + this._hasDocumentSymbolProvider.set(modes.DocumentSymbolProviderRegistry.has(model)); + this._hasReferenceProvider.set(modes.ReferenceProviderRegistry.has(model)); + this._hasRenameProvider.set(modes.RenameProviderRegistry.has(model)); + this._hasSignatureHelpProvider.set(modes.SignatureHelpProviderRegistry.has(model)); + this._hasDocumentFormattingProvider.set(modes.DocumentFormattingEditProviderRegistry.has(model) || modes.DocumentRangeFormattingEditProviderRegistry.has(model)); + this._hasDocumentSelectionFormattingProvider.set(modes.DocumentRangeFormattingEditProviderRegistry.has(model)); + this._isInWalkThrough.set(model.uri.scheme === Schemas.walkThroughSnippet); } } @@ -557,7 +1786,7 @@ registerThemingParticipant((theme, collector) => { } let errorForeground = theme.getColor(editorErrorForeground); if (errorForeground) { - collector.addRule(`.monaco-editor .${ClassName.EditorErrorDecoration} { background: url("data:image/svg+xml;utf8,${getSquigglySVGData(errorForeground)}") repeat-x bottom left; }`); + collector.addRule(`.monaco-editor .${ClassName.EditorErrorDecoration} { background: url("data:image/svg+xml,${getSquigglySVGData(errorForeground)}") repeat-x bottom left; }`); } let warningBorderColor = theme.getColor(editorWarningBorder); @@ -566,7 +1795,7 @@ registerThemingParticipant((theme, collector) => { } let warningForeground = theme.getColor(editorWarningForeground); if (warningForeground) { - collector.addRule(`.monaco-editor .${ClassName.EditorWarningDecoration} { background: url("data:image/svg+xml;utf8,${getSquigglySVGData(warningForeground)}") repeat-x bottom left; }`); + collector.addRule(`.monaco-editor .${ClassName.EditorWarningDecoration} { background: url("data:image/svg+xml,${getSquigglySVGData(warningForeground)}") repeat-x bottom left; }`); } let infoBorderColor = theme.getColor(editorInfoBorder); @@ -575,7 +1804,7 @@ registerThemingParticipant((theme, collector) => { } let infoForeground = theme.getColor(editorInfoForeground); if (infoForeground) { - collector.addRule(`.monaco-editor .${ClassName.EditorInfoDecoration} { background: url("data:image/svg+xml;utf8,${getSquigglySVGData(infoForeground)}") repeat-x bottom left; }`); + collector.addRule(`.monaco-editor .${ClassName.EditorInfoDecoration} { background: url("data:image/svg+xml,${getSquigglySVGData(infoForeground)}") repeat-x bottom left; }`); } let hintBorderColor = theme.getColor(editorHintBorder); @@ -584,6 +1813,16 @@ registerThemingParticipant((theme, collector) => { } let hintForeground = theme.getColor(editorHintForeground); if (hintForeground) { - collector.addRule(`.monaco-editor .${ClassName.EditorHintDecoration} { background: url("data:image/svg+xml;utf8,${getDotDotDotSVGData(hintForeground)}") no-repeat bottom left; }`); + collector.addRule(`.monaco-editor .${ClassName.EditorHintDecoration} { background: url("data:image/svg+xml,${getDotDotDotSVGData(hintForeground)}") no-repeat bottom left; }`); + } + + const unnecessaryForeground = theme.getColor(editorUnnecessaryCodeOpacity); + if (unnecessaryForeground) { + collector.addRule(`.${SHOW_UNUSED_ENABLED_CLASS} .monaco-editor .${ClassName.EditorUnnecessaryInlineDecoration} { opacity: ${unnecessaryForeground.rgba.a}; will-change: opacity; }`); // TODO@Ben: 'will-change: opacity' is a workaround for https://github.com/Microsoft/vscode/issues/52196 + } + + const unnecessaryBorder = theme.getColor(editorUnnecessaryCodeBorder); + if (unnecessaryBorder) { + collector.addRule(`.${SHOW_UNUSED_ENABLED_CLASS} .monaco-editor .${ClassName.EditorUnnecessaryDecoration} { border-bottom: 2px dashed ${unnecessaryBorder}; }`); } }); diff --git a/src/vs/editor/browser/widget/diffEditorWidget.ts b/src/vs/editor/browser/widget/diffEditorWidget.ts index 8a938fa1b4..25b0321d1e 100644 --- a/src/vs/editor/browser/widget/diffEditorWidget.ts +++ b/src/vs/editor/browser/widget/diffEditorWidget.ts @@ -12,7 +12,7 @@ import { Disposable } from 'vs/base/common/lifecycle'; import * as objects from 'vs/base/common/objects'; import * as dom from 'vs/base/browser/dom'; import { FastDomNode, createFastDomNode } from 'vs/base/browser/fastDomNode'; -import { ISashEvent, IVerticalSashLayoutProvider, Sash } from 'vs/base/browser/ui/sash/sash'; +import { ISashEvent, IVerticalSashLayoutProvider, Sash, SashState } from 'vs/base/browser/ui/sash/sash'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService'; @@ -22,18 +22,16 @@ import { IEditorWorkerService } from 'vs/editor/common/services/editorWorkerServ import { LineDecoration } from 'vs/editor/common/viewLayout/lineDecorations'; import { renderViewLine, RenderLineInput } from 'vs/editor/common/viewLayout/viewLineRenderer'; import * as editorBrowser from 'vs/editor/browser/editorBrowser'; -import { CodeEditor } from 'vs/editor/browser/codeEditor'; -import { LineTokens } from 'vs/editor/common/core/lineTokens'; +import { CodeEditorWidget } from 'vs/editor/browser/widget/codeEditorWidget'; import { Configuration } from 'vs/editor/browser/config/configuration'; import { Position, IPosition } from 'vs/editor/common/core/position'; import { Selection, ISelection } from 'vs/editor/common/core/selection'; import { InlineDecoration, InlineDecorationType, ViewLineRenderingData } from 'vs/editor/common/viewModel/viewModel'; import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection'; -import { ColorId, MetadataConsts, FontStyle } from 'vs/editor/common/modes'; import { Event, Emitter } from 'vs/base/common/event'; import * as editorOptions from 'vs/editor/common/config/editorOptions'; import { registerThemingParticipant, IThemeService, ITheme, getThemeTypeSelector } from 'vs/platform/theme/common/themeService'; -import { scrollbarShadow, diffInserted, diffRemoved, defaultInsertColor, defaultRemoveColor, diffInsertedOutline, diffRemovedOutline } from 'vs/platform/theme/common/colorRegistry'; +import { scrollbarShadow, diffInserted, diffRemoved, defaultInsertColor, defaultRemoveColor, diffInsertedOutline, diffRemovedOutline, diffBorder } from 'vs/platform/theme/common/colorRegistry'; import { Color } from 'vs/base/common/color'; import { OverviewRulerZone } from 'vs/editor/common/view/overviewZoneManager'; import { IEditorWhitespace } from 'vs/editor/common/viewLayout/whitespaceComputer'; @@ -87,7 +85,7 @@ class VisualEditorState { return allViewZones.filter((z) => !this._zonesMap[String(z.id)]); } - public clean(editor: CodeEditor): void { + public clean(editor: CodeEditorWidget): void { // (1) View zones if (this._zones.length > 0) { editor.changeViewZones((viewChangeAccessor: editorBrowser.IViewZoneChangeAccessor) => { @@ -103,7 +101,7 @@ class VisualEditorState { this._decorations = editor.deltaDecorations(this._decorations, []); } - public apply(editor: CodeEditor, overviewRuler: editorBrowser.IOverviewRuler, newDecorations: IEditorDiffDecorationsWithZones, restoreScrollState: boolean): void { + public apply(editor: CodeEditorWidget, overviewRuler: editorBrowser.IOverviewRuler, newDecorations: IEditorDiffDecorationsWithZones, restoreScrollState: boolean): void { const scrollState = restoreScrollState ? StableEditorScrollState.capture(editor) : null; @@ -162,12 +160,12 @@ export class DiffEditorWidget extends Disposable implements editorBrowser.IDiffE private _reviewHeight: number; private readonly _measureDomElementToken: number; - private originalEditor: CodeEditor; + private originalEditor: CodeEditorWidget; private _originalDomNode: HTMLElement; private _originalEditorState: VisualEditorState; private _originalOverviewRuler: editorBrowser.IOverviewRuler; - private modifiedEditor: CodeEditor; + private modifiedEditor: CodeEditorWidget; private _modifiedDomNode: HTMLElement; private _modifiedEditorState: VisualEditorState; private _modifiedOverviewRuler: editorBrowser.IOverviewRuler; @@ -470,8 +468,8 @@ export class DiffEditorWidget extends Disposable implements editorBrowser.IDiffE })); } - protected _createInnerEditor(instantiationService: IInstantiationService, container: HTMLElement, options: editorOptions.IEditorOptions): CodeEditor { - return instantiationService.createInstance(CodeEditor, container, options); + protected _createInnerEditor(instantiationService: IInstantiationService, container: HTMLElement, options: editorOptions.IEditorOptions): CodeEditorWidget { + return instantiationService.createInstance(CodeEditorWidget, container, options, {}); } public dispose(): void { @@ -486,10 +484,14 @@ export class DiffEditorWidget extends Disposable implements editorBrowser.IDiffE this._cleanViewZonesAndDecorations(); - this._overviewDomElement.removeChild(this._originalOverviewRuler.getDomNode()); - this._originalOverviewRuler.dispose(); - this._overviewDomElement.removeChild(this._modifiedOverviewRuler.getDomNode()); - this._modifiedOverviewRuler.dispose(); + if (this._originalOverviewRuler) { + this._overviewDomElement.removeChild(this._originalOverviewRuler.getDomNode()); + this._originalOverviewRuler.dispose(); + } + if (this._modifiedOverviewRuler) { + this._overviewDomElement.removeChild(this._modifiedOverviewRuler.getDomNode()); + this._modifiedOverviewRuler.dispose(); + } this._overviewDomElement.removeChild(this._overviewViewportDomElement.domNode); this._containerDomElement.removeChild(this._overviewDomElement); @@ -751,8 +753,8 @@ export class DiffEditorWidget extends Disposable implements editorBrowser.IDiffE this.modifiedEditor.focus(); } - public isFocused(): boolean { - return this.originalEditor.isFocused() || this.modifiedEditor.isFocused(); + public hasTextFocus(): boolean { + return this.originalEditor.hasTextFocus() || this.modifiedEditor.hasTextFocus(); } public onVisible(): void { @@ -1175,7 +1177,7 @@ interface IDataSource { getModifiedEditor(): editorBrowser.ICodeEditor; } -class DiffEditorWidgetStyle extends Disposable { +abstract class DiffEditorWidgetStyle extends Disposable implements IDiffEditorWidgetStyle { _dataSource: IDataSource; _insertColor: Color; @@ -1223,17 +1225,12 @@ class DiffEditorWidgetStyle extends Disposable { }; } - _getViewZones(lineChanges: editorCommon.ILineChange[], originalForeignVZ: IEditorWhitespace[], modifiedForeignVZ: IEditorWhitespace[], originalEditor: editorBrowser.ICodeEditor, modifiedEditor: editorBrowser.ICodeEditor, renderIndicators: boolean): IEditorsZones { - return null; - } + protected abstract _getViewZones(lineChanges: editorCommon.ILineChange[], originalForeignVZ: IEditorWhitespace[], modifiedForeignVZ: IEditorWhitespace[], originalEditor: editorBrowser.ICodeEditor, modifiedEditor: editorBrowser.ICodeEditor, renderIndicators: boolean): IEditorsZones; + protected abstract _getOriginalEditorDecorations(lineChanges: editorCommon.ILineChange[], ignoreTrimWhitespace: boolean, renderIndicators: boolean, originalEditor: editorBrowser.ICodeEditor, modifiedEditor: editorBrowser.ICodeEditor): IEditorDiffDecorations; + protected abstract _getModifiedEditorDecorations(lineChanges: editorCommon.ILineChange[], ignoreTrimWhitespace: boolean, renderIndicators: boolean, originalEditor: editorBrowser.ICodeEditor, modifiedEditor: editorBrowser.ICodeEditor): IEditorDiffDecorations; - _getOriginalEditorDecorations(lineChanges: editorCommon.ILineChange[], ignoreTrimWhitespace: boolean, renderIndicators: boolean, originalEditor: editorBrowser.ICodeEditor, modifiedEditor: editorBrowser.ICodeEditor): IEditorDiffDecorations { - return null; - } - - _getModifiedEditorDecorations(lineChanges: editorCommon.ILineChange[], ignoreTrimWhitespace: boolean, renderIndicators: boolean, originalEditor: editorBrowser.ICodeEditor, modifiedEditor: editorBrowser.ICodeEditor): IEditorDiffDecorations { - return null; - } + public abstract setEnableSplitViewResizing(enableSplitViewResizing: boolean): void; + public abstract layout(): number; } interface IMyViewZone extends editorBrowser.IViewZone { @@ -1526,7 +1523,7 @@ class DiffEdtorWidgetSideBySide extends DiffEditorWidgetStyle implements IDiffEd this._sash = this._register(new Sash(this._dataSource.getContainerDomNode(), this)); if (this._disableSash) { - this._sash.disable(); + this._sash.state = SashState.Disabled; } this._sash.onDidStart(() => this.onSashDragStart()); @@ -1535,20 +1532,11 @@ class DiffEdtorWidgetSideBySide extends DiffEditorWidgetStyle implements IDiffEd this._sash.onDidReset(() => this.onSashReset()); } - public dispose(): void { - super.dispose(); - } - public setEnableSplitViewResizing(enableSplitViewResizing: boolean): void { let newDisableSash = (enableSplitViewResizing === false); if (this._disableSash !== newDisableSash) { this._disableSash = newDisableSash; - - if (this._disableSash) { - this._sash.disable(); - } else { - this._sash.enable(); - } + this._sash.state = this._disableSash ? SashState.Disabled : SashState.Enabled; } } @@ -1617,12 +1605,12 @@ class DiffEdtorWidgetSideBySide extends DiffEditorWidgetStyle implements IDiffEd return this._dataSource.getHeight(); } - _getViewZones(lineChanges: editorCommon.ILineChange[], originalForeignVZ: IEditorWhitespace[], modifiedForeignVZ: IEditorWhitespace[], originalEditor: editorBrowser.ICodeEditor, modifiedEditor: editorBrowser.ICodeEditor): IEditorsZones { + protected _getViewZones(lineChanges: editorCommon.ILineChange[], originalForeignVZ: IEditorWhitespace[], modifiedForeignVZ: IEditorWhitespace[], originalEditor: editorBrowser.ICodeEditor, modifiedEditor: editorBrowser.ICodeEditor): IEditorsZones { let c = new SideBySideViewZonesComputer(lineChanges, originalForeignVZ, modifiedForeignVZ); return c.getViewZones(); } - _getOriginalEditorDecorations(lineChanges: editorCommon.ILineChange[], ignoreTrimWhitespace: boolean, renderIndicators: boolean, originalEditor: editorBrowser.ICodeEditor, modifiedEditor: editorBrowser.ICodeEditor): IEditorDiffDecorations { + protected _getOriginalEditorDecorations(lineChanges: editorCommon.ILineChange[], ignoreTrimWhitespace: boolean, renderIndicators: boolean, originalEditor: editorBrowser.ICodeEditor, modifiedEditor: editorBrowser.ICodeEditor): IEditorDiffDecorations { const overviewZoneColor = this._removeColor.toString(); let result: IEditorDiffDecorations = { @@ -1682,7 +1670,7 @@ class DiffEdtorWidgetSideBySide extends DiffEditorWidgetStyle implements IDiffEd return result; } - _getModifiedEditorDecorations(lineChanges: editorCommon.ILineChange[], ignoreTrimWhitespace: boolean, renderIndicators: boolean, originalEditor: editorBrowser.ICodeEditor, modifiedEditor: editorBrowser.ICodeEditor): IEditorDiffDecorations { + protected _getModifiedEditorDecorations(lineChanges: editorCommon.ILineChange[], ignoreTrimWhitespace: boolean, renderIndicators: boolean, originalEditor: editorBrowser.ICodeEditor, modifiedEditor: editorBrowser.ICodeEditor): IEditorDiffDecorations { const overviewZoneColor = this._insertColor.toString(); let result: IEditorDiffDecorations = { @@ -1749,7 +1737,7 @@ class SideBySideViewZonesComputer extends ViewZonesComputer { super(lineChanges, originalForeignVZ, modifiedForeignVZ); } - _produceOriginalFromDiff(lineChange: editorCommon.ILineChange, lineChangeOriginalLength: number, lineChangeModifiedLength: number): IMyViewZone { + protected _produceOriginalFromDiff(lineChange: editorCommon.ILineChange, lineChangeOriginalLength: number, lineChangeModifiedLength: number): IMyViewZone { if (lineChangeModifiedLength > lineChangeOriginalLength) { return { afterLineNumber: Math.max(lineChange.originalStartLineNumber, lineChange.originalEndLineNumber), @@ -1760,7 +1748,7 @@ class SideBySideViewZonesComputer extends ViewZonesComputer { return null; } - _produceModifiedFromDiff(lineChange: editorCommon.ILineChange, lineChangeOriginalLength: number, lineChangeModifiedLength: number): IMyViewZone { + protected _produceModifiedFromDiff(lineChange: editorCommon.ILineChange, lineChangeOriginalLength: number, lineChangeModifiedLength: number): IMyViewZone { if (lineChangeOriginalLength > lineChangeModifiedLength) { return { afterLineNumber: Math.max(lineChange.modifiedStartLineNumber, lineChange.modifiedEndLineNumber), @@ -1789,20 +1777,16 @@ class DiffEdtorWidgetInline extends DiffEditorWidgetStyle implements IDiffEditor })); } - public dispose(): void { - super.dispose(); - } - public setEnableSplitViewResizing(enableSplitViewResizing: boolean): void { // Nothing to do.. } - _getViewZones(lineChanges: editorCommon.ILineChange[], originalForeignVZ: IEditorWhitespace[], modifiedForeignVZ: IEditorWhitespace[], originalEditor: editorBrowser.ICodeEditor, modifiedEditor: editorBrowser.ICodeEditor, renderIndicators: boolean): IEditorsZones { + protected _getViewZones(lineChanges: editorCommon.ILineChange[], originalForeignVZ: IEditorWhitespace[], modifiedForeignVZ: IEditorWhitespace[], originalEditor: editorBrowser.ICodeEditor, modifiedEditor: editorBrowser.ICodeEditor, renderIndicators: boolean): IEditorsZones { let computer = new InlineViewZonesComputer(lineChanges, originalForeignVZ, modifiedForeignVZ, originalEditor, modifiedEditor, renderIndicators); return computer.getViewZones(); } - _getOriginalEditorDecorations(lineChanges: editorCommon.ILineChange[], ignoreTrimWhitespace: boolean, renderIndicators: boolean, originalEditor: editorBrowser.ICodeEditor, modifiedEditor: editorBrowser.ICodeEditor): IEditorDiffDecorations { + protected _getOriginalEditorDecorations(lineChanges: editorCommon.ILineChange[], ignoreTrimWhitespace: boolean, renderIndicators: boolean, originalEditor: editorBrowser.ICodeEditor, modifiedEditor: editorBrowser.ICodeEditor): IEditorDiffDecorations { const overviewZoneColor = this._removeColor.toString(); let result: IEditorDiffDecorations = { @@ -1831,7 +1815,7 @@ class DiffEdtorWidgetInline extends DiffEditorWidgetStyle implements IDiffEditor return result; } - _getModifiedEditorDecorations(lineChanges: editorCommon.ILineChange[], ignoreTrimWhitespace: boolean, renderIndicators: boolean, originalEditor: editorBrowser.ICodeEditor, modifiedEditor: editorBrowser.ICodeEditor): IEditorDiffDecorations { + protected _getModifiedEditorDecorations(lineChanges: editorCommon.ILineChange[], ignoreTrimWhitespace: boolean, renderIndicators: boolean, originalEditor: editorBrowser.ICodeEditor, modifiedEditor: editorBrowser.ICodeEditor): IEditorDiffDecorations { const overviewZoneColor = this._insertColor.toString(); let result: IEditorDiffDecorations = { @@ -1913,7 +1897,7 @@ class InlineViewZonesComputer extends ViewZonesComputer { this.renderIndicators = renderIndicators; } - _produceOriginalFromDiff(lineChange: editorCommon.ILineChange, lineChangeOriginalLength: number, lineChangeModifiedLength: number): IMyViewZone { + protected _produceOriginalFromDiff(lineChange: editorCommon.ILineChange, lineChangeOriginalLength: number, lineChangeModifiedLength: number): IMyViewZone { let marginDomNode = document.createElement('div'); marginDomNode.className = 'inline-added-margin-view-zone'; Configuration.applyFontInfoSlow(marginDomNode, this.modifiedEditorConfiguration.fontInfo); @@ -1926,7 +1910,7 @@ class InlineViewZonesComputer extends ViewZonesComputer { }; } - _produceModifiedFromDiff(lineChange: editorCommon.ILineChange, lineChangeOriginalLength: number, lineChangeModifiedLength: number): IMyViewZone { + protected _produceModifiedFromDiff(lineChange: editorCommon.ILineChange, lineChangeOriginalLength: number, lineChangeModifiedLength: number): IMyViewZone { let decorations: InlineDecoration[] = []; if (lineChange.charChanges) { for (let j = 0, lengthJ = lineChange.charChanges.length; j < lengthJ; j++) { @@ -1945,8 +1929,10 @@ class InlineViewZonesComputer extends ViewZonesComputer { let marginHTML: string[] = []; let lineDecorationsWidth = this.modifiedEditorConfiguration.layoutInfo.decorationsWidth; let lineHeight = this.modifiedEditorConfiguration.lineHeight; + const typicalHalfwidthCharacterWidth = this.modifiedEditorConfiguration.fontInfo.typicalHalfwidthCharacterWidth; + let maxCharsPerLine = 0; for (let lineNumber = lineChange.originalStartLineNumber; lineNumber <= lineChange.originalEndLineNumber; lineNumber++) { - this.renderOriginalLine(lineNumber - lineChange.originalStartLineNumber, this.originalModel, this.modifiedEditorConfiguration, this.modifiedEditorTabSize, lineNumber, decorations, sb); + maxCharsPerLine = Math.max(maxCharsPerLine, this._renderOriginalLine(lineNumber - lineChange.originalStartLineNumber, this.originalModel, this.modifiedEditorConfiguration, this.modifiedEditorTabSize, lineNumber, decorations, sb)); if (this.renderIndicators) { let index = lineNumber - lineChange.originalStartLineNumber; @@ -1955,6 +1941,7 @@ class InlineViewZonesComputer extends ViewZonesComputer { ]); } } + maxCharsPerLine += this.modifiedEditorConfiguration.viewInfo.scrollBeyondLastColumn; let domNode = document.createElement('div'); domNode.className = 'view-lines line-delete'; @@ -1970,27 +1957,17 @@ class InlineViewZonesComputer extends ViewZonesComputer { shouldNotShrink: true, afterLineNumber: (lineChange.modifiedEndLineNumber === 0 ? lineChange.modifiedStartLineNumber : lineChange.modifiedStartLineNumber - 1), heightInLines: lineChangeOriginalLength, + minWidthInPx: (maxCharsPerLine * typicalHalfwidthCharacterWidth), domNode: domNode, marginDomNode: marginDomNode }; } - private renderOriginalLine(count: number, originalModel: ITextModel, config: editorOptions.InternalEditorOptions, tabSize: number, lineNumber: number, decorations: InlineDecoration[], sb: IStringBuilder): void { - let lineContent = originalModel.getLineContent(lineNumber); + private _renderOriginalLine(count: number, originalModel: ITextModel, config: editorOptions.InternalEditorOptions, tabSize: number, lineNumber: number, decorations: InlineDecoration[], sb: IStringBuilder): number { + const lineTokens = originalModel.getLineTokens(lineNumber); + const lineContent = lineTokens.getLineContent(); - let actualDecorations = LineDecoration.filter(decorations, lineNumber, 1, lineContent.length + 1); - - const defaultMetadata = ( - (FontStyle.None << MetadataConsts.FONT_STYLE_OFFSET) - | (ColorId.DefaultForeground << MetadataConsts.FOREGROUND_OFFSET) - | (ColorId.DefaultBackground << MetadataConsts.BACKGROUND_OFFSET) - ) >>> 0; - - const tokens = new Uint32Array(2); - tokens[0] = lineContent.length; - tokens[1] = defaultMetadata; - - const lineTokens = new LineTokens(tokens, lineContent); + const actualDecorations = LineDecoration.filter(decorations, lineNumber, 1, lineContent.length + 1); sb.appendASCIIString('