The response has been limited to 50k tokens of the smallest files in the repo. You can remove this limitation by removing the max tokens filter.
├── .github
    ├── FUNDING.yml
    └── ISSUE_TEMPLATE
    │   ├── ---bug-report.md
    │   ├── ---feature-request.md
    │   └── --support-question.md
├── .gitignore
├── .travis.yml
├── .vscode
    ├── launch.json
    ├── settings.json
    └── tasks.json
├── .vscodeignore
├── CHANGELOG.md
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── LICENSE
├── PULL_REQUEST_TEMPLATE.md
├── README.md
├── configs
    ├── webpack.config.js
    ├── webpack.development.config.js
    └── webpack.production.config.js
├── debug.log
├── images
    ├── existing-gist.png
    ├── login-with-github.png
    ├── logo-128.png
    ├── logo-256.png
    ├── logo-512.png
    ├── logo.sketch
    ├── slack.png
    └── white-cloud.png
├── install_local.txt
├── package.json
├── package.nls.de.json
├── package.nls.es.json
├── package.nls.fr.json
├── package.nls.hu.json
├── package.nls.it.json
├── package.nls.ja.json
├── package.nls.json
├── package.nls.ko.json
├── package.nls.pt-br.json
├── package.nls.ru.json
├── package.nls.tr.json
├── package.nls.zh-cn.json
├── package.nls.zh-tw.json
├── release-notes.json
├── scripts
    └── deploy.sh
├── src
    ├── commons.ts
    ├── enums.ts
    ├── environmentPath.ts
    ├── extension.ts
    ├── localize.ts
    ├── lockfile.ts
    ├── models
    │   ├── cloudSettings.model.ts
    │   ├── customConfig.model.ts
    │   ├── extensionConfig.model.ts
    │   ├── language-pack.model.ts
    │   ├── localConfig.model.ts
    │   ├── settingType.model.ts
    │   ├── state.model.ts
    │   └── webview.model.ts
    ├── pragmaUtil.ts
    ├── service
    │   ├── autoUpload.service.ts
    │   ├── file.service.ts
    │   ├── github.oauth.service.ts
    │   ├── github.service.ts
    │   ├── plugin.service.ts
    │   └── webview.service.ts
    ├── state.ts
    ├── sync.ts
    └── util.ts
├── test
    ├── extension.test.ts
    ├── index.ts
    ├── pragmaUtil
    │   ├── index.ts
    │   └── testSettings.txt
    └── service
    │   └── fileService
    │       ├── dummyrc
    │       └── fileService.test.ts
├── tsconfig.json
├── tslint.json
└── ui
    ├── gist-selection
        ├── gist-selection.html
        └── gist-selection.js
    ├── landing-page
        ├── landing-page.html
        └── landing-page.js
    ├── settings
        ├── settings.html
        └── settings.js
    └── shared
        ├── fonts.js
        ├── page-header.js
        ├── styles.css
        └── vendor
            ├── bootstrap
                ├── css
                │   └── bootstrap.min.css
                └── js
                │   └── bootstrap.min.js
            ├── fontawesome
                ├── css
                │   ├── fontawesome.min.css
                │   └── solid.min.css
                └── webfonts
                │   └── fa-solid-900.ttf
            ├── google
                ├── OpenSans-Bold.ttf
                ├── Roboto-Bold.ttf
                └── Roboto-Regular.ttf
            ├── jquery
                └── jquery-3.3.1.slim.min.js
            ├── lodash
                └── lodash.min.js
            └── popper.js
                └── popper.min.js


/.github/FUNDING.yml:
--------------------------------------------------------------------------------
1 | # These are supported funding model platforms
2 | 
3 | github: shanalikhan 
4 | open_collective: code-settings-sync 
5 | issuehunt: code-settings-sync
6 | 


--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE/---bug-report.md:
--------------------------------------------------------------------------------
 1 | ---
 2 | name: "\U0001F41B Bug report"
 3 | about: "Bugs, missing documentation, or unexpected behavior \U0001F914"
 4 | 
 5 | ---
 6 | 
 7 | 🐛 **Describe the bug**  
 8 | A clear and concise description of what the bug is. You are always welcome to check the [Troubleshooting](https://github.com/shanalikhan/code-settings-sync/wiki/Troubleshooting) section before filing the ticket.
 9 | 
10 | 
11 | 🌴 **Visual Studio Code Version :** [ VERSION_HERE ] 
12 | 🌴 **Code Settings Sync Version :** [ VERSION_HERE ] 
13 | 🌴 **Standard or Insiders :** [ _here_ ] 
14 | 🌴 **Portable or Installed :** [ _here_ ] 
15 | 🌴 **OSS or Official Build :** [ _here_ ] 
16 | 🌴 **Operating System :** [ VERSION_HERE ] 
17 | 🌴 **Occurs On:** [Upload / Download / Help Configuring ]
18 | 🌴 **Proxy Enabled:** [ Yes / No ]
19 | 🌴 **Gist Id:** [ ID_HERE ]
20 | 
21 | 
22 | 
23 | 📰 **To Reproduce**
24 | Steps to reproduce the behavior:
25 | 1. Go to '...'
26 | 2. Click on '....'
27 | 3. Scroll down to '....'
28 | 4. See error
29 | 
30 | 💪 **Expected behavior**
31 | A clear and concise description of what you expected to happen.
32 | 
33 | 📺 **Console Error Log** 
34 | If applicable, add screenshots or paste the console log from developer console of VSCode (Help Menu > Developer Tool - Console Tab). 
35 | 
36 | 📺  **Additional context**
37 | Add any other context about the problem here.
38 | 


--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE/---feature-request.md:
--------------------------------------------------------------------------------
 1 | ---
 2 | name: "\U0001F4A1 Feature request"
 3 | about: "I have a suggestion (and might want to implement myself \U0001F642)! "
 4 | 
 5 | ---
 6 | 
 7 | 💡 **Is your feature request related to a problem? Please describe.**
 8 | A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
 9 | 
10 | 💡 **Describe the solution you'd like**
11 | A clear and concise description of what you want to happen.
12 | 
13 | 
14 | 💡 **Additional context**
15 | Add any other context or screenshots about the feature request here.
16 | 


--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE/--support-question.md:
--------------------------------------------------------------------------------
 1 | ---
 2 | name: "❓ Support Question"
 3 | about: " \U0001F6D1 If you have a question \U0001F4AC, please check out our support
 4 |   channels! "
 5 | 
 6 | ---
 7 | 
 8 | I will recommend to discuss about project over the slack.
 9 | 
10 | You can join the community from the following link:
11 | 
12 | https://join.slack.com/t/codesettingssync/shared_invite/enQtNzQyODMzMzI5MDQ3LWNmZjVkZjE2YTg0MzY1Y2EyYzVmYThmNzg2YjZkNjhhZWY3ZTEzN2I3ZTAxMjkwNWU0ZjMyZGFhMjdiZDI3ODU
13 | 
14 | Feel free to open ticket here.
15 | 


--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | out
2 | node_modules
3 | package-lock.json
4 | *.vsix
5 | *.lock
6 | *.log
7 | 


--------------------------------------------------------------------------------
/.travis.yml:
--------------------------------------------------------------------------------
 1 | language: node_js
 2 | node_js:
 3 |   - node
 4 | before_install:
 5 |   - npm install npm@latest -g
 6 |   - npm install node-pre-gyp
 7 |   - npm i --no-optional
 8 |   - npm dedupe
 9 |   - npm up
10 |   - npm install -g vsce
11 | 
12 | install:
13 |   - vsce package
14 | script:
15 |   - npm run tslint-check
16 |   - npm run compile
17 |  
18 | deploy:
19 |   provider: script
20 |   script: bash scripts/deploy.sh
21 |   on:
22 |     branch: master
23 |     
24 |     
25 | notifications:
26 |   slack:
27 |     secure: R9xqGEFOQHI+6oaiGz7+4zOErZydinpg+7tQd0xaCy8qRswcVtPT+yX6RAgsEGS+RXaOoVz9N534XJIdLXyW/nN8vD898Dwq4nf+lUMiRuuPrvCLk2rh50FFDRi6aoeCv1qxeNswf2ahNnFILV4FE8t2r/+P2vYeB/pJ8DChFTlz3+mjXuawH9cW+hLR6DOC7307dLHGq6SuhIvfyuysu6ZU9tyKVRWW/BsQgmz+PtlfA1HGAVzg0Yc8KhGGuWdSZydOcSisUWX2f8+BL1HGPXbzlMqJinb7z7k8HJVjddH88Tfa2Jphs/rxoKr+enlqqeCNdCIlRQ8p093bkw9B2Rmo2/xYfc2w0JnzEK5q8EibsDapn2V7hcNCd2hO1MuXTus4L43ZBxoJZoQfiyYPIYRTgo4mCT4B4AKzOuvaNZ/sXYN6I7UTwY1iXzUW3ntdn49tWJmFdUuDNwj+im+X89xdRqUWVaJD9cfgG9070MIle2CFFMGL0OXLwJRnoj3ySOLuJVThL68qVoX5E4NZn4HDdMKtmf7h8P36BUG2zmuq6n48NEiLlWgLd8HWXZEIkVnBytnnQ/+5Bg5ZZsHCEpIjcPGPuUXa5WpJlZdcqDvaQJ7NRjckDYhGqHz7AqLxMWnwcOAPWrWOYnKymh38ncGgznfjR3JSy8ZBXMU6xDw=
28 |   email:
29 |     on_success: never
30 |     on_failure: always
31 |   
32 | env:
33 |   secure: RoVxN0hSdHzA5TEA/zW5gJcAXP7qPjLSOjWTeu+m2Ooo3XgxiHSsnld7pTMU/fDYsBjAlakiv1cLU505iBIp8I7aBb7oW2rKs/YlXHeSlYUpYpwWj7/ploiY2Zg2L+s1Ojfg3X/tAaR0jSRYsffPSlZJmUL+Wom+R5pDx64nCh2hJ2egu04Co+3QSQySWrcFbUrT7phJPVW5OHYQDc+68i9QS9ptPzuKgGu1CxsYphMPsiA0EPzTUu88hPPov7UvvE7NmDnq94ObgQbkVrpMrnQFuid0EGHAeN05/RpBhQHQ7s6/eZTPIj7EAISXDMzu0X6XsbYKNLwWyjKxdpUYyl7lUFqUQYlmCk05mgH1392LqJdpYkm6NFscdU4LHiHUzpOaOBNzpewl18eQbXq/iJei6AiEw7MxwhbCh6Kg6EzhPRpBX2Pv53EBHhcSvzgkl66lau/a7HFSnQ6G4DNl6A8akD2CV9+r2r2uAj80ZBfSPIa5lTmWoJvuOw33pW2YwJn5GMyoMXydewjPCMHLIx+PNd57M1LToVdOlbrKGL1u9Xrb0FHV2DKLYslW21Dr0LCoP+NwcRcnM2R/lUKXIh5MSKLnk31jMgXrgezr+1eaOBZwo+X0gfj5YNWSA71sUXrg9AbCIP74zyUyowbkm3b1HwVFu8JtcP/ON8xqC6A=
34 | 


--------------------------------------------------------------------------------
/.vscode/launch.json:
--------------------------------------------------------------------------------
 1 | // A launch configuration that compiles the extension and then opens it inside a new window
 2 | {
 3 | 	"version": "0.1.0",
 4 | 	"configurations": [{
 5 | 			"name": "Launch Extension",
 6 | 			"type": "extensionHost",
 7 | 			"request": "launch",
 8 | 			"runtimeExecutable": "${execPath}",
 9 | 			"args": ["--extensionDevelopmentPath=${workspaceRoot}"],
10 | 			"stopOnEntry": false,
11 | 			"sourceMaps": true,
12 | 			"outFiles": ["${workspaceRoot}/out/**/*.js"],
13 | 			"preLaunchTask": "build"
14 | 		},
15 | 		{
16 | 			"name": "Launch Tests",
17 | 			"type": "extensionHost",
18 | 			"request": "launch",
19 | 			"runtimeExecutable": "${execPath}",
20 | 			"args": ["--extensionDevelopmentPath=${workspaceRoot}", "--extensionTestsPath=${workspaceRoot}/out/test"],
21 | 			"stopOnEntry": false,
22 | 			"sourceMaps": true,
23 | 			"outFiles": ["${workspaceRoot}/out/test/**/*.js"],
24 | 			"preLaunchTask": "test_build"
25 | 		}
26 | 	]
27 | }
28 | 


--------------------------------------------------------------------------------
/.vscode/settings.json:
--------------------------------------------------------------------------------
 1 | // Place your settings in this file to overwrite default and user settings.
 2 | {
 3 | 	"files.exclude": {
 4 | 		"out": false // set this to true to hide the "out" folder with the compiled JS files
 5 | 	},
 6 | 	"search.exclude": {
 7 | 		"out": true // set this to false to include "out" folder in search results
 8 | 	}
 9 | }
10 | 


--------------------------------------------------------------------------------
/.vscode/tasks.json:
--------------------------------------------------------------------------------
 1 | {
 2 |   // See https://go.microsoft.com/fwlink/?LinkId=733558
 3 |   // for the documentation about the tasks.json format
 4 |   "version": "2.0.0",
 5 |   "tasks": [
 6 |     {
 7 |       "label": "build",
 8 |       "type": "shell",
 9 |       "command": "npm",
10 |       "args": ["run", "compile", "--loglevel", "silent"],
11 |       "problemMatcher": "$tsc-watch"
12 |     },
13 |     {
14 |       "label": "test_build",
15 |       "type": "shell",
16 |       "command": "tsc",
17 |       "args": ["-p", "./"]
18 |     }
19 |   ]
20 | }
21 | 


--------------------------------------------------------------------------------
/.vscodeignore:
--------------------------------------------------------------------------------
 1 | .vscode/**
 2 | typings/**
 3 | out/test/**
 4 | test/**
 5 | src/**
 6 | **/*.map
 7 | .gitignore
 8 | tsconfig.json
 9 | vsc-extension-quickstart.md
10 | node_modules
11 | .github
12 | debug.log
13 | scripts
14 | tslint.json
15 | webpack.config.js
16 | *.log


--------------------------------------------------------------------------------
/CODE_OF_CONDUCT.md:
--------------------------------------------------------------------------------
 1 | # Contributor Covenant Code of Conduct
 2 | 
 3 | ## Our Pledge
 4 | 
 5 | In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation.
 6 | 
 7 | ## Our Standards
 8 | 
 9 | Examples of behavior that contributes to creating a positive environment include:
10 | 
11 | * Using welcoming and inclusive language
12 | * Being respectful of differing viewpoints and experiences
13 | * Gracefully accepting constructive criticism
14 | * Focusing on what is best for the community
15 | * Showing empathy towards other community members
16 | 
17 | Examples of unacceptable behavior by participants include:
18 | 
19 | * The use of sexualized language or imagery and unwelcome sexual attention or advances
20 | * Trolling, insulting/derogatory comments, and personal or political attacks
21 | * Public or private harassment
22 | * Publishing others' private information, such as a physical or electronic address, without explicit permission
23 | * Other conduct which could reasonably be considered inappropriate in a professional setting
24 | 
25 | ## Our Responsibilities
26 | 
27 | Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior.
28 | 
29 | Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful.
30 | 
31 | ## Scope
32 | 
33 | This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers.
34 | 
35 | ## Enforcement
36 | 
37 | Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at shanalikhan@hotmail.com. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately.
38 | 
39 | Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership.
40 | 
41 | ## Attribution
42 | 
43 | This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version]
44 | 
45 | [homepage]: http://contributor-covenant.org
46 | [version]: http://contributor-covenant.org/version/1/4/
47 | 


--------------------------------------------------------------------------------
/CONTRIBUTING.md:
--------------------------------------------------------------------------------
 1 | # Contributing
 2 | 
 3 | ## Wiki
 4 | 
 5 | See (and edit!) our public Wiki.
 6 | 
 7 | https://github.com/shanalikhan/code-settings-sync/wiki/Contributing
 8 | 
 9 | I encourage you to create new pages or make helpful edits to all parts of the wiki. Try to ask before making major changes to pages you didn't create, but just do whatever you think is best. Feel free to make a user page and collect your notes there so everyone can learn.
10 | 
11 | ## Slack
12 | 
13 | Join our public Slack:
14 | 
15 | <a href="https://join.slack.com/t/codesettingssync/shared_invite/enQtNzQyODMzMzI5MDQ3LWNmZjVkZjE2YTg0MzY1Y2EyYzVmYThmNzg2YjZkNjhhZWY3ZTEzN2I3ZTAxMjkwNWU0ZjMyZGFhMjdiZDI3ODU">
16 | <img src="https://shanalikhan.github.io/img/slack.PNG" alt="Drawing" style="width: 50px;"/>
17 | </a>
18 | 
19 | If you need any help or want someone to set up the workspace with you and get you stepping through code in your editor, make some noise in #contributors. Don't be afraid to speak up!
20 | 
21 | If you are looking forward to solve issues, you can select any issue you want but it would be great if you start with these issues, for these issues I will be specifically asking for help :
22 | 
23 | https://github.com/shanalikhan/code-settings-sync/labels/good%20first%20issue
24 | 
25 | https://github.com/shanalikhan/code-settings-sync/labels/PR-Welcome
26 | 
27 | 
28 | ## Setup Extension Locally
29 | 
30 | ```
31 | git clone https://github.com/shanalikhan/code-settings-sync.git
32 | cd code-settings-sync
33 | npm install
34 | code .
35 | ```
36 | 
37 | Checkout the lastest version branch available and Hit `F5` to run Settings Sync in debug mode.
38 | 
39 | Git and Node should be enough to run this extension. Execute the commands above and you will be able to run the extension in Code.
40 | 
41 | **PR Base Branch Guideline:**
42 | PR usually dont merge into `master` branch but in the version name branch like `v3.1.0`.
43 | You will always see the next version branch if which current work is being done by me and other contributors. You need to set base branch and create PR for that branch.
44 | 
45 | ## Run Tests
46 | Make sure the changes you made are not breaking the tests cases!
47 | 
48 | All the test cases are in `/test` directory. Add new test cases if application with your PR.
49 | 
50 | To run the tests, 
51 | 1. `cd path/to/code-settings-sync && npm install && code .`
52 | 2. `Launch Extension` by pressing `F5`
53 | 3. From Debugger menu, start `Launch Tests`
54 | 
55 | 
56 | ## Bounty Programs - Fix and Earn !
57 | 
58 | There might be several issue present on the [IssueHunt](https://issuehunt.io/repos/47984369) from which you can earn money by fixing those issues. Feel free to start!
59 | 
60 | 
61 | 
62 | ## Financial contributions
63 | 
64 | You can contribute me financially by two ways:
65 | 
66 | 1. Sending donation directly to my PayPal
67 | 
68 | [<img src="https://www.paypalobjects.com/en_US/i/btn/btn_donateCC_LG.gif">](https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=4W3EWHHBSYMM8&lc=IE&item_name=Code%20Settings%20Sync&item_number=visual%20studio%20code%20settings%20sync&currency_code=USD&bn=PP%2dDonationsBF%3abtn_donate_SM%2egif%3aNonHosted)
69 | 
70 | 2. If you looking forward to add some special features for your company, for this I also welcome financial contributions in full transparency on my [open collective](https://opencollective.com/code-settings-sync).
71 | 
72 | [![issuehunt-image](https://github.com/BoostIO/issuehunt-materials/blob/master/issuehunt-badge@1x.png?raw=true)](https://issuehunt.io/repos/47984369)
73 | 
74 | 
75 | ## Credits
76 | 
77 | ### Contributors
78 | 
79 | Thank you to all the people who have already contributed to Settings Sync!
80 | <a href="https://github.com/shanalikhan/code-settings-sync/graphs/contributors"><img src="https://opencollective.com/code-settings-sync/contributors.svg?width=890" /></a>
81 | 
82 | ### Backers
83 | 
84 | Thank you to all our backers! [[Become a backer](https://opencollective.com/code-settings-sync#backer)]
85 | 
86 | <a href="https://opencollective.com/code-settings-sync#backers" target="_blank"><img src="https://opencollective.com/code-settings-sync/backers.svg?width=890"></a>
87 | 
88 | ### Sponsors
89 | 
90 | Thank you to all our sponsors! (please ask your company to also support this open source project by [becoming a sponsor](https://opencollective.com/code-settings-sync/order/3849#))
91 | 


--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
 1 | The MIT License (MIT)
 2 | 
 3 | Copyright (c) 2015 Shan Khan
 4 | 
 5 | Permission is hereby granted, free of charge, to any person obtaining a copy
 6 | of this software and associated documentation files (the "Software"), to deal
 7 | in the Software without restriction, including without limitation the rights
 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 | 
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 | 
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 | 
23 | 


--------------------------------------------------------------------------------
/PULL_REQUEST_TEMPLATE.md:
--------------------------------------------------------------------------------
 1 | #### Short description of what this resolves:
 2 | 
 3 | 
 4 | #### Changes proposed in this pull request:
 5 | 
 6 | -
 7 | -
 8 | -
 9 | 
10 | **Fixes**: #
11 | 
12 | #### How Has This Been Tested?
13 | <!--- Please describe in detail how you tested your changes. -->
14 | <!--- Include details of your testing environment, tests ran to see how -->
15 | <!--- your change affects other areas of the code, etc. -->
16 | 
17 | #### Screenshots (if appropriate):
18 | 
19 | 
20 | #### Checklist:
21 | <!--- Go over all the following points, and put an `x` in all the boxes that apply. -->
22 | <!--- If you're unsure about any of these, don't hesitate to ask. We're here to help! -->
23 | - [ ] I have read the [contribution](https://github.com/shanalikhan/code-settings-sync/blob/master/CONTRIBUTING.md#setup-extension-locally) guidelines.
24 | - [ ] My change requires a change to the documentation and GitHub Wiki.
25 | - [ ] I have updated the documentation and Wiki accordingly.
26 | 


--------------------------------------------------------------------------------
/configs/webpack.config.js:
--------------------------------------------------------------------------------
 1 | "use strict";
 2 | 
 3 | const path = require("path");
 4 | const { CleanWebpackPlugin } = require("clean-webpack-plugin");
 5 | 
 6 | /** @type WebpackOptions */
 7 | const config = {
 8 |   stats: {
 9 |     warningsFilter: /Critical dependency: the request of a dependency is an expression/
10 |   },
11 |   target: "node",
12 |   entry: "./src/extension.ts",
13 |   output: {
14 |     filename: "extension.js",
15 |     path: path.resolve(__dirname, "../out"),
16 |     libraryTarget: "commonjs2",
17 |     devtoolModuleFilenameTemplate: "file:///[absolute-resource-path]"
18 |   },
19 |   resolve: {
20 |     extensions: [".ts", ".js"],
21 |     alias: {
22 |       deepmerge$: path.resolve(
23 |         __dirname,
24 |         "../node_modules/deepmerge/dist/umd.js"
25 |       )
26 |     }
27 |   },
28 |   module: {
29 |     rules: [
30 |       {
31 |         test: /\.ts$/,
32 |         exclude: /node_modules/,
33 |         loader: "ts-loader"
34 |       }
35 |     ]
36 |   },
37 |   externals: {
38 |     vscode: "commonjs vscode",
39 |     "vscode-fsevents": "commonjs vscode-fsevents",
40 |     "original-fs": "commonjs original-fs"
41 |   },
42 |   plugins: [new CleanWebpackPlugin()]
43 | };
44 | 
45 | module.exports = config;
46 | 


--------------------------------------------------------------------------------
/configs/webpack.development.config.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 | 
3 | const merge = require('webpack-merge');
4 | const common = require('./webpack.config.js');
5 | 
6 | module.exports = merge(common, {
7 |     mode: 'development',
8 |     devtool: 'source-map'
9 | });


--------------------------------------------------------------------------------
/configs/webpack.production.config.js:
--------------------------------------------------------------------------------
 1 | "use strict";
 2 | 
 3 | const merge = require('webpack-merge');
 4 | const common = require('./webpack.config.js');
 5 | 
 6 | module.exports = merge(common, {
 7 |     mode: 'production',
 8 |     optimization: {
 9 |         minimize: true
10 |       }
11 | });


--------------------------------------------------------------------------------
/debug.log:
--------------------------------------------------------------------------------
1 | [1214/215632:ERROR:stream_listen_socket.cc(143)] send failed: WSAGetLastError()==0
2 | 


--------------------------------------------------------------------------------
/images/existing-gist.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/shanalikhan/code-settings-sync/eb332ba5e8180680e613e94be89119119c5638d1/images/existing-gist.png


--------------------------------------------------------------------------------
/images/login-with-github.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/shanalikhan/code-settings-sync/eb332ba5e8180680e613e94be89119119c5638d1/images/login-with-github.png


--------------------------------------------------------------------------------
/images/logo-128.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/shanalikhan/code-settings-sync/eb332ba5e8180680e613e94be89119119c5638d1/images/logo-128.png


--------------------------------------------------------------------------------
/images/logo-256.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/shanalikhan/code-settings-sync/eb332ba5e8180680e613e94be89119119c5638d1/images/logo-256.png


--------------------------------------------------------------------------------
/images/logo-512.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/shanalikhan/code-settings-sync/eb332ba5e8180680e613e94be89119119c5638d1/images/logo-512.png


--------------------------------------------------------------------------------
/images/logo.sketch:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/shanalikhan/code-settings-sync/eb332ba5e8180680e613e94be89119119c5638d1/images/logo.sketch


--------------------------------------------------------------------------------
/images/slack.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/shanalikhan/code-settings-sync/eb332ba5e8180680e613e94be89119119c5638d1/images/slack.png


--------------------------------------------------------------------------------
/images/white-cloud.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/shanalikhan/code-settings-sync/eb332ba5e8180680e613e94be89119119c5638d1/images/white-cloud.png


--------------------------------------------------------------------------------
/install_local.txt:
--------------------------------------------------------------------------------
1 | npm install
2 | vsce package
3 | code --install-extension code-settings-sync-3.2.5.vsix
4 | 


--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
  1 | {
  2 |   "name": "code-settings-sync",
  3 |   "displayName": "Settings Sync",
  4 |   "description": "Synchronize Settings, Snippets, Themes, File Icons, Launch, Keybindings, Workspaces and Extensions Across Multiple Machines Using GitHub Gist.",
  5 |   "version": "3.4.3",
  6 |   "icon": "images/logo-128.png",
  7 |   "publisher": "Shan",
  8 |   "author": {
  9 |     "name": "Shan Khan",
 10 |     "url": "http://shanalikhan.github.io",
 11 |     "email": "shanalikhan@hotmail.com"
 12 |   },
 13 |   "homepage": "https://shanalikhan.github.io",
 14 |   "galleryBanner": {
 15 |     "color": "#3B4859",
 16 |     "theme": "dark"
 17 |   },
 18 |   "engines": {
 19 |     "vscode": "^1.35.1"
 20 |   },
 21 |   "badges": [
 22 |     {
 23 |       "url": "https://vsmarketplacebadge.apphb.com/version/Shan.code-settings-sync.svg",
 24 |       "description": "Latest Version",
 25 |       "href": "https://marketplace.visualstudio.com/items?itemName=Shan.code-settings-sync"
 26 |     },
 27 |     {
 28 |       "url": "https://vsmarketplacebadge.apphb.com/installs/Shan.code-settings-sync.svg",
 29 |       "description": "Total Downloads",
 30 |       "href": "https://marketplace.visualstudio.com/items?itemName=Shan.code-settings-sync"
 31 |     },
 32 |     {
 33 |       "url": "https://vsmarketplacebadge.apphb.com/rating/Shan.code-settings-sync.svg",
 34 |       "description": "Ratings",
 35 |       "href": "https://marketplace.visualstudio.com/items?itemName=Shan.code-settings-sync"
 36 |     },
 37 |     {
 38 |       "url": "https://img.shields.io/badge/Join%20Community-slack-green.svg",
 39 |       "description": "Join Slack Community",
 40 |       "href": "https://join.slack.com/t/codesettingssync/shared_invite/enQtNzQyODMzMzI5MDQ3LWNmZjVkZjE2YTg0MzY1Y2EyYzVmYThmNzg2YjZkNjhhZWY3ZTEzN2I3ZTAxMjkwNWU0ZjMyZGFhMjdiZDI3ODU"
 41 |     }
 42 |   ],
 43 |   "repository": {
 44 |     "type": "git",
 45 |     "url": "https://github.com/shanalikhan/code-settings-sync.git"
 46 |   },
 47 |   "bugs": {
 48 |     "url": "https://github.com/shanalikhan/code-settings-sync/issues",
 49 |     "email": "shanalikhan@hotmail.com"
 50 |   },
 51 |   "categories": [
 52 |     "Other"
 53 |   ],
 54 |   "keywords": [
 55 |     "vscode-sync",
 56 |     "vscode-settings-sync",
 57 |     "code-settings-sync",
 58 |     "settings-sync",
 59 |     "workspace-sync",
 60 |     "multi-root ready"
 61 |   ],
 62 |   "extensionKind": "ui",
 63 |   "activationEvents": [
 64 |     "*"
 65 |   ],
 66 |   "main": "./out/extension.js",
 67 |   "contributes": {
 68 |     "commands": [
 69 |       {
 70 |         "command": "extension.HowSettings",
 71 |         "title": "%cmd.howSetting.title%"
 72 |       },
 73 |       {
 74 |         "command": "extension.downloadSettings",
 75 |         "title": "%cmd.downloadSettings.title%"
 76 |       },
 77 |       {
 78 |         "command": "extension.updateSettings",
 79 |         "title": "%cmd.updateSettings.title%"
 80 |       },
 81 |       {
 82 |         "command": "extension.resetSettings",
 83 |         "title": "%cmd.resetSettings.title%"
 84 |       },
 85 |       {
 86 |         "command": "extension.otherOptions",
 87 |         "title": "%cmd.otherOptions.title%"
 88 |       }
 89 |     ],
 90 |     "keybindings": [
 91 |       {
 92 |         "key": "alt+shift+u",
 93 |         "command": "extension.updateSettings"
 94 |       },
 95 |       {
 96 |         "key": "alt+shift+d",
 97 |         "command": "extension.downloadSettings"
 98 |       }
 99 |     ],
100 |     "configuration": {
101 |       "properties": {
102 |         "sync.gist": {
103 |           "type": "string",
104 |           "default": "",
105 |           "description": "%ext.config.gist%"
106 |         },
107 |         "sync.autoDownload": {
108 |           "type": "boolean",
109 |           "default": false,
110 |           "description": "%ext.config.autoDownload%"
111 |         },
112 |         "sync.autoUpload": {
113 |           "type": "boolean",
114 |           "default": false,
115 |           "description": "%ext.config.autoUpload%"
116 |         },
117 |         "sync.forceDownload": {
118 |           "type": "boolean",
119 |           "default": false,
120 |           "description": "%ext.config.forceDownload%"
121 |         },
122 |         "sync.forceUpload": {
123 |           "type": "boolean",
124 |           "default": false,
125 |           "description": "%ext.config.forceUpload%"
126 |         },
127 |         "sync.quietSync": {
128 |           "type": "boolean",
129 |           "default": false,
130 |           "description": "%ext.config.quietSync%"
131 |         },
132 |         "sync.removeExtensions": {
133 |           "type": "boolean",
134 |           "default": true,
135 |           "description": "%ext.config.removeExtensions%"
136 |         },
137 |         "sync.syncExtensions": {
138 |           "type": "boolean",
139 |           "default": true,
140 |           "description": "%ext.config.syncExtensions%"
141 |         }
142 |       },
143 |       "title": "%ext.config.title%"
144 |     }
145 |   },
146 |   "scripts": {
147 |     "vscode:prepublish": "npm run tslint-check && webpack --config configs/webpack.production.config.js",
148 |     "compile": "webpack --config configs/webpack.development.config.js",
149 |     "watch": "webpack --config configs/webpack.development.config.js --watch",
150 |     "postinstall": "node ./node_modules/vscode/bin/install",
151 |     "tslint-check": "tslint -c ./tslint.json ./src/**/*.ts ./src/*.ts",
152 |     "format": "prettier --write './src/**/*.ts'",
153 |     "test": "npm run tslint-check && tsc -p ./ && mocha --recursive \"./out/test/**/*.js\""
154 |   },
155 |   "devDependencies": {
156 |     "@types/chai": "4.2.1",
157 |     "@types/express": "^4.16.1",
158 |     "@types/lodash": "^4.14.123",
159 |     "@types/node-fetch": "^2.3.3",
160 |     "@types/fs-extra": "^8.0.0",
161 |     "@types/mocha": "^5.2.6",
162 |     "@types/node": "^12.0.9",
163 |     "@types/recursive-readdir": "^2.2.0",
164 |     "chai": "^4.2.0",
165 |     "clean-webpack-plugin": "^3.0.0",
166 |     "mocha": "^6.0.2",
167 |     "prettier": "^1.16.4",
168 |     "ts-loader": "^5.3.3",
169 |     "tslint": "^5.15.0",
170 |     "tslint-plugin-prettier": "^2.0.1",
171 |     "typescript": "^3.4.1",
172 |     "vscode": "^1.1.33",
173 |     "webpack": "^4.29.6",
174 |     "webpack-cli": "^3.3.0",
175 |     "webpack-merge": "^4.2.1"
176 |   },
177 |   "dependencies": {
178 |     "@octokit/rest": "^16.23.2",
179 |     "adm-zip": "^0.4.13",
180 |     "const": "^1.0.0",
181 |     "express": "^4.16.4",
182 |     "fs-extra": "^8.0.1",
183 |     "https-proxy-agent": "^2.2.1",
184 |     "lockfile": "^1.0.4",
185 |     "lodash": "^4.17.15",
186 |     "node-fetch": "^2.5.0",
187 |     "recursive-readdir": "^2.2.2",
188 |     "temp": "^0.9.0",
189 |     "vscode-chokidar": "^2.1.6"
190 |   }
191 | }
192 | 


--------------------------------------------------------------------------------
/package.nls.hu.json:
--------------------------------------------------------------------------------
  1 | {
  2 |   "cmd.downloadSettings.error.removeExtFail": "Fordította: Képes eltávolítani bizonyos fájlokat.",
  3 |   "cmd.downloadSettings.error.unableSave": "Fordította: Nem lehet menteni kiterjesztését a beállítások, a fájl.",
  4 |   "cmd.downloadSettings.info.downloaded": "Fordította: Letöltés Teljes.",
  5 |   "cmd.downloadSettings.info.gotLatestVersion": "Fordította: már a legújabb verzió a mentett beállítások.",
  6 |   "cmd.downloadSettings.info.readdingOnline": "Fordította: Olvasási Beállítások Online.",
  7 |   "cmd.downloadSettings.title": "Fordította: Letöltési Beállítások",
  8 |   "cmd.howSetting.title": "Fordította: Hogyan Kell Beállítani",
  9 |   "cmd.otherOptions.customizedSync": "Fordította: Add Egyéni Fordította: Fájl elérési útját",
 10 |   "cmd.otherOptions.customizedSync.done": "Fordította: {0} regisztrálták.",
 11 |   "cmd.otherOptions.customizedSync.placeholder": "Adjon meg egy abszolút elérési útvonalát, előfordulhat, hogy a feltöltött fájl.",
 12 |   "cmd.otherOptions.customizedSync.prompt": "(ex. /path/to/.eslintrc) feltöltésre kerül, illetve a letöltött fájl a megadott elérési utat.",
 13 |   "cmd.otherOptions.downloadCustomFile": "Fordította: Import Egyéni Fordította: Fájlt munkaterület",
 14 |   "cmd.otherOptions.downloadCustomFile.done": "A letöltött {0}.",
 15 |   "cmd.otherOptions.downloadCustomFile.placeholder": "Válassza ki a kívánt fájlt kell letölteni, hogy a gyökér a munkaterület, amelyen dolgozik.",
 16 |   "cmd.otherOptions.downloadSetting": "Fordította: Letöltési Beállítások a Nyilvános GIST",
 17 |   "cmd.otherOptions.editLocalSetting": "Fordította: Edit Kiterjesztését Helyi Beállítások",
 18 |   "cmd.otherOptions.error.toggleFail": "Fordította: Nem Kapcsoló.",
 19 |   "cmd.otherOptions.joinCommunity": "Fordította: Csatlakozzon Közösségi",
 20 |   "cmd.otherOptions.openIssue": "Fordította: Nyitott Kérdés",
 21 |   "cmd.otherOptions.openSettingsPage": "Fordította: Nyissa Meg A Beállításokat",
 22 |   "cmd.otherOptions.preserve": "Fordította: Megőrizni A Beállítást, Hogy Ne Felülbírálja Letöltés Után",
 23 |   "cmd.otherOptions.preserve.info.done1": "Fordította: Kész. {0} érték el lesz távolítva a beállítások.json letöltése után.",
 24 |   "cmd.otherOptions.preserve.info.done2": "Fordította: Kész. Kiterjesztését fogja {0}: {1} a beállítást.json letöltése után.",
 25 |   "cmd.otherOptions.preserve.placeholder": "Adja meg bármelyik Gombot, a beállítások.json megőrizni.",
 26 |   "cmd.otherOptions.preserve.prompt": "Példa: Írd http.proxy' => tárolja a számítógép proxy, illetve felülírása , ha meghatározott üres, akkor távolítsa el a proxy.",
 27 |   "cmd.otherOptions.quietSync.off": "Fordította: Összefoglaló jelenik meg, amikor letöltés/feltöltés.",
 28 |   "cmd.otherOptions.quietSync.on": "Fordította: állapotsor után fogjuk frissíteni letöltés/feltöltés.",
 29 |   "cmd.otherOptions.releaseNotes": "Fordította: Kiadási Megjegyzések",
 30 |   "cmd.otherOptions.shareSetting": "Fordította: Share Beállítások a Nyilvános GIST",
 31 |   "cmd.otherOptions.shareSetting.beforeConfirm": "Fordította: Ez eltávolítja az aktuális GIST-ben, illetve feltöltési beállítások az új állami LÉNYEGET. Akarod, hogy folytassam?",
 32 |   "cmd.otherOptions.title": "Fordította: Speciális Beállítások",
 33 |   "cmd.otherOptions.toggleAutoDownload": "Fordította: Kapcsoló Automatikus Letöltés Bekapcsoláskor",
 34 |   "cmd.otherOptions.toggleAutoDownload.off": "Fordította: Automatikus Letöltés KI van kapcsolva után VSCode Indítási.",
 35 |   "cmd.otherOptions.toggleAutoDownload.on": "Fordította: Automatikus Letöltés bekapcsolása után VSCode Indítási.",
 36 |   "cmd.otherOptions.toggleAutoUpload": "Fordította: Kapcsoló Automatikus Feltöltés A Beállítások Módosítása",
 37 |   "cmd.otherOptions.toggleAutoUpload.off": "Fordította: Automatikus feltöltés Beállítás Módosítása Kapcsolva.",
 38 |   "cmd.otherOptions.toggleAutoUpload.on": "Fordította: Automatikus feltöltés Beállítás Módosítása Kapcsolva. Ez akkor lép érvénybe, amikor az újraindítás.",
 39 |   "cmd.otherOptions.toggleForceDownload": "Fordította: Kapcsoló Erő Letöltés",
 40 |   "cmd.otherOptions.toggleForceDownload.off": "Fordította: Erő Letöltés Ki Van Kapcsolva.",
 41 |   "cmd.otherOptions.toggleForceDownload.on": "Fordította: Erő Letöltés Kapcsolva.",
 42 |   "cmd.otherOptions.toggleForceUpload": "Fordította: Kapcsoló Erő Feltöltés",
 43 |   "cmd.otherOptions.toggleForceUpload.off": "Fordította: Erő Feltöltés Ki Van Kapcsolva.",
 44 |   "cmd.otherOptions.toggleForceUpload.on": "Fordította: Erő Feltöltés Kapcsolva.",
 45 |   "cmd.otherOptions.toggleSummaryPage": "Fordította: Kapcsoló Show-Gyűjtő Oldal Feltöltés/Letöltés",
 46 |   "cmd.otherOptions.triggerReset": "Fordította: akarod, hogy állítsa vissza a beállításokat ?",
 47 |   "cmd.otherOptions.warning.tokenNotRequire": "Fordította: Beállítások a Szinkronizálás nem fogja megkérdezni a GitHub Token mostantól.",
 48 |   "cmd.resetSettings.info.resetting": "Fordította: Újraindítani A Beállításokat.",
 49 |   "cmd.resetSettings.info.settingClear": "Fordította: Beállítások Törölve.",
 50 |   "cmd.resetSettings.title": "Fordította: Hosszabbító Beállítások Visszaállítása",
 51 |   "cmd.updateSettings.error.gistNotSave": "Fordította: LÉNYEGET NEM MENTETT",
 52 |   "cmd.updateSettings.error.newGistCreateFail": "Fordította: Nem sikerült létrehozni Lényeget.",
 53 |   "cmd.updateSettings.error.readGistFail": "Fordította: LÉNYEGET ID: {0} NEM OLVASTAM.",
 54 |   "cmd.updateSettings.info.gotLatestVersion": "Fordította: Már feltöltötte a mentett beállítások legújabb verzióját.",
 55 |   "cmd.updateSettings.info.newGistCreated": "Fordította: Új lényeget létre.",
 56 |   "cmd.updateSettings.info.readding": "Fordította: Olvasási Beállítások, majd a Fájlokat.",
 57 |   "cmd.updateSettings.info.shareGist": "Fordította: oszd meg az Id más kiterjesztését a felhasználók számára, hogy megosszák a beállításokat.",
 58 |   "cmd.updateSettings.info.uploadCanceled": "Fordította: Feltöltési Folyamat Elmarad.",
 59 |   "cmd.updateSettings.info.uploading": "Fordította: Feltöltés/Frissítése A Beállításokat A GitHub.",
 60 |   "cmd.updateSettings.info.uploadingDone": "Fordította: Feltöltés Befejeződött. GIST-ID: {0}. Kérem másolja használja ID más gépek beállítások letöltése.",
 61 |   "cmd.updateSettings.info.uploadingFile": "Fordította: Fájlok Feltöltése Adatokkal.",
 62 |   "cmd.updateSettings.info.uploadingSuccess": "Fordította: Feltöltött Sikeresen.",
 63 |   "cmd.updateSettings.title": "Fordította: Frissítés/Feltöltési Beállítások",
 64 |   "cmd.updateSettings.warning.OSNotSupported": "Fordította: Pragma OS érték a {0} nem támogatott a sor {1}",
 65 |   "cmd.updateSettings.warning.noToken": "Fordította: Állítsa be a GitHub Token vagy letiltása 'downloadPublicGist a helyi Szinkronizálási beállítások fájlt.",
 66 |   "common.action.donate": "Adományozni Most",
 67 |   "common.action.joinCommunity": "Csatlakozzon Közösségi",
 68 |   "common.action.openExtPage": "Nyitva Kiterjesztését Oldal",
 69 |   "common.action.openExtTutorial": "Nyílt Bemutató",
 70 |   "common.action.releaseNotes": "Kiadási Megjegyzések",
 71 |   "common.action.support": "Támogatja Ezt A Projektet",
 72 |   "common.action.writeReview": "Írd Felülvizsgálat",
 73 |   "common.button.no": "Nem",
 74 |   "common.button.yes": "Igen",
 75 |   "common.error.canNotSave": "Fordította: Nem lehet Menteni a Beállításokat. Kérjük, győződjön meg arról, hogy érvényes JSON beállítások.json fájlt. (például: Nem záró vesszőt)",
 76 |   "common.error.connection": "Fordította: Internet Nincs Csatlakoztatva, vagy Nem tud Csatlakozni a GitHub. Kivétel Bejelentkezett Konzol",
 77 |   "common.error.gistNotSave": "Fordította: Lényeget Nem Mentette Meg.",
 78 |   "common.error.invalidGistId": "Fordította: Érvénytelen Lényeget Id Lépett. Ellenőrizze a lényeget: https://gist.github.com/<your_userName>/<gist_id>.",
 79 |   "common.error.invalidToken": "Fordította: Érvénytelen, Lejárt/GitHub Token. Kérjük, ezáltal új token a hatókörök említette a readme-t. Kivétel Bejelentkezett Konzol.",
 80 |   "common.error.message": "Fordította: Hiba Naplózásra Konzol (Súgó menü > Kapcsoló Fejlesztő Eszközök).",
 81 |   "common.error.tokenNotSave": "Fordította: Token Nem Mentette Meg.",
 82 |   "common.info.donate": "Fordította: tetszik ez a kiterjesztés? Hogy az írásban felülvizsgálatot, vagy küld egy adomány? ",
 83 |   "common.info.excludeFile": "Fordította: kizárhat bármely fájl/mappa a feltöltés, illetve a beállítások letöltéséhez.",
 84 |   "common.info.gistSaved": "Fordította: Lényeget Elmentett",
 85 |   "common.info.initAutoUpload": "Fordította: Automatikus Feltöltés Kezdeményező A {0} Másodperc.",
 86 |   "common.info.installed": "Fordította: Beállítások létre, köszönöm, telepítése!",
 87 |   "common.info.needHelp": "Fordította: Segítség konfigurálása ez a kiterjesztés?",
 88 |   "common.info.setToken": "Fordította: Most beállíthatjuk, Hogy a GitHub token kézzel a `syncLocalSettings.json`",
 89 |   "common.info.tokenSaved": "Fordította: Token Elmentett",
 90 |   "common.info.updateTo": "Fordította: Frissített v{0}",
 91 |   "common.info.updating": "Fordította: Frissítése Folyamatban Kérem Várjon.",
 92 |   "common.placeholder.enterGistId": "Adja Meg Lényeget Id",
 93 |   "common.placeholder.enterGithubAccessToken": "Írja Be A GitHub Személyes Access Token",
 94 |   "common.placeholder.multipleGist": "Lényeg a Neve (például: Személyes Beállítások)",
 95 |   "common.prompt.enterGistId": "Adja meg Lényeget Id a korábban feltöltött beállítások. Azt is beállíthatja kézzel a kódot a beállítások (fordította.gist). Nyomja meg az [Enter] vagy az [Esc] lemondani.",
 96 |   "common.prompt.enterGithubAccessToken": "Te kézzel is hozzáadhat egy token (Felhasználói Mappa/syncLocalSettings.json). Nyomja meg az [Enter] vagy az [Esc] lemondani.",
 97 |   "common.prompt.gistForceUpload": "Fordította: A feltöltés felváltja a GitHub Gist beállításait. Fontolja meg a beállítások letöltését vagy egy kényszerű feltöltést. Még mindig erőteljesen szeretne feltölteni?",
 98 |   "common.prompt.gistNewer": "Fordította: A Gist beállításai megváltoztak az utóbbi letöltés óta. Egyébként feltölti a jelenlegi helyi beállításait a Gistbe?",
 99 |   "common.prompt.multipleGist": "Lehetővé teszi, hogy azonosítsa a beállítások ha több lényeget.",
100 |   "common.prompt.restartCode": "Akarod, hogy újra alkalmazni fájlokat, konfigurációk?",
101 |   "ext.config.autoDownload": "Állítsa igaz, hogy az Automatikus Letöltés beállításai kód kezdeni. [Kód Újraindítás Szükséges]",
102 |   "ext.config.autoDownload.name": "Automatikus Letöltés",
103 |   "ext.config.autoUpload": "Állítsa igaz, hogy az Automatikus Feltöltés a beállítások módosítása. [Kód Újraindítás Szükséges]",
104 |   "ext.config.autoUpload.name": "Automatikus Feltöltés",
105 |   "ext.config.forceDownload": "Állítsa be, hogy igaz, ha szeretné letölteni a beállítások akkor is, ha a legújabb beállítások.",
106 |   "ext.config.forceDownload.name": "Erő Letöltés",
107 |   "ext.config.forceUpload": "Állítsa be, hogy igaz, ha a feltölteni kívánt a beállítások akkor is, ha a LÉNYEGET újabb beállításokat.",
108 |   "ext.config.forceUpload.name": "Erő Feltöltés",
109 |   "ext.config.gist": "A GitHub LÉNYEGET ID a Beállítások Szinkronizálása.",
110 |   "ext.config.gist.name": "Lényeg ID",
111 |   "ext.config.gist.placeholder": "Adja meg Lényeget ID",
112 |   "ext.config.host": "Állítsa be, hogy a GitHub Enterprise fogadó, ha használni szeretnénk, GHE.",
113 |   "ext.config.lastDownload": "Beállítások a Szinkronizálás utolsó letöltés dátuma. Állítsa be, mint üres, ha kézzel szeretné hit le.",
114 |   "ext.config.lastUpload": "Beállítások a Szinkronizálás utolsó feltöltés időpontja. Állítsa be, mint üres, ha kézzel szeretné hit le.",
115 |   "ext.config.pathPrefix": "Állítsa be, hogy a GitHub Enterprise API előtag, ha használni szeretnénk, GHE. Általában '/api/v3'. Csak akkor kell használni, ha az állomás épülete.",
116 |   "ext.config.quietSync": "Ha értéke true, akkor megmutatja az eredményt az állapotsoron, ahelyett, gyűjtő oldal.",
117 |   "ext.config.quietSync.name": "Csendes Fordította:",
118 |   "ext.config.removeExtensions": "Állítsa be, hogy hamis, ha nem szeretné, hogy távolítsa el a kiterjesztések letöltése közben.",
119 |   "ext.config.removeExtensions.name": "Távolítsa El A Fájlokat",
120 |   "ext.config.syncExtensions": "Állítsa be, hogy hamis, ha nem akarod, hogy a feltöltés/letöltés a fájlokat.",
121 |   "ext.config.syncExtensions.name": "Fordította: Z",
122 |   "ext.config.title": "Kód Beállítások A Szinkronizálás Konfigurációs Beállítások",
123 |   "ext.globalConfig.askGistDescription.name": "Kérdezd Meg Lényeget Név",
124 |   "ext.globalConfig.autoUploadDelay.name": "Automatikus Feltöltés Késedelem",
125 |   "ext.globalConfig.autoUploadDelay.placeholder": "Adja meg az összeget másodperc késleltetés az automatikus feltöltés",
126 |   "ext.globalConfig.downloadPublicGist.name": "Letöltés Nyilvános Gist",
127 |   "ext.globalConfig.gistDescription.name": "Lényeg Leírás",
128 |   "ext.globalConfig.gistDescription.placeholder": "Adja Meg Lényeget Leírás",
129 |   "ext.globalConfig.githubEnterpriseUrl.name": "A GitHub Enterprise URL (opcionális)",
130 |   "ext.globalConfig.githubEnterpriseUrl.placeholder": "Írja be a GitHub Enterprise URL",
131 |   "ext.globalConfig.hostName.name": "Hálózati név (nem kötelező)",
132 |   "ext.globalConfig.hostName.placeholder": "Adja Meg Hostname",
133 |   "ext.globalConfig.ignoreExtensions.name": "Figyelmen Kívül Fájlokat",
134 |   "ext.globalConfig.ignoreExtensions.placeholder": "Adjon meg egy kiterjesztés soronként (teljes név)",
135 |   "ext.globalConfig.ignoreUploadFiles.placeholder": "Adjon meg egy fájl soronként",
136 |   "ext.globalConfig.ignoreUploadFolders.name": "Figyelmen Kívül Mappák",
137 |   "ext.globalConfig.ignoredUploadFolders.placeholder": "Adjon meg egy mappát, soronként",
138 |   "ext.globalConfig.openTokenLink.name": "Nyitva Token Link",
139 |   "ext.globalConfig.supportedFileExtensions.name": "Támogatott Fájl Kiterjesztések",
140 |   "ext.globalConfig.supportedFileExtensions.placeholder": "Adja meg a fájl kiterjesztését soronként",
141 |   "ext.globalConfig.token.name": "Access Token",
142 |   "ext.globalConfig.token.placeholder": "Adja Meg Token"
143 | }


--------------------------------------------------------------------------------
/package.nls.ja.json:
--------------------------------------------------------------------------------
  1 | {
  2 |   "ext.config.title": "Code Settings Sync の設定",
  3 |   "ext.config.gist": "Settings Sync で使用する GitHub Gist ID",
  4 |   "ext.config.lastUpload": "Settings Sync の最新アップロード日。手動でダウンロードする場合は空にしてください",
  5 |   "ext.config.lastDownload": "Settings Sync の最新ダウンロード日。手動でダウンロードする場合は空にしてください",
  6 |   "ext.config.autoDownload": "VSCode 起動時に設定を自動でダウンロードします。[VSCode の再起動が必要です]",
  7 |   "ext.config.autoUpload": "設定変更時に自動でアップロードします。[VSCode の再起動が必要です]",
  8 |   "ext.config.forceDownload": "最新の設定が既に存在する場合でも強制的に設定をダウンロードします",
  9 |   "ext.config.forceUpload": "Gist に新しい設定が存在する場合でも強制的に設定をアップロードします",
 10 |   "ext.config.host": "GHE を使用する場合は GitHub Enterprise のホストを設定してください",
 11 |   "ext.config.pathPrefix": "GHE を使用する場合は GitHub Enterprise API のプレフィックスを設定してください。通常は '/api/v3' です。ホストが設定されている場合にのみ使用されます",
 12 |   "ext.config.quietSync": "結果をサマリーページではなくステータスバーに表示します",
 13 |   "ext.config.removeExtensions": "ダウンロード中に拡張機能を削除します",
 14 |   "ext.config.syncExtensions": "拡張機能をアップロード・ダウンロードします",
 15 |   "cmd.howSetting.title": "Sync: Settings Sync の設定方法を参照",
 16 |   "cmd.updateSettings.title": "Sync: アップデート・アップロードの設定",
 17 |   "cmd.updateSettings.info.uploading": "Sync: GitHub の設定をアップデート・アップロードしています",
 18 |   "cmd.updateSettings.info.uploadingFile": "Sync: ファイルのデータをアップロードしています",
 19 |   "cmd.updateSettings.info.uploadingDone": "Sync: アップロード完了。Gist ID: {0}。設定をダウンロードするには、この ID を他のマシンにコピーして使用してください",
 20 |   "cmd.updateSettings.info.uploadingSuccess": "Sync: アップロード完了",
 21 |   "cmd.updateSettings.info.shareGist": "Sync: 設定を他のユーザに共有するには ID を共有してください",
 22 |   "cmd.updateSettings.info.readding": "Sync: 設定を拡張機能を読み込んでいます",
 23 |   "cmd.updateSettings.info.uploadCanceled": "Sync: アップロードがキャンセルされました",
 24 |   "cmd.updateSettings.info.newGistCreated": "Sync: 新規 Gist を作成しました",
 25 |   "cmd.updateSettings.info.gotLatestVersion": "Sync: 保存済み設定の最新バージョンはすでにアップロードされています。",
 26 |   "cmd.updateSettings.warning.noToken": "Sync: GitHub トークンを設定するか、ローカルの同期設定ファイルから 'downloadPublicGist' を無効にしてください",
 27 |   "cmd.updateSettings.warning.OSNotSupported": "Sync: {1} 行目の値 {0} はサポートされていません",
 28 |   "cmd.updateSettings.error.newGistCreateFail": "Sync: Gist を作成できません",
 29 |   "cmd.updateSettings.error.readGistFail": "Sync: Gist ID: {0} を読み込めません",
 30 |   "cmd.updateSettings.error.gistNotSave": "Sync: Gist が保存されていません",
 31 |   "cmd.downloadSettings.title": "Sync: 設定をダウンロード",
 32 |   "cmd.downloadSettings.info.downloaded": "Sync: ダウンロードが完了しました",
 33 |   "cmd.downloadSettings.info.readdingOnline": "Sync: 設定をオンラインから読み込んでいます",
 34 |   "cmd.downloadSettings.info.gotLatestVersion": "Sync: 既に最新の設定に更新されています",
 35 |   "cmd.downloadSettings.error.removeExtFail": "Sync: 削除できない拡張機能があります",
 36 |   "cmd.downloadSettings.error.unableSave": "Sync: 拡張機能の設定ファイルを保存できません",
 37 |   "cmd.resetSettings.title": "Sync: 拡張機能の設定を初期化",
 38 |   "cmd.resetSettings.info.resetting": "Sync: 設定をリセットしています",
 39 |   "cmd.resetSettings.info.settingClear": "Sync: 設定をクリアしました",
 40 |   "cmd.otherOptions.title": "Sync: 高度なオプション",
 41 |   "cmd.otherOptions.openSettingsPage": "Sync: 設定を開く",
 42 |   "cmd.otherOptions.editLocalSetting": "Sync: 拡張機能のローカル設定を編集",
 43 |   "cmd.otherOptions.shareSetting": "Sync: Public Gist の共有設定",
 44 |   "cmd.otherOptions.shareSetting.beforeConfirm": "Sync: 現在の Gist が削除され、新規の Public Gist に設定がアップロードされます。続けますか?",
 45 |   "cmd.otherOptions.downloadSetting": "Sync: Public Gist から設定をダウンロードします",
 46 |   "cmd.otherOptions.toggleForceDownload": "Sync: 強制ダウンロード機能の切り替え",
 47 |   "cmd.otherOptions.toggleForceDownload.on": "Sync: 強制的にダウンロードします",
 48 |   "cmd.otherOptions.toggleForceDownload.off": "Sync: 強制的にダウンロードしません",
 49 |   "cmd.otherOptions.toggleForceUpload": "Sync: 強制アップロード機能の切り替え",
 50 |   "cmd.otherOptions.toggleForceUpload.on": "Sync: 強制的にアップロードします",
 51 |   "cmd.otherOptions.toggleForceUpload.off": "Sync: 強制的にアップロードしません",
 52 |   "cmd.otherOptions.toggleAutoUpload": "Sync: 設定変更時の自動アップロード機能の切り替え",
 53 |   "cmd.otherOptions.toggleAutoUpload.on": "Sync: 設定変更時に設定を自動アップロードします。[VSCode の再起動が必要です]",
 54 |   "cmd.otherOptions.toggleAutoUpload.off": "Sync: 設定変更時に設定を自動アップロードしません",
 55 |   "cmd.otherOptions.toggleAutoDownload": "Sync: 起動時の自動ダウンロード機能の切り替え",
 56 |   "cmd.otherOptions.toggleAutoDownload.on": "Sync: VSCode を起動時に設定を自動ダウンロードする",
 57 |   "cmd.otherOptions.toggleAutoDownload.off": "Sync: VSCode を起動時に設定を自動ダウンロードしない",
 58 |   "cmd.otherOptions.toggleSummaryPage": "Sync: アップロード・ダウンロード時の概要画面表示の切り替え",
 59 |   "cmd.otherOptions.preserve": "Sync: ダウンロード後の上書きを禁止する設定を保持する",
 60 |   "cmd.otherOptions.preserve.placeholder": "Sync: 設定を保持するために settings.json から任意のキーを入力してください",
 61 |   "cmd.otherOptions.preserve.prompt": "Sync: 例: 'http.proxy' と入力することでこのコンピュータのプロキシを保存して上書きします。空の場合プロキシが削除されます",
 62 |   "cmd.otherOptions.preserve.info.done1": "Sync: 同期完了。ダウンロード後に {0} の値は settings.json から削除されます",
 63 |   "cmd.otherOptions.preserve.info.done2": "Sync: 同期完了。ダウンロード後に拡張機能は {0}:{1} を settings.json に保持します",
 64 |   "cmd.otherOptions.customizedSync": "Sync: カスタム同期ファイルのパスを追加",
 65 |   "cmd.otherOptions.customizedSync.placeholder": "Sync: 追加でアップロードするファイルの絶対パスを入力してください",
 66 |   "cmd.otherOptions.customizedSync.prompt": "(例: /path/to/.eslintrc) は指定されたパスにアップロード・ダウンロードされます",
 67 |   "cmd.otherOptions.customizedSync.done": "Sync: {0} が登録されています",
 68 |   "cmd.otherOptions.downloadCustomFile": "Sync: カスタム同期ファイルをワークスペースに挿入します",
 69 |   "cmd.otherOptions.downloadCustomFile.placeholder": "Sync: 作業中のワークスペースのルートにダウンロードするファイルを選択してください",
 70 |   "cmd.otherOptions.downloadCustomFile.done": "Sync: {0} をダウンロードしました",
 71 |   "cmd.otherOptions.joinCommunity": "Sync: コミュニティに参加",
 72 |   "cmd.otherOptions.openIssue": "Sync: Issue を開く",
 73 |   "cmd.otherOptions.releaseNotes": "Sync: リリースノート",
 74 |   "cmd.otherOptions.quietSync.on": "Sync: ステータスバーはダウンロード・アップロード時に更新されます.",
 75 |   "cmd.otherOptions.quietSync.off": "Sync: ダウンロード・アップロード時に概要が表示されます",
 76 |   "cmd.otherOptions.warning.tokenNotRequire": "Sync: Settings Sync は今後 GitHub トークンを要求しません",
 77 |   "cmd.otherOptions.error.toggleFail": "Sync: 切り替えができません",
 78 |   "cmd.otherOptions.triggerReset": "Sync: 設定をリセットしますか?",
 79 |   "common.info.installed": "Sync: 設定を生成しました。インストールありがとうございます!",
 80 |   "common.info.needHelp": "Sync: この拡張機能の設定に関するヘルプが必要ですか?",
 81 |   "common.info.excludeFile": "Sync: 任意のアップロードするのファイル・フォルダとダウンロードする設定を除外",
 82 |   "common.info.updating": "Sync: アップデート中です。お待ちください",
 83 |   "common.info.initAutoUpload": "Sync: 自動アップロードは {0} 秒以内に開始されました",
 84 |   "common.info.setToken": "Sync: 'syncLocalSettings.json' 内で手動で GitHub トークンを設定できます",
 85 |   "common.info.tokenSaved": "Sync: トークンが保存されました",
 86 |   "common.info.gistSaved": "Sync: Gist は保存されました",
 87 |   "common.info.updateTo": "Sync: v{0} にアップデートしました",
 88 |   "common.info.donate": "Sync: この拡張機能は気に入りましたか?レビューを書いたり寄付を送ったりしませんか?",
 89 |   "common.error.message": "Sync: コンソールのログインエラー ([ヘルプ] > [開発者ツールの切り替え])",
 90 |   "common.error.connection": "Sync: インターネットに接続されていないため GitHub に接続できません。コンソールにログが記録されています",
 91 |   "common.error.canNotSave": "Sync: 設定を保存できません。settings.json が有効であるか確認してください (例: 末尾のカンマは不要です)",
 92 |   "common.error.invalidToken": "Sync: GitHub トークンは無効または期限切れです。README に記載されているスコープで新規トークンを発行してください。コンソールにログが記録されています",
 93 |   "common.error.invalidGistId": "Sync: Gist ID が無効です。Gist を確認してください: https://gist.github.com/<your_userName>/<gist_id>",
 94 |   "common.error.tokenNotSave": "Sync: トークンが保存されていません",
 95 |   "common.error.gistNotSave": "Sync: Gist が保存されていません",
 96 |   "common.action.openExtPage": "拡張機能のページを開く",
 97 |   "common.action.openExtTutorial": "ターミナルを開く",
 98 |   "common.action.releaseNotes": "リリースノート",
 99 |   "common.action.writeReview": "レビューを書く",
100 |   "common.action.support": "このプロジェクトを支援",
101 |   "common.action.joinCommunity": "コミュニティに参加する",
102 |   "common.action.donate": "寄付する",
103 |   "common.placeholder.enterGithubAccessToken": "GitHub Personl Access Token を入力してください",
104 |   "common.placeholder.enterGistId": "Gist ID を入力してください",
105 |   "common.placeholder.multipleGist": "Gist Name (例: Personal Settings)",
106 |   "common.prompt.multipleGist": "Gist が複数ある場合、個別に設定できます",
107 |   "common.prompt.enterGistId": "以前にアップロードした設定から Gist ID を入力してください。VSCode Settings (sync.gist) で手動で設定することもできます。キャンセルするには [Enter] または [Esc] キーを押してください",
108 |   "common.prompt.enterGithubAccessToken": "手動でトークンを追加することができます (User Folder/syncLocalSettings.json)。キャンセルするには [Enter] または [Esc] キーを押してください",
109 |   "common.prompt.restartCode": "拡張機能と設定を適用するためにリロードしますか?",
110 |   "common.prompt.gistForceUpload": "Sync: アップロードにより、GitHub Gistの設定が置き換えられます。 設定をダウンロードするか、強制アップロードを行うことを検討してください。 それでも強制的にアップロードしますか?",
111 |   "common.prompt.gistNewer": "Sync: Gistの設定は、最後にダウンロードしてから変更されています。 とにかく、現在のローカル設定をGistにアップロードしますか?",
112 |   "common.button.no": "番号",
113 |   "common.button.yes": "はい",
114 |   "ext.globalConfig.token.name": "アクセストークン",
115 |   "ext.globalConfig.token.placeholder": "トークンを入力してください",
116 |   "ext.globalConfig.githubEnterpriseUrl.name": "GitHub Enterprise の URL (オプション)",
117 |   "ext.globalConfig.githubEnterpriseUrl.placeholder": "GitHub Enterprise の URL を入力してください",
118 |   "ext.globalConfig.ignoreUploadFolders.name": "フォルダを無視",
119 |   "ext.globalConfig.ignoredUploadFolders.placeholder": "1行に1つのフォルダ名を入力してください",
120 |   "ext.globalConfig.ignoreExtensions.name": "拡張子を無視",
121 |   "ext.globalConfig.ignoreExtensions.placeholder": "1行に1つの拡張機能名をフルネームで入力してください",
122 |   "ext.globalConfig.hostName.name": "ホスト名 (オプション)",
123 |   "ext.globalConfig.hostName.placeholder": "ホスト名を入力してください",
124 |   "ext.globalConfig.ignoreUploadFiles.name": "ファイルを無視",
125 |   "ext.globalConfig.ignoreUploadFiles.placeholder": "1行に1つのファイル名を入力してください",
126 |   "ext.globalConfig.supportedFileExtensions.name": "サポートされているファイルの拡張子",
127 |   "ext.globalConfig.supportedFileExtensions.placeholder": "1行に1つの拡張子を入力してください",
128 |   "ext.globalConfig.gistDescription.name": "Gist の説明",
129 |   "ext.globalConfig.gistDescription.placeholder": "Gist の説明を入力してください",
130 |   "ext.globalConfig.autoUploadDelay.name": "自動アップロードの遅延",
131 |   "ext.globalConfig.autoUploadDelay.placeholder": "自動アップロードの遅延時間 (秒) を入力してください",
132 |   "ext.globalConfig.askGistDescription.name": "Gist Name の確認",
133 |   "ext.globalConfig.downloadPublicGist.name": "公開 Gist のダウンロード",
134 |   "ext.globalConfig.openTokenLink.name": "トークンのリンクを開く",
135 |   "ext.config.gist.name": "Gist ID",
136 |   "ext.config.gist.placeholder": "Gist ID を入力してください",
137 |   "ext.config.autoDownload.name": "自動ダウンロード",
138 |   "ext.config.autoUpload.name": "自動アップロード",
139 |   "ext.config.forceDownload.name": "強制ダウンロード",
140 |   "ext.config.forceUpload.name": "強制アップロード",
141 |   "ext.config.quietSync.name": "出力抑制同期",
142 |   "ext.config.removeExtensions.name": "拡張機能の削除",
143 |   "ext.config.syncExtensions.name": "拡張機能の同期"
144 | }
145 | 


--------------------------------------------------------------------------------
/package.nls.json:
--------------------------------------------------------------------------------
  1 | {
  2 |   "ext.config.title": "Code Settings Sync Configuration Settings",
  3 |   "ext.config.gist": "GitHub GIST ID for Settings Sync.",
  4 |   "ext.config.lastUpload": "Settings Sync last upload date. Set it as empty if you want to manually hit download.",
  5 |   "ext.config.lastDownload": "Settings Sync last download date. Set it as empty if you want to manually hit download.",
  6 |   "ext.config.autoDownload": "Set it true to Auto Download the settings on code start. [Code Restart Required]",
  7 |   "ext.config.autoUpload": "Set it true to Auto Upload on the settings change. [Code Restart Required]",
  8 |   "ext.config.forceDownload": "Set it to true if you want to download the settings even when you have the latest settings.",
  9 |   "ext.config.forceUpload": "Set it to true if you want to upload the settings even when the GIST has newer settings.",
 10 |   "ext.config.host": "Set it to your GitHub Enterprise host if you want to use GHE.",
 11 |   "ext.config.pathPrefix": "Set it to your GitHub Enterprise API prefix if you want to use GHE. Normally '/api/v3'. Only used when host is set.",
 12 |   "ext.config.quietSync": "When set to true, will show the result in status bar instead of summary page.",
 13 |   "ext.config.removeExtensions": "Set it to false if you don't want to remove extensions while downloading.",
 14 |   "ext.config.syncExtensions": "Set it to false if you don't want to upload/download the extensions.",
 15 |   "cmd.howSetting.title": "Sync: How To Configure",
 16 |   "cmd.updateSettings.title": "Sync: Update/Upload Settings",
 17 |   "cmd.updateSettings.info.uploading": "Sync: Uploading/Updating Your Settings In GitHub.",
 18 |   "cmd.updateSettings.info.uploadingFile": "Sync: Uploading Files Data.",
 19 |   "cmd.updateSettings.info.uploadingDone": "Sync: Upload Complete. GIST ID: {0}. Please copy and use this ID in other machines to download settings.",
 20 |   "cmd.updateSettings.info.uploadingSuccess": "Sync: Uploaded Successfully.",
 21 |   "cmd.updateSettings.info.shareGist": "Sync: Share the Id with other extension users to share the settings.",
 22 |   "cmd.updateSettings.info.readding": "Sync: Reading Settings and Extensions.",
 23 |   "cmd.updateSettings.info.uploadCanceled": "Sync: Upload Process Cancelled.",
 24 |   "cmd.updateSettings.info.newGistCreated": "Sync: New gist created.",
 25 |   "cmd.updateSettings.info.gotLatestVersion": "Sync: You have already uploaded the latest version of saved settings.",
 26 |   "cmd.updateSettings.warning.noToken": "Sync: Set GitHub Token or disable 'downloadPublicGist' from local Sync settings file.",
 27 |   "cmd.updateSettings.warning.OSNotSupported": "Sync Pragma OS value {0} not supported at line {1}",
 28 |   "cmd.updateSettings.error.newGistCreateFail": "Sync: Unable to create Gist.",
 29 |   "cmd.updateSettings.error.readGistFail": "Sync:  GIST ID: {0} UNABLE TO READ.",
 30 |   "cmd.updateSettings.error.gistNotSave": "Sync: GIST NOT SAVED",
 31 |   "cmd.downloadSettings.title": "Sync: Download Settings",
 32 |   "cmd.downloadSettings.info.downloaded": "Sync: Download Complete.",
 33 |   "cmd.downloadSettings.info.readdingOnline": "Sync: Reading Settings Online.",
 34 |   "cmd.downloadSettings.info.gotLatestVersion": "Sync: You already have the latest version of saved settings.",
 35 |   "cmd.downloadSettings.error.removeExtFail": "Sync: Unable to remove some extensions.",
 36 |   "cmd.downloadSettings.error.unableSave": "Sync: Unable to save extension settings file.",
 37 |   "cmd.resetSettings.title": "Sync: Reset Extension Settings",
 38 |   "cmd.resetSettings.info.resetting": "Sync: Resetting Your Settings.",
 39 |   "cmd.resetSettings.info.settingClear": "Sync: Settings Cleared.",
 40 |   "cmd.otherOptions.title": "Sync: Advanced Options",
 41 |   "cmd.otherOptions.openSettingsPage": "Sync: Open Settings",
 42 |   "cmd.otherOptions.editLocalSetting": "Sync: Edit Extension Local Settings",
 43 |   "cmd.otherOptions.shareSetting": "Sync: Share Settings with Public GIST",
 44 |   "cmd.otherOptions.shareSetting.beforeConfirm": "Sync: This will remove current GIST and upload settings on new public GIST. Do you want to continue?",
 45 |   "cmd.otherOptions.downloadSetting": "Sync: Download Settings from Public GIST",
 46 |   "cmd.otherOptions.toggleForceDownload": "Sync: Toggle Force Download",
 47 |   "cmd.otherOptions.toggleForceDownload.on": "Sync: Force Download Turned On.",
 48 |   "cmd.otherOptions.toggleForceDownload.off": "Sync: Force Download Turned Off.",
 49 |   "cmd.otherOptions.toggleForceUpload": "Sync: Toggle Force Upload",
 50 |   "cmd.otherOptions.toggleForceUpload.on": "Sync: Force Upload Turned On.",
 51 |   "cmd.otherOptions.toggleForceUpload.off": "Sync: Force Upload Turned Off.",
 52 |   "cmd.otherOptions.toggleAutoUpload": "Sync: Toggle Auto-Upload On Settings Change",
 53 |   "cmd.otherOptions.toggleAutoUpload.on": "Sync: Auto upload on Setting Change Turned On. This will take effect after restart.",
 54 |   "cmd.otherOptions.toggleAutoUpload.off": "Sync: Auto upload on Setting Change Turned Off.",
 55 |   "cmd.otherOptions.toggleAutoDownload": "Sync: Toggle Auto-Download On Startup",
 56 |   "cmd.otherOptions.toggleAutoDownload.on": "Sync: Auto Download turned ON upon VSCode Startup.",
 57 |   "cmd.otherOptions.toggleAutoDownload.off": "Sync: Auto Download turned OFF upon VSCode Startup.",
 58 |   "cmd.otherOptions.toggleSummaryPage": "Sync: Toggle Show Summary Page On Upload/Download",
 59 |   "cmd.otherOptions.preserve": "Sync: Preserve Setting To Stop Override After Download",
 60 |   "cmd.otherOptions.preserve.placeholder": "Enter any Key from settings.json to preserve.",
 61 |   "cmd.otherOptions.preserve.prompt": "Example: Write 'http.proxy' => store this computer proxy and overwrite it , if set empty it will remove proxy.",
 62 |   "cmd.otherOptions.preserve.info.done1": "Sync: Done. {0} value will be removed from settings.json after downloading.",
 63 |   "cmd.otherOptions.preserve.info.done2": "Sync: Done. Extension will keep {0}: {1} in setting.json after downloading.",
 64 |   "cmd.otherOptions.customizedSync": "Sync: Add Custom Sync File path",
 65 |   "cmd.otherOptions.customizedSync.placeholder": "Enter an absolute path of the additional uploaded file.",
 66 |   "cmd.otherOptions.customizedSync.prompt": "(ex. /path/to/.eslintrc) will be uploaded and downloaded to the specified path.",
 67 |   "cmd.otherOptions.customizedSync.done": "Sync: {0} has been registered.",
 68 |   "cmd.otherOptions.downloadCustomFile": "Sync: Import Custom Sync File to workspace",
 69 |   "cmd.otherOptions.downloadCustomFile.placeholder": "Select the file you want to download to the root of the workspace you are working on.",
 70 |   "cmd.otherOptions.downloadCustomFile.done": "Downloaded {0}.",
 71 |   "cmd.otherOptions.joinCommunity": "Sync: Join Community",
 72 |   "cmd.otherOptions.openIssue": "Sync: Open Issue",
 73 |   "cmd.otherOptions.releaseNotes": "Sync: Release Notes",
 74 |   "cmd.otherOptions.quietSync.on": "Sync: Status bar will be updated upon download/upload.",
 75 |   "cmd.otherOptions.quietSync.off": "Sync: Summary will be shown upon download/upload.",
 76 |   "cmd.otherOptions.warning.tokenNotRequire": "Sync: Settings Sync will not ask for GitHub Token from now on.",
 77 |   "cmd.otherOptions.error.toggleFail": "Sync: Unable to Toggle.",
 78 |   "cmd.otherOptions.triggerReset": "Sync: Do you want to reset the settings ?",
 79 |   "common.info.installed": "Sync: Settings created, thank you for installing!",
 80 |   "common.info.needHelp": "Sync: Need Help configuring this extension?",
 81 |   "common.info.excludeFile": "Sync: You can exclude any file/folder for upload and settings for download.",
 82 |   "common.info.updating": "Sync: Updating In Progress… Please Wait.",
 83 |   "common.info.initAutoUpload": "Sync: Auto Upload Initiating In {0} Seconds.",
 84 |   "common.info.setToken": "Sync: Now You can set your GitHub token manually in `syncLocalSettings.json`",
 85 |   "common.info.tokenSaved": "Sync: Token Saved",
 86 |   "common.info.gistSaved": "Sync: Gist Saved",
 87 |   "common.info.updateTo": "Sync: Updated to v{0}",
 88 |   "common.info.donate": "Sync: Do you like this extension? How about writing a review or sending a donation? ;)",
 89 |   "common.error.message": "Sync: Error Logged In Console (Help menu > Toggle Developer Tools).",
 90 |   "common.error.connection": "Sync: Internet Not Connected or Unable to Connect to GitHub. Exception Logged in Console",
 91 |   "common.error.canNotSave": "Sync: Unable to Save Settings. Please make sure you have valid JSON settings.json file. (e.g.: No trailing commas)",
 92 |   "common.error.invalidToken": "Sync: Invalid/Expired GitHub Token. Please generate new token with scopes mentioned in readme. Exception Logged in Console.",
 93 |   "common.error.invalidGistId": "Sync: Invalid Gist Id Entered. Verify your gist: https://gist.github.com/<your_userName>/<gist_id>.",
 94 |   "common.error.tokenNotSave": "Sync: Token Not Saved.",
 95 |   "common.error.gistNotSave": "Sync: Gist Not Saved.",
 96 |   "common.action.openExtPage": "Open Extension Page",
 97 |   "common.action.openExtTutorial": "Open Tutorial",
 98 |   "common.action.releaseNotes": "Release Notes",
 99 |   "common.action.writeReview": "Write Review",
100 |   "common.action.support": "Support This Project",
101 |   "common.action.joinCommunity": "Join Community",
102 |   "common.action.donate": "Donate Now",
103 |   "common.placeholder.enterGithubAccessToken": "Enter GitHub Personal Access Token",
104 |   "common.placeholder.enterGistId": "Enter Gist Id",
105 |   "common.placeholder.multipleGist": "Gist Name (e.g.: Personal Settings)",
106 |   "common.prompt.multipleGist": "Allows you to identify the settings if you have multiple gist.",
107 |   "common.prompt.enterGistId": "Enter Gist Id from previously uploaded settings. You can also set manually in code settings (sync.gist). Press [Enter] or [Esc] to cancel.",
108 |   "common.prompt.enterGithubAccessToken": "You also manually add a token (User Folder/syncLocalSettings.json). Press [Enter] or [Esc] to cancel.",
109 |   "common.prompt.restartCode": "Do you want to reload to apply extensions and configurations?",
110 |   "common.prompt.gistForceUpload": "Sync: The upload will replace the settings in GitHub Gist. Consider downloading the settings or doing a forced upload. Do you still want to upload forcefully?",
111 |   "common.prompt.gistNewer": "Sync: The settings in the Gist have changed since you last downloaded them.  Do you want to upload your current local settings to the Gist anyway?",
112 |   "common.button.no": "No",
113 |   "common.button.yes": "Yes",
114 |   "ext.globalConfig.token.name": "Access Token",
115 |   "ext.globalConfig.token.placeholder": "Enter Token",
116 |   "ext.globalConfig.githubEnterpriseUrl.name": "GitHub Enterprise URL (optional)",
117 |   "ext.globalConfig.githubEnterpriseUrl.placeholder": "Enter GitHub Enterprise URL",
118 |   "ext.globalConfig.ignoreUploadFolders.name": "Ignored Folders",
119 |   "ext.globalConfig.ignoredUploadFolders.placeholder": "Enter one folder per line",
120 |   "ext.globalConfig.ignoreExtensions.name": "Ignored Extensions",
121 |   "ext.globalConfig.ignoreExtensions.placeholder": "Enter one extension per line (full name)",
122 |   "ext.globalConfig.hostName.name": "Hostname (optional)",
123 |   "ext.globalConfig.hostName.placeholder": "Enter Hostname",
124 |   "ext.globalConfig.ignoreUploadFiles.name": "Ignored Files",
125 |   "ext.globalConfig.ignoreUploadFiles.placeholder": "Enter one file per line",
126 |   "ext.globalConfig.supportedFileExtensions.name": "Supported File Extensions",
127 |   "ext.globalConfig.supportedFileExtensions.placeholder": "Enter one file extension per line",
128 |   "ext.globalConfig.gistDescription.name": "Gist Description",
129 |   "ext.globalConfig.gistDescription.placeholder": "Enter Gist Description",
130 |   "ext.globalConfig.autoUploadDelay.name": "Auto Upload Delay",
131 |   "ext.globalConfig.autoUploadDelay.placeholder": "Enter the amount of seconds to delay auto-upload",
132 |   "ext.globalConfig.askGistDescription.name": "Ask Gist Name",
133 |   "ext.globalConfig.downloadPublicGist.name": "Download Public Gist",
134 |   "ext.globalConfig.openTokenLink.name": "Open Token Link",
135 |   "ext.config.gist.name": "Gist ID",
136 |   "ext.config.gist.placeholder": "Enter Gist ID",
137 |   "ext.config.autoDownload.name": "Auto Download",
138 |   "ext.config.autoUpload.name": "Auto Upload",
139 |   "ext.config.forceDownload.name": "Force Download",
140 |   "ext.config.forceUpload.name": "Force Upload",
141 |   "ext.config.quietSync.name": "Quiet Sync",
142 |   "ext.config.removeExtensions.name": "Remove Extensions",
143 |   "ext.config.syncExtensions.name": "Sync Extensions"
144 | }
145 | 


--------------------------------------------------------------------------------
/package.nls.ko.json:
--------------------------------------------------------------------------------
  1 | {
  2 |     "ext.config.title": "Code Settings Sync 설정",
  3 |     "ext.config.gist": "Settings Sync에 사용할 GitHub GIST ID.",
  4 |     "ext.config.lastDownload": "Settings Sync의 마지막 다운로드 날짜입니다. 수동으로 다운받길 원하면 비워두세요.",
  5 |     "ext.config.lastUpload": "Settings Sync의 마지막 업로드 날짜입니다. 수동으로 다운받길 원하면 비워두세요.",
  6 |     "ext.config.autoDownload": "VSCode가 실행될 때 설정을 자동으로 다운로드합니다. [코드 재시작 필요]",
  7 |     "ext.config.autoUpload": "설정이 변경되면 변경된 설정을 자동으로 업로드합니다. [코드 재시작 필요]",
  8 |     "ext.config.forceDownload": "로컬 설정의 버전에 무관하게 강제로 설정을 다운로드합니다.",
  9 |     "ext.config.forceUpload": "Gist에 존재하는 설정 버전과 무관하게 강제로 현재 설정을 업로드합니다.",
 10 |     "ext.config.host": "GHE를 사용하려면 GitHub Enterprise 호스트를 설정하십시오.",
 11 |     "ext.config.pathPrefix": "GHE를 사용하기 위해서는 GitHub Enterprise API의 접두사가 필요합니다. 일반적으로 '/api/v3'를 사용합니다. 호스트가 설정되어있을 때만 사용됩니다.",
 12 |     "ext.config.quietSync": "설정시 결과를 알림창 대신 상태바에 표시합니다.",
 13 |     "ext.config.askGistDescription": "생성시 Gist 이름을 묻습니다. 여러 개의 Gist가 존재할 때 식별에 도움이 됩니다.",
 14 |     "ext.config.removeExtensions": "동기화 다운로드로 인해 확장(extension)이 삭제되는 걸 막고 싶다면 False로 설정하세요.", 
 15 |     "ext.config.syncExtensions": "만약 확장(extension)이 업로드/다운로드되는 걸 원하지 않으면 False로 설정하세요.",
 16 |     "cmd.howSetting.title": "Sync: 환경설정 방법",
 17 |     "cmd.updateSettings.title": "Sync: 업데이트/업로드 설정",
 18 |     "cmd.updateSettings.info.uploading": "Sync: GitHub에서 설정을 업로드/업데이트하는 중입니다.",
 19 |     "cmd.updateSettings.info.uploadingFile": "Sync: 파일 데이터를 업로드 중 입니다.",
 20 |     "cmd.updateSettings.info.uploadingDone": "Sync: 업로드 완료. GIST ID: {0}. 다른 기기에서도 설정을 다운받으려면 이 ID를 복사해서 사용하세요.",
 21 |     "cmd.updateSettings.info.uploadingSuccess": "Sync: 업로드 완료",
 22 |     "cmd.updateSettings.info.shareGist": "Sync: ID를 공유하여 다른 확장(extension) 사용자들과 설정을 공유하세요.",
 23 |     "cmd.updateSettings.info.readding": "Sync: 설정과 확장을 읽고 있습니다.",
 24 |     "cmd.updateSettings.info.uploadCanceled": "Sync: 업로드 동작이 취소되었습니다.",
 25 |     "cmd.updateSettings.info.newGistCreated": "Sync: 새로운 Gist가 생성되었습니다.",
 26 |     "cmd.updateSettings.info.gotLatestVersion": "Sync: 저장된 설정의 최신 버전을 이미 업로드했습니다.",
 27 |     "cmd.updateSettings.warning.noToken": "Sync: 로컬 설정 동기화 파일에서 'downloadPublicGist'를 끄거나 GitHub 토큰을 설정하세요.",
 28 |     "cmd.updateSettings.warning.OSNotSupported": "동기화 Pragma 운영체제 값 {0} 는 line {1} 에서 지원되지 않습니다.",
 29 |     "cmd.updateSettings.error.newGistCreateFail": "Sync: 새로운 Gist 생성에 실패했습니다.",
 30 |     "cmd.updateSettings.error.readGistFail": "Sync:  GIST ID: {0} 읽기에 실패했습니다.",
 31 |     "cmd.updateSettings.error.gistNotSave": "Sync: Gist가 저장되지 않았습니다.",
 32 |     "cmd.downloadSettings.title": "Sync: 다운로드 설정",
 33 |     "cmd.downloadSettings.info.downloaded": "Sync: 다운로드 완료.",
 34 |     "cmd.downloadSettings.info.readdingOnline": "Sync: 온라인에서 설정을 읽고 있습니다.",
 35 |     "cmd.downloadSettings.info.gotLatestVersion": "Sync: 로컬 설정이 이미 최신 버전입니다.",
 36 |     "cmd.downloadSettings.error.removeExtFail": "Sync: 일부 확장(extension)을 제거하는데 실패했습니다.",
 37 |     "cmd.downloadSettings.error.unableSave": "Sync: 확장(extension) 설정파일을 저장하는데 실패했습니다.",
 38 |     "cmd.resetSettings.title": "Sync: 설정 초기화",
 39 |     "cmd.resetSettings.info.resetting": "Sync: 설정을 초기화 중입니다.",
 40 |     "cmd.resetSettings.info.settingClear": "Sync: 설정이 초기화되었습니다.",
 41 |     "cmd.otherOptions.title": "Sync: 고급 옵션",
 42 |     "cmd.otherOptions.openSettingsPage": "Sync: 설정 열기",
 43 |     "cmd.otherOptions.editLocalSetting": "Sync: 확장(extension)의 로컬 설정 편집하기",
 44 |     "cmd.otherOptions.shareSetting": "Sync: Public GIST로 설정 공유하기",
 45 |     "cmd.otherOptions.shareSetting.beforeConfirm": "Sync: 현재 Gist를 삭제하고 새 public Gist에 설정을 업로드합니다. 계속하시겠습니까?",
 46 |     "cmd.otherOptions.downloadSetting": "Sync: public Gist로부터 설정 다운로드",
 47 |     "cmd.otherOptions.toggleForceDownload": "Sync: 강제 다운로드 켜기/끄기",
 48 |     "cmd.otherOptions.toggleForceDownload.on": "Sync: 강제 다운로드 켜기",
 49 |     "cmd.otherOptions.toggleForceDownload.off": "Sync: 강제 다운로드 끄기",
 50 |     "cmd.otherOptions.toggleForceUpload": "Sync: 강제 업로드 켜기/끄기",
 51 |     "cmd.otherOptions.toggleForceUpload.on": "Sync: 강제 업로드 켜기",
 52 |     "cmd.otherOptions.toggleForceUpload.off": "Sync: 강제 업로드 끄기",
 53 |     "cmd.otherOptions.toggleAutoUpload": "Sync: 설정이 변경될 때 자동 업로드 켜기/끄기",
 54 |     "cmd.otherOptions.toggleAutoUpload.on": "Sync: 설정이 변경될 때 자동 업로드하기 켜기. VSCode가 재시작한 뒤에 적용됩니다.",
 55 |     "cmd.otherOptions.toggleAutoUpload.off": "Sync: 설정이 변경될 때 자동 업로드하기 끄기",
 56 |     "cmd.otherOptions.toggleAutoDownload": "Sync: VSCode가 시작될 때 자동 다운로드 켜기/끄기",
 57 |     "cmd.otherOptions.toggleAutoDownload.on": "Sync: VSCode가 시작될 때 자동 다운로드 켜기",
 58 |     "cmd.otherOptions.toggleAutoDownload.off": "Sync: VSCode가 시작될 때 자동 다운로드 끄기",
 59 |     "cmd.otherOptions.toggleSummaryPage": "Sync: 업로드/다운로드 시 요약 페이지 표시 켜기/끄기",
 60 |     "cmd.otherOptions.preserve": "Sync: 다운로드 후 설정을 보호해 덮어쓰기 방지하기",
 61 |     "cmd.otherOptions.preserve.placeholder": "settings.json를 보호할 암호(key)를 입력하세요.",
 62 |     "cmd.otherOptions.preserve.prompt": "Example: 'http.proxy' 작성 => 컴퓨터 프록시를 저장 및 덮어씁니다. 비어있으면 프록시가 제거됩니다.",
 63 |     "cmd.otherOptions.preserve.info.done1": "Sync: 완료. 다운로드 후 {0} 값이 settings.json에서 제거되었습니다.",
 64 |     "cmd.otherOptions.preserve.info.done2": "Sync: 완료. 다운로드 후 {0}: {1} 는 settings.json에 유지됩니다.",
 65 |     "cmd.otherOptions.customizedSync": "Sync: 사용자 정의 동기화 파일 추가",
 66 |     "cmd.otherOptions.customizedSync.placeholder": "추가 업로드 파일의 절대 경로를 입력하십시오.",
 67 |     "cmd.otherOptions.customizedSync.prompt": "(예: /path/to/.eslintrc)가 업로드되고 지정된 경로로 다운로드될 것입니다.",
 68 |     "cmd.otherOptions.customizedSync.done": "Sync: {0}가 등록되었습니다.",
 69 |     "cmd.otherOptions.downloadCustomFile": "Sync: 사용자 정의 동기화 파일을 현재 작업영역에 불러옵니다.",
 70 |     "cmd.otherOptions.downloadCustomFile.placeholder": "현재 작업영역의 루트(root)에 다운로드 받을 파일을 선택하세요.",
 71 |     "cmd.otherOptions.downloadCustomFile.done": "{0} 다운로드됨.",
 72 |     "cmd.otherOptions.joinCommunity": "Sync: 커뮤니티 가입",
 73 |     "cmd.otherOptions.openIssue": "Sync: 이슈(issue) 열기",
 74 |     "cmd.otherOptions.releaseNotes": "Sync: 릴리즈 노트",
 75 |     "cmd.otherOptions.quietSync.on": "Sync: 업/다운로드시 상태바에 표시됩니다.",
 76 |     "cmd.otherOptions.quietSync.off": "Sync: 업/다운로드시 알림창이 표시됩니다.",
 77 |     "cmd.otherOptions.warning.tokenNotRequire": "Sync: 이제부터 Settings Sync에서 GitHub 토큰을 묻지 않습니다.",
 78 |     "cmd.otherOptions.error.toggleFail": "Sync: 설정/해제 할 수 없습니다.",
 79 |     "cmd.otherOptions.triggerReset": "Sync: 설정을 초기화할까요?",
 80 |     "common.info.installed": "Sync: 확장이 설치되었습니다. 설치해주셔서 감사합니다!",
 81 |     "common.info.needHelp": "Sync: 이 확장(extension)을 환경설정하는 데 도움이 필요하십니까?",
 82 |     "common.info.excludeFile": "Sync: 업/다운로드시 특정 파일 및 폴더를 제외할 수 있습니다.",
 83 |     "common.info.updating": "Sync: 업데이트 중입니다... 잠시만 기다려주세요.",
 84 |     "common.info.initAutoUpload": "Sync: {0}초 뒤 자동 업로드가 시작됩니다.",
 85 |     "common.info.setToken": "Sync: 이제 'syncLocalSetings.json'에서 GitHub 토큰을 수동으로 설정할 수 있습니다.",
 86 |     "common.info.tokenSaved": "Sync: Token이 저장되었습니다.",
 87 |     "common.info.gistSaved": "Sync: Gist가 저장되었습니다.",
 88 |     "common.info.updateTo": "Sync: v{0}로 업데이트 되었습니다.",
 89 |     "common.info.donate": "Sync: 이 확장(extension)이 마음에 드셨나요? 리뷰를 쓰거나 기부를 해보는 건 어떠세요? ;)",
 90 |     "common.error.message": "Sync: 콘솔에 오류가 기록되었습니다. (메뉴의 `도움말 > 개발자 도구 설정/해제`에서 볼 수 있습니다.)",
 91 |     "common.error.connection": "Sync: 인터넷이 연결되지 않았거나 GitHub에 연결할 수 없습니다. 콘솔에 예외(exception)가 기록되었습니다.",
 92 |     "common.error.canNotSave": "Sync: 설정을 저장할 수 없습니다. settings.json 파일이 유효한 JSON인지 확인해 주세요. (예: 끝에 콤마','가 없는 경우)",
 93 |     "common.error.invalidToken": "Sync: 유효하지 않거나 만료된 GitHub 토큰입니다. Readme에 언급된 범위에서 새 토큰을 생성해 주세요. 콘솔에 예외(exception)가 기록되었습니다.",
 94 |     "common.error.invalidGistId": "Sync: 유효하지 않은 Gist Id가 입력되었습니다. 당신의 Gist를 확인해주세요: https://gist.github.com/<당신의_사용자이름>/<gist_id>.",
 95 |     "common.error.tokenNotSave": "Sync: 토큰이 저장되지 않았습니다.",
 96 |     "common.error.gistNotSave": "Sync: Gist가 저장되지 않았습니다.",
 97 |     "common.action.openExtPage": "확장(extension) 페이지 열기",
 98 |     "common.action.openExtTutorial": "튜토리얼 열기",
 99 |     "common.action.releaseNotes": "릴리즈 노트",
100 |     "common.action.writeReview": "리뷰 작성하기",
101 |     "common.action.support": "이 프로젝트 지원하기",
102 |     "common.action.joinCommunity": "커뮤니티 참여",
103 |     "common.action.donate": "기부하기",
104 |     "common.placeholder.enterGithubAccessToken": "GitHub 개인(personal) 액세스 토큰을 입력하세요.",
105 |     "common.placeholder.enterGistId": "Gist Id를 입력하세요.",
106 |     "common.placeholder.multipleGist": "Gist 이름 (예: 개인 설정)",
107 |     "common.prompt.multipleGist": "여러 개의 Gist가 있는 경우, 당신에게 설정을 식별하도록 허용하기",
108 |     "common.prompt.enterGistId": "이전에 업로드된 설정으로부터 Gist ID 입력. VSCode설정 중 `sync.gist`에서 수동으로 설정할 수도 있습니다. [Enter]를 누르거나 취소하려면 [Esc]를 누르세요.",
109 |     "common.prompt.enterGithubAccessToken": "수동으로 토큰을 추가합니다.(사용자 폴더/syncLocalSettings.json). [Enter]를 누르거나 취소하려면 [Esc]를 누르세요.",
110 |     "common.prompt.restartCode": "확장(extensions) 및 구성을 적용하기 위해 VScode를 재시작하시겠습니까?",
111 |     "common.prompt.gistForceUpload": "Sync: 업로드하면 GitHub Gist의 설정이 대체됩니다. 설정을 다운로드하거나 강제 업로드를 고려하십시오. 여전히 강제로 업로드 하시겠습니까?",
112 |     "common.prompt.gistNewer": "Sync: 마지막으로 다운로드 한 이후 Gist의 설정이 변경되었습니다. 어쨌든 현재 로컬 설정을 Gist에 업로드 하시겠습니까?",
113 |     "common.button.no": "아니",
114 |     "common.button.yes": "예",
115 |     "ext.globalConfig.token.name": "액세스 토큰",
116 |     "ext.globalConfig.token.placeholder": "토큰을 입력하세요.",
117 |     "ext.globalConfig.githubEnterpriseUrl.name": "GitHub Enterpirse URL(선택사항)",
118 |     "ext.globalConfig.githubEnterpriseUrl.placeholder": "GitHub Enterprise URL을 입력하세요",
119 |     "ext.globalConfig.ignoreUploadFolders.name": "무시할 폴더",
120 |     "ext.globalConfig.ignoredUploadFolders.placeholder": "한 줄에 하나의 폴더를 입력하세요",
121 |     "ext.globalConfig.ignoreExtensions.name": "무시할 확장(extension)",
122 |     "ext.globalConfig.ignoreExtensions.placeholder": "한 줄에 하나의 확장(extension)을 풀네임으로 입력하세요.",
123 |     "ext.globalConfig.hostName.name": "호스트명 (선택사항)",
124 |     "ext.globalConfig.hostName.placeholder": "호스트명을 입력하세요",
125 |     "ext.globalConfig.ignoreUploadFiles.name": "무시할 파일",
126 |     "ext.globalConfig.ignoreUploadFiles.placeholder": "한 줄에 한 파일씩 입력하세요",
127 |     "ext.globalConfig.supportedFileExtensions.name": "지원할 파일 확장자",
128 |     "ext.globalConfig.supportedFileExtensions.placeholder": "한 줄에 하나의 파일 확장자를 입력하세요",
129 |     "ext.globalConfig.gistDescription.name": "Gist 설명",
130 |     "ext.globalConfig.gistDescription.placeholder": "Gist 설명을 입력하세요",
131 |     "ext.globalConfig.autoUploadDelay.name": "자동 업로드 간격",
132 |     "ext.globalConfig.autoUploadDelay.placeholder": "자동 업로드 간격을 초 단위로 입력하세요",
133 |     "ext.globalConfig.askGistDescription.name": "Gist 이름",
134 |     "ext.globalConfig.downloadPublicGist.name": "public Gist 다운로드",
135 |     "ext.globalConfig.openTokenLink.name": "토큰 링크 열기",
136 |     "ext.config.gist.name": "Gist ID",
137 |     "ext.config.gist.placeholder": "Gist ID를 입력하세요"
138 | }


--------------------------------------------------------------------------------
/package.nls.ru.json:
--------------------------------------------------------------------------------
  1 | {
  2 |   "cmd.downloadSettings.error.removeExtFail": "Sync: Не удалось удалить некоторые расширения.",
  3 |   "cmd.downloadSettings.error.unableSave": "Sync: Не удалось сохранить файл настроек расширения.",
  4 |   "cmd.downloadSettings.info.downloaded": "Sync: Загрузка завершена",
  5 |   "cmd.downloadSettings.info.gotLatestVersion": "Sync: У Вас уже установлена последняя версия сохраненных настроек.",
  6 |   "cmd.downloadSettings.info.readdingOnline": "Sync: Чтение удаленных настроек.",
  7 |   "cmd.downloadSettings.title": "Sync: Скачать настройки",
  8 |   "cmd.howSetting.title": "Sync: Инструкция по настройке",
  9 |   "cmd.otherOptions.customizedSync": "Sync: Добавить путь для синхронизации файлов",
 10 |   "cmd.otherOptions.customizedSync.done": "Sync: Файл {0} был зарегистрирован.",
 11 |   "cmd.otherOptions.customizedSync.placeholder": "Введите абсолютный путь к дополнительно загружаемому файлу.",
 12 |   "cmd.otherOptions.customizedSync.prompt": "(прим.: /путь/к/.eslintrc) этот файл будет синхронизирован",
 13 |   "cmd.otherOptions.downloadCustomFile": "Sync: Импортировать другой файл настроек в рабочей области",
 14 |   "cmd.otherOptions.downloadCustomFile.done": "{0} скачен.",
 15 |   "cmd.otherOptions.downloadCustomFile.placeholder": "Выберите файл, который Вы хотите скачать в корневой каталог активной рабочей области.",
 16 |   "cmd.otherOptions.downloadSetting": "Sync: Скачать настройки из публичного Gist",
 17 |   "cmd.otherOptions.editLocalSetting": "Sync: Редактирование параметров синхронизации на этом устройстве",
 18 |   "cmd.otherOptions.error.toggleFail": "Sync: Не удалось изменить значение.",
 19 |   "cmd.otherOptions.joinCommunity": "Присоединиться к сообществу",
 20 |   "cmd.otherOptions.openIssue": "Sync: Создать issue",
 21 |   "cmd.otherOptions.openSettingsPage": "Sync: Открыть Параметры",
 22 |   "cmd.otherOptions.preserve": "Sync: Сохранить локальные значения настроек при скачивании удаленных настроек",
 23 |   "cmd.otherOptions.preserve.info.done1": "Синхронизации: Готово. {0} значение будет удалено из settings.json после синхронизации.",
 24 |   "cmd.otherOptions.preserve.info.done2": "Синхронизации: Готово. Будет сохранено {0}: {1} в settings.json после синхронизации.",
 25 |   "cmd.otherOptions.preserve.placeholder": "Введите ключ из settings.json для сохранения локального значения настройки.",
 26 |   "cmd.otherOptions.preserve.prompt": "Пример: Введите 'http.proxy' => сохранит локальную настройку прокси при синхронизации.",
 27 |   "cmd.otherOptions.quietSync.off": "Sync: Результат синхронизации будет показан после завершения операции.",
 28 |   "cmd.otherOptions.quietSync.on": "Sync: Строка состояния будет обновляться во время синхронизации.",
 29 |   "cmd.otherOptions.releaseNotes": "Sync: Примечания к выпуску",
 30 |   "cmd.otherOptions.shareSetting": "Sync: Поделиться настройками при помощи публичного Gist",
 31 |   "cmd.otherOptions.shareSetting.beforeConfirm": "Sync: Это удалит текущий Gist и загрузит настройки в новый публичный Gist. Вы действительно хотите продолжить?",
 32 |   "cmd.otherOptions.title": "Sync: Дополнительные Параметры",
 33 |   "cmd.otherOptions.toggleAutoDownload": "Sync: Вкл./выкл. автоматическое скачивание настроек при загрузке приложения",
 34 |   "cmd.otherOptions.toggleAutoDownload.off": "Sync: Автоматическое скачивание настроек при запуске VSCode отключено.",
 35 |   "cmd.otherOptions.toggleAutoDownload.on": "Sync: Автоматическое скачивание настроек при запуске VSCode включено.",
 36 |   "cmd.otherOptions.toggleAutoUpload": "Sync: Вкл./выкл. автоматическую загрузку настроек при изменении параметров",
 37 |   "cmd.otherOptions.toggleAutoUpload.off": "Sync: Автоматическая загрузка при изменении параметров отключена.",
 38 |   "cmd.otherOptions.toggleAutoUpload.on": "Sync: Автоматическая загрузка при изменении параметров включена. Изменения вступят в силу после перезагрузки VSCode.",
 39 |   "cmd.otherOptions.toggleForceDownload": "Sync: Вкл./выкл. принудительное скачивание настроек",
 40 |   "cmd.otherOptions.toggleForceDownload.off": "Sync: Принудительное скачивание отключено.",
 41 |   "cmd.otherOptions.toggleForceDownload.on": "Sync: Принудительное скачивание включено.",
 42 |   "cmd.otherOptions.toggleForceUpload": "Sync: Вкл./выкл. принудительную загрузку",
 43 |   "cmd.otherOptions.toggleForceUpload.off": "Sync: Принудительная загрузка отключена.",
 44 |   "cmd.otherOptions.toggleForceUpload.on": "Sync: Принудительная загрузка включена.",
 45 |   "cmd.otherOptions.toggleSummaryPage": "Sync: Вкл./выкл. показ страницы результата скачивания/загрузки настроек",
 46 |   "cmd.otherOptions.triggerReset": "Sync: Сбросить настройки синхронизации?",
 47 |   "cmd.otherOptions.warning.tokenNotRequire": "Sync: Настройки синхронизации больше не будут требовать токен GitHub.",
 48 |   "cmd.resetSettings.info.resetting": "Sync: Сброс Настроек.",
 49 |   "cmd.resetSettings.info.settingClear": "Sync: Настройки Сброшены.",
 50 |   "cmd.resetSettings.title": "Sync: Сброс настроек синхронизации",
 51 |   "cmd.updateSettings.error.gistNotSave": "Sync: Gist не сохранен",
 52 |   "cmd.updateSettings.error.newGistCreateFail": "Sync: Не удалось создать Gist.",
 53 |   "cmd.updateSettings.error.readGistFail": "Sync: Не удалось прочитать Gist ID {0}.",
 54 |   "cmd.updateSettings.info.gotLatestVersion": "Sync: Вы уже загрузили последнюю версию сохраненных настроек.",
 55 |   "cmd.updateSettings.info.newGistCreated": "Sync: Создан новый Gist.",
 56 |   "cmd.updateSettings.info.readding": "Sync: Чтение настроек и расширений.",
 57 |   "cmd.updateSettings.info.shareGist": "Sync: Поделиться настройками с другими пользователями расширения, отправив ID.",
 58 |   "cmd.updateSettings.info.uploadCanceled": "Sync: Загрузка отменена.",
 59 |   "cmd.updateSettings.info.uploading": "Sync: Загрузка/обновление настроек в GitHub.",
 60 |   "cmd.updateSettings.info.uploadingDone": "Sync: Загрузка Завершена. Gist ID: {0}. Пожалуйста, скопируйте и используйте этот идентификатор на других устройствах для синхронизации настроек.",
 61 |   "cmd.updateSettings.info.uploadingFile": "Sync: Загрузка файлов данных.",
 62 |   "cmd.updateSettings.info.uploadingSuccess": "Sync: Успешная загрузка.",
 63 |   "cmd.updateSettings.title": "Sync: Загрузить/обновить настройки.",
 64 |   "cmd.updateSettings.warning.OSNotSupported": "Sync: Значение Pragma OS {0} в строке {1} не поддерживается",
 65 |   "cmd.updateSettings.warning.noToken": "Sync: Введите токен GitHub или отключите настройку 'downloadPublicGist' в настройках.",
 66 |   "common.action.donate": "Пожертвовать",
 67 |   "common.action.joinCommunity": "Присоединяйтесь к сообществу",
 68 |   "common.action.openExtPage": "Открыть страницу расширения",
 69 |   "common.action.openExtTutorial": "Открыть руководство пользователя",
 70 |   "common.action.releaseNotes": "Информация о выпуске",
 71 |   "common.action.support": "Поддержать проект",
 72 |   "common.action.writeReview": "Написать отзыв",
 73 |   "common.button.no": "нет",
 74 |   "common.button.yes": "Да",
 75 |   "common.error.canNotSave": "Sync: Не удалось сохранить настройки. Пожалуйста, убедитесь в корректности файла `settings.json`. (Например, проверьте на отсутствие завершающих запятых)",
 76 |   "common.error.connection": "Sync: Интернет не подключен или невозможно подключиться к GitHub. Ошибка выведена в консоль",
 77 |   "common.error.gistNotSave": "Sync: Gist не сохранен.",
 78 |   "common.error.invalidGistId": "Sync: Введен некорректный Gist ID. Проверьте Ваш Gist на https://gist.github.com/<имя_пользователя>/<gist_id>.",
 79 |   "common.error.invalidToken": "Sync: Некорректный или недействительный токен GitHub. Пожалуйста, создайте новый токен с правами доступа, перечисленными в README. Ошибка выведена в консоль.",
 80 |   "common.error.message": "Sync: Ошибка выведена в консоль (Справка > Показать/скрыть средства разработчика).",
 81 |   "common.error.tokenNotSave": "Sync: Токен не сохранён.",
 82 |   "common.info.donate": "Sync: Нравится расширение? Как насчет оставить отзыв или отправить пожертвование?",
 83 |   "common.info.excludeFile": "Sync: Вы можете исключить любой файл/папку из загрузки и настроек для скачивания",
 84 |   "common.info.gistSaved": "Sync: Gist сохранен",
 85 |   "common.info.initAutoUpload": "Sync: Автоматическая загрузка начнется через {0} секунд.",
 86 |   "common.info.installed": "Sync: Настройки созданы, спасибо за установку расширения!",
 87 |   "common.info.needHelp": "Sync: Нужна помощь в настройке расширения?",
 88 |   "common.info.setToken": "Sync: Теперь Вы можете вручную установить Ваш токен GitHub в `syncLocalSettings.json`",
 89 |   "common.info.tokenSaved": "Sync: Токен сохранен",
 90 |   "common.info.updateTo": "Sync: Обновлено до v{0}",
 91 |   "common.info.updating": "Sync: Обновление В Процессе... Пожалуйста, Подождите.",
 92 |   "common.placeholder.enterGistId": "Введите Gist ID",
 93 |   "common.placeholder.enterGithubAccessToken": "Введите токен GitHub",
 94 |   "common.placeholder.multipleGist": "Имя Gist (Например: Personal Settings)",
 95 |   "common.prompt.enterGistId": "Введите Gist ID от ранее сохраненных настроек. Вы также можете вручную задать его в параметрах (sync.gist). Нажмите [Enter] или [Esc] для отмены.",
 96 |   "common.prompt.enterGithubAccessToken": "Вы также можете вручную добавить токен (User Folder/syncLocalSettings.json). Нажмите [Enter] или [Esc] для отмены.",
 97 |   "common.prompt.gistForceUpload": "Sync: Загрузка заменит настройки в GitHub Gist. Попробуйте загрузить настройки или выполнить принудительную загрузку. Вы все еще хотите загружать принудительно?",
 98 |   "common.prompt.gistNewer": "Sync: Настройки в Gist изменились с момента их последней загрузки. Вы хотите загрузить текущие локальные настройки в Gist?",
 99 |   "common.prompt.multipleGist": "Поможет определить настройки если Вы используете несколько репозиториев для сохранения настроек.",
100 |   "common.prompt.restartCode": "Перезагрузить VSCode для применения расширений и параметров?",
101 |   "ext.config.autoDownload": "Установите значение true для автоматической загрузки настроек при запуске приложения. [Требуется перезагрузка VSCode]",
102 |   "ext.config.autoDownload.name": "Автоматическое скачивание",
103 |   "ext.config.autoUpload": "Установите значение true для автоматической загрузки при изменении параметров. [Требуется перезагрузка VSCode]",
104 |   "ext.config.autoUpload.name": "Автоматическая загрузка",
105 |   "ext.config.forceDownload": "Установите значение true, для принудительного скачивания настроек (локальные настройки будут перезаписаны даже если у вас более новая версия настроек).",
106 |   "ext.config.forceDownload.name": "Принудительное скачивание",
107 |   "ext.config.forceUpload": "Установите значение true для загрузки настроек, даже если Gist содержит более новые настройки (удаленные настройки будут перезаписаны даже если там содержится более новая версия настроек).",
108 |   "ext.config.forceUpload.name": "Принудительная загрузка",
109 |   "ext.config.gist": "GitHub Gist ID для сохранения настроек синхронизации.",
110 |   "ext.config.gist.name": "Gist ID",
111 |   "ext.config.gist.placeholder": "Введите Gist ID",
112 |   "ext.config.host": "Введите адрес Вашего домена GitHub Enterprise для использования GHE.",
113 |   "ext.config.lastDownload": "Дата последнего скачивания настроек. Установить пустое значение для скачивания настроек вручную.",
114 |   "ext.config.lastUpload": "Дата последней загрузки настроек. Установить пустое значение для скачивания настроек вручную.",
115 |   "ext.config.pathPrefix": "Установите префикс Вашего GitHub Enterprise API для работы с GHE. Обычно '/api/v3'. Используется только если введен домен GitHub Enterprise.",
116 |   "ext.config.quietSync": "Установите значение true для показа результата в строке состояния вместо страницы.",
117 |   "ext.config.quietSync.name": "\"Тихая\" синхронизация",
118 |   "ext.config.removeExtensions": "Установите значение false, если вы не хотите, чтобы расширения удалялись во время скачивания настроек.",
119 |   "ext.config.removeExtensions.name": "Удалить расширения",
120 |   "ext.config.syncExtensions": "Установите значение true для синхронизации расширений.",
121 |   "ext.config.syncExtensions.name": "Синхронизация расширений",
122 |   "ext.config.title": "Настройки расширения Code Settings Sync",
123 |   "ext.globalConfig.askGistDescription.name": "Задать имя Gist",
124 |   "ext.globalConfig.autoUploadDelay.name": "Задержка перед автозагрузкой",
125 |   "ext.globalConfig.autoUploadDelay.placeholder": "Введите количество секунд для задержки перед автозагрузкой",
126 |   "ext.globalConfig.downloadPublicGist.name": "Скачать настройки из публичного Gist",
127 |   "ext.globalConfig.gistDescription.name": "Описание Gist",
128 |   "ext.globalConfig.gistDescription.placeholder": "Введите описание Gist",
129 |   "ext.globalConfig.githubEnterpriseUrl.name": "Домен GitHub Enterprise (не обязательно)",
130 |   "ext.globalConfig.githubEnterpriseUrl.placeholder": "Введите домен GitHub Enterprise",
131 |   "ext.globalConfig.hostName.name": "Hostname (необязательно)",
132 |   "ext.globalConfig.hostName.placeholder": "Введите hostname",
133 |   "ext.globalConfig.ignoreExtensions.name": "Игнорируемые расширения",
134 |   "ext.globalConfig.ignoreExtensions.placeholder": "Введите одно расширение на строку (полное название)",
135 |   "ext.globalConfig.ignoreUploadFiles.name": "Игнорируемые файлы",
136 |   "ext.globalConfig.ignoreUploadFiles.placeholder": "Введите один файл на строку",
137 |   "ext.globalConfig.ignoreUploadFolders.name": "Игнорируемые папки",
138 |   "ext.globalConfig.ignoredUploadFolders.placeholder": "Введите по одной папке на строку",
139 |   "ext.globalConfig.openTokenLink.name": "Open Token Link",
140 |   "ext.globalConfig.supportedFileExtensions.name": "Поддерживаемые расширения файлов",
141 |   "ext.globalConfig.supportedFileExtensions.placeholder": "Введите расширение файла на строку",
142 |   "ext.globalConfig.token.name": "Токен доступа",
143 |   "ext.globalConfig.token.placeholder": "Введите Токен"
144 | }


--------------------------------------------------------------------------------
/package.nls.tr.json:
--------------------------------------------------------------------------------
  1 | {
  2 |   "cmd.downloadSettings.error.removeExtFail": "Bazı uzantıları kaldırmak Mümkün Sync.",
  3 |   "cmd.downloadSettings.error.unableSave": "Uzantı ayarları dosyası kaydedilemedi çeviri:.",
  4 |   "cmd.downloadSettings.info.downloaded": "Çeviri: İndirme Tamamlandı.",
  5 |   "cmd.downloadSettings.info.gotLatestVersion": "Çeviri: önceden kaydedilmiş ayarları en son sürümü.",
  6 |   "cmd.downloadSettings.info.readdingOnline": "Çeviri: Okuma Ayarları Çevrimiçi.",
  7 |   "cmd.downloadSettings.title": "Çeviri: İndirme Ayarları",
  8 |   "cmd.howSetting.title": "Yapılandırma Sync: ",
  9 |   "cmd.otherOptions.customizedSync": "Sync: Sync Add Özel Dosya yolu",
 10 |   "cmd.otherOptions.customizedSync.done": "{0} çeviri: kayıtlı.",
 11 |   "cmd.otherOptions.customizedSync.placeholder": "Ek yüklenen dosyanın mutlak bir yol girin.",
 12 |   "cmd.otherOptions.customizedSync.prompt": "(ex. ///yolu.eslintrc) yüklenen ve belirtilen yol yüklenir.",
 13 |   "cmd.otherOptions.downloadCustomFile": "Çeviri: Al Özel Senkron çalışma alanı Dosyası ",
 14 |   "cmd.otherOptions.downloadCustomFile.done": "{0} indirilmiş.",
 15 |   "cmd.otherOptions.downloadCustomFile.placeholder": "Üzerinde çalıştığınız çalışma alanı köküne indirmek istediğiniz dosyayı seçin.",
 16 |   "cmd.otherOptions.downloadSetting": "Kamu ÖZÜ senkronizasyon: İndirme Ayarları ",
 17 |   "cmd.otherOptions.editLocalSetting": "Çeviri: Düzenleme Uzantısı Yerel Ayarları",
 18 |   "cmd.otherOptions.error.toggleFail": "Geçiş Yapılamıyor çeviri:.",
 19 |   "cmd.otherOptions.joinCommunity": "Çeviri: Katılmak Topluluk",
 20 |   "cmd.otherOptions.openIssue": "Sync: Açık Sorunu",
 21 |   "cmd.otherOptions.openSettingsPage": "Sync: Açık Ayarları",
 22 |   "cmd.otherOptions.preserve": "Geçersiz Durdurmak İçin Ayar İndirildikten Sonra Korumak Çeviri: ",
 23 |   "cmd.otherOptions.preserve.info.done1": "Çeviri: Bitti. {0} değerini ayarlar silinecektir.indirdikten sonra json.",
 24 |   "cmd.otherOptions.preserve.info.done2": "Çeviri: Bitti. Uzantısı {1} {0}: ortamda devam edecektir.indirdikten sonra json.",
 25 |   "cmd.otherOptions.preserve.placeholder": "Ayarlardan herhangi bir Tuşa basın.json korumak için.",
 26 |   "cmd.otherOptions.preserve.prompt": "Örnek: http Yazın.proxy' => deposu bu bilgisayara proxy ve bunun üzerine , eğer boş küme proxy kaldıracaktır.",
 27 |   "cmd.otherOptions.quietSync.off": "Çeviri: Özet download/upload üzerine gösterilecektir.",
 28 |   "cmd.otherOptions.quietSync.on": "Çeviri: Durum Çubuğu yükleme indirme üzerine güncellenecektir.",
 29 |   "cmd.otherOptions.releaseNotes": "Çeviri: Sürüm Notları",
 30 |   "cmd.otherOptions.shareSetting": "Kamu ÖZÜ ile senkronizasyon: Paylaşım Ayarları ",
 31 |   "cmd.otherOptions.shareSetting.beforeConfirm": "Sync: Bu yeni ortak KONUSUNU güncel KONUSUNU ve yükleme ayarları kaldıracaktır. Devam etmek istiyor musunuz?",
 32 |   "cmd.otherOptions.title": "Çeviri: Gelişmiş Seçenekler",
 33 |   "cmd.otherOptions.toggleAutoDownload": "Başlangıç Sync: Otomatik Aç / Kapat-Download ",
 34 |   "cmd.otherOptions.toggleAutoDownload.off": "Sync: Otomatik İndirme VSCode Başlangıçta KAPALI.",
 35 |   "cmd.otherOptions.toggleAutoDownload.on": "Sync: Otomatik İndirme VSCode Başlangıçta açık.",
 36 |   "cmd.otherOptions.toggleAutoUpload": "Ayarlar Senkronizasyon: Otomatik Aç / Kapat-Upload Değiştirin",
 37 |   "cmd.otherOptions.toggleAutoUpload.off": "Değiştirme Ayarı senkronizasyon: Otomatik Yükleme Kapalı.",
 38 |   "cmd.otherOptions.toggleAutoUpload.on": "Değiştirme Ayarı senkronizasyon: Otomatik Yükleme Açık. Bu yeniden başlatma sonra yürürlüğe girecek.",
 39 |   "cmd.otherOptions.toggleForceDownload": "Çeviri: Geçiş Güç İndir",
 40 |   "cmd.otherOptions.toggleForceDownload.off": "Çeviri: Force Download Kapalı.",
 41 |   "cmd.otherOptions.toggleForceDownload.on": "Çeviri: Force Download Açık.",
 42 |   "cmd.otherOptions.toggleForceUpload": "Çeviri: Geçiş Güç Yüklemek",
 43 |   "cmd.otherOptions.toggleForceUpload.off": "Çeviri: Force Upload Kapattı.",
 44 |   "cmd.otherOptions.toggleForceUpload.on": "Çeviri: Force Upload Açık.",
 45 |   "cmd.otherOptions.toggleSummaryPage": "Yükleme/İndirme Sync: * Toggle Özet Sayfası ",
 46 |   "cmd.otherOptions.triggerReset": "Çeviri: ayarları sıfırlamak istiyor Musunuz ?",
 47 |   "cmd.otherOptions.warning.tokenNotRequire": "Sync: Sync GitHub Ayarları Simge için artık sormayacağım.",
 48 |   "cmd.resetSettings.info.resetting": "Çeviri: Ayarlarınız Sıfırlanıyor.",
 49 |   "cmd.resetSettings.info.settingClear": "Çeviri: Ayarlar Temizlenir.",
 50 |   "cmd.resetSettings.title": "Çeviri: Sıfırlama Uzatma Ayarları",
 51 |   "cmd.updateSettings.error.gistNotSave": "Çeviri: ÖZÜ KAYITLI DEĞİL ",
 52 |   "cmd.updateSettings.error.newGistCreateFail": "Konusunu oluşturulamadı çeviri:.",
 53 |   "cmd.updateSettings.error.readGistFail": "OKUMAK İÇİN {0} MÜMKÜN çeviren: ESAS NUMARASI:.",
 54 |   "cmd.updateSettings.info.gotLatestVersion": "Çeviri: Kayıtlı ayarların en son sürümünü zaten yüklediniz.",
 55 |   "cmd.updateSettings.info.newGistCreated": "Oluşturulan Sync: Yeni fikri.",
 56 |   "cmd.updateSettings.info.readding": "Çeviri: Okuma Ayarları ve Uzantıları.",
 57 |   "cmd.updateSettings.info.shareGist": "Sync: diğer abone ile ayarları paylaşmak Kimliği Paylaşımı.",
 58 |   "cmd.updateSettings.info.uploadCanceled": "İptal Çeviren: Yükleme İşlemi.",
 59 |   "cmd.updateSettings.info.uploading": "Çeviri: Yükleme/GitHub Ayarlarını Güncelleme.",
 60 |   "cmd.updateSettings.info.uploadingDone": "Çeviri: Tam Karşıya. {0} KONUSUNU ID:. Lütfen kopyalayın ve ayarları indirmek için diğer makinelerde bu KİMLİĞİ kullanın.",
 61 |   "cmd.updateSettings.info.uploadingFile": "Senkron: Veri Dosyaları Yüklemek.",
 62 |   "cmd.updateSettings.info.uploadingSuccess": "Başarıyla Yüklendi Çeviri:.",
 63 |   "cmd.updateSettings.title": "Çeviri: Güncelleme/Yükleme Ayarları",
 64 |   "cmd.updateSettings.warning.OSNotSupported": "{0} Sync Pragma OS değeri {1}satırında desteklenmeyen ",
 65 |   "cmd.updateSettings.warning.noToken": "Yerel Senkronizasyon ayarları senkronizasyon: Set GitHub Token veya devre dışı bırak 'downloadPublicGist' dosyası.",
 66 |   "common.action.donate": "Şimdi Bağış ",
 67 |   "common.action.joinCommunity": "Topluluğuna Katılın ",
 68 |   "common.action.openExtPage": "Açık Uzatma Sayfa",
 69 |   "common.action.openExtTutorial": "Açık Öğretici",
 70 |   "common.action.releaseNotes": "Sürüm Notları",
 71 |   "common.action.support": "Destek Bu Proje",
 72 |   "common.action.writeReview": "Gözden Geçirme ",
 73 |   "common.button.no": "Hayır",
 74 |   "common.button.yes": "Evet",
 75 |   "common.error.canNotSave": "Ayarlar kaydedilemedi çeviri:. Geçerli JSON ayarları olduğundan emin olun lütfen.json dosyası. (örn: sondaki virgül)",
 76 |   "common.error.connection": "GitHub Bağlanmak için Bağlı ya da Yapamaz Sync: İnternet Değil. Özel durum Konsolunda Oturum ",
 77 |   "common.error.gistNotSave": "Kaydedilen Çeviri: Özü.",
 78 |   "common.error.invalidGistId": "Çeviri: Geçersiz Özü Kimliği Girdi. Özetle sizin: https://gist.github.com/<your_userName>/<gist_id>doğrulayın.",
 79 |   "common.error.invalidToken": "Çeviri: Geçersiz/GitHub Token Sona Erdi. Readme belirtilen kapsam ile yeni bir belirteç oluşturmak lütfen. Özel durum Konsolunda Oturum.",
 80 |   "common.error.message": "Çeviri: Hata (menü > Değiştir Geliştirici Araçları Yardım) Konsol giriş yapmış.",
 81 |   "common.error.tokenNotSave": "Kayıtlı Değil Token Sync.",
 82 |   "common.info.donate": "Çeviri: bu uzantı sever misiniz? Hakkında bir inceleme yazmak ya da bir bağış göndermek nasıl? ",
 83 |   "common.info.excludeFile": "Yükleme ve indirme için ayarları için herhangi bir dosya/klasör hariç tutabilirsiniz çeviri:.",
 84 |   "common.info.gistSaved": "Çeviri: Özü Kurtardı",
 85 |   "common.info.initAutoUpload": "{0} Saniye Başlatan Sync: Otomatik Yükleme.",
 86 |   "common.info.installed": "Oluşturulan çeviri: Ayarlar, yükleme için teşekkürler!",
 87 |   "common.info.needHelp": "Sync: bu uzantı yapılandırma konusunda Yardıma mı İhtiyacınız var?",
 88 |   "common.info.setToken": "Çeviri: Şimdi GitHub elle syncLocalSettings olarak `simge ayarlayabilirsiniz.json`",
 89 |   "common.info.tokenSaved": "Çeviri: Simge Kurtardı",
 90 |   "common.info.updateTo": "{0}v için Güncelleme Sync: ",
 91 |   "common.info.updating": "Çeviri: İlerleme Güncelleme... Lütfen Bekleyin.",
 92 |   "common.placeholder.enterGistId": "Konusunu Kimliği Girin ",
 93 |   "common.placeholder.enterGithubAccessToken": "Token GitHub Kişisel Erişim Girin ",
 94 |   "common.placeholder.multipleGist": "Esas Adı (örneğin: Kişisel Ayarlar)",
 95 |   "common.prompt.enterGistId": "Önceden yüklenmiş ayarları Konusunu Kimliğini girin. Ayrıca el ile kod ayarları (eşitleme ayarlayabilirsiniz.özü). Basın [Enter] veya [Esc] iptal etmek için.",
 96 |   "common.prompt.enterGithubAccessToken": "Ayrıca el/syncLocalSettings Klasör belirteci (bir Kullanıcı ekleyin.json). Basın [Enter] veya [Esc] iptal etmek için.",
 97 |   "common.prompt.gistForceUpload": "Çeviri: TYükleme GitHub Gist'teki ayarları değiştirecek. Ayarları indirmeyi veya zorunlu bir yükleme yapmayı düşünün. Hala zorla yüklemek istiyor musunuz?",
 98 |   "common.prompt.gistNewer": "Çeviri: Gist'teki ayarlar, en son indirdiğinizden bu yana değişti. Mevcut yerel ayarlarınızı yine de Gist’e yüklemek ister misiniz?",
 99 |   "common.prompt.multipleGist": "Birden çok fikri varsa ayarları belirlemenizi sağlar.",
100 |   "common.prompt.restartCode": "Uzantıları ve yapılandırmaları uygulamak için yeniden yüklemek ister misiniz?",
101 |   "ext.config.autoDownload": "Ayarlamak true Otomatik kod başlangıç ayarları İndirmek. [Kod Yeniden Başlatma Gerekli]",
102 |   "ext.config.autoDownload.name": "Otomatik İndirme",
103 |   "ext.config.autoUpload": "Doğru ayarları değiştir Yükleme Otomatik olarak ayarlayın. [Kod Yeniden Başlatma Gerekli]",
104 |   "ext.config.autoUpload.name": "Otomatik Yükle",
105 |   "ext.config.forceDownload": "Eğer en son ayarlar varsa bile ayarları indirmek istiyorsanız true olarak ayarlayın.",
106 |   "ext.config.forceDownload.name": "Kuvvet İndir",
107 |   "ext.config.forceUpload": "Eğer ÖZÜ yeni ayarları olsa bile ayarları yüklemek istiyorsanız true olarak ayarlayın.",
108 |   "ext.config.forceUpload.name": "Güç Yükleme",
109 |   "ext.config.gist": "Ayarları Eşitlemek için GitHub KONUSUNU KİMLİĞİ.",
110 |   "ext.config.gist.name": "Konusunu KİMLİĞİ",
111 |   "ext.config.gist.placeholder": "Konusunu KİMLİĞİ girin ",
112 |   "ext.config.host": "Eğer GHE kullanmak istiyorsanız GitHub Enterprise ev sahibi olarak ayarlayın.",
113 |   "ext.config.lastDownload": "Ayarları son indirme tarihi Sync. El ile karşıdan vurmak istiyorsan boş olarak ayarlayın.",
114 |   "ext.config.lastUpload": "Ayarları son yükleme tarihi Sync. El ile karşıdan vurmak istiyorsan boş olarak ayarlayın.",
115 |   "ext.config.pathPrefix": "Eğer GHE kullanmak istiyorsanız GitHub Enterprise API önek ayarlayın. Normalde '/api/v3. Ana ayarlandığında yalnızca kullanılır.",
116 |   "ext.config.quietSync": "True olarak ayarlandığında, bunun yerine sayfa sayfa durum çubuğunda sonucu gösterir.",
117 |   "ext.config.quietSync.name": "Sessiz Sync",
118 |   "ext.config.removeExtensions": "Eğer indirirken uzantıları kaldırmak istemiyorsanız false olarak ayarlayın.",
119 |   "ext.config.removeExtensions.name": "Uzantıları Kaldırmak ",
120 |   "ext.config.syncExtensions": "Eğer/uzantıları karşıdan yüklemek istemiyorsan false olarak ayarlayın.",
121 |   "ext.config.syncExtensions.name": "Sync Uzantıları",
122 |   "ext.config.title": "Kod Ayarları Eşitleme Yapılandırma Ayarları",
123 |   "ext.globalConfig.askGistDescription.name": "Özü Adını Sor ",
124 |   "ext.globalConfig.autoUploadDelay.name": "Otomatik Yükleme Gecikme",
125 |   "ext.globalConfig.autoUploadDelay.placeholder": "Otomatik gecikme için upload saniye miktarını girin",
126 |   "ext.globalConfig.downloadPublicGist.name": "İndir Kamu Özü",
127 |   "ext.globalConfig.gistDescription.name": "Özetle Açıklama",
128 |   "ext.globalConfig.gistDescription.placeholder": "Özetle Açıklama Girin ",
129 |   "ext.globalConfig.githubEnterpriseUrl.name": "(İsteğe bağlı)GitHub Enterprise URL ",
130 |   "ext.globalConfig.githubEnterpriseUrl.placeholder": "GitHub Enterprise URL girin ",
131 |   "ext.globalConfig.hostName.name": "Ana bilgisayar adı (isteğe bağlı)",
132 |   "ext.globalConfig.hostName.placeholder": "Makine Adını Girin ",
133 |   "ext.globalConfig.ignoreExtensions.name": "Göz Ardı Uzantıları",
134 |   "ext.globalConfig.ignoreExtensions.placeholder": "(Tam adı)satır başına bir uzantısı girin ",
135 |   "ext.globalConfig.ignoreUploadFiles.name": "Yoksayılan Dosyaları",
136 |   "ext.globalConfig.ignoreUploadFiles.placeholder": "Satır başına bir dosya girin ",
137 |   "ext.globalConfig.ignoreUploadFolders.name": "Göz Ardı Klasörler",
138 |   "ext.globalConfig.ignoredUploadFolders.placeholder": "Satır başına bir klasör girin ",
139 |   "ext.globalConfig.openTokenLink.name": "Açık Token Linki",
140 |   "ext.globalConfig.supportedFileExtensions.name": "Desteklenen Dosya Uzantıları",
141 |   "ext.globalConfig.supportedFileExtensions.placeholder": "Satır başına bir dosya uzantısı girin ",
142 |   "ext.globalConfig.token.name": "Erişim Belirteci",
143 |   "ext.globalConfig.token.placeholder": "Token Girin "
144 | }


--------------------------------------------------------------------------------
/package.nls.zh-cn.json:
--------------------------------------------------------------------------------
  1 | {
  2 |   "cmd.downloadSettings.error.removeExtFail": "Sync: 不能移除一些扩展",
  3 |   "cmd.downloadSettings.error.unableSave": "Sync: 无法保存扩展配置文件。",
  4 |   "cmd.downloadSettings.info.downloaded": "Sync: 下载完成。",
  5 |   "cmd.downloadSettings.info.gotLatestVersion": "Sync: 你已经应用了最新版本的配置",
  6 |   "cmd.downloadSettings.info.readdingOnline": "Sync: 正在读取远程设置。",
  7 |   "cmd.downloadSettings.title": "Sync: 下载配置",
  8 |   "cmd.howSetting.title": "Sync: 如何配置",
  9 |   "cmd.otherOptions.customizedSync": "Sync: 添加自定义的文件同步路径",
 10 |   "cmd.otherOptions.customizedSync.done": "Sync: {0} 已经被注册。",
 11 |   "cmd.otherOptions.customizedSync.placeholder": "输入额外上传文件的绝对路径。",
 12 |   "cmd.otherOptions.customizedSync.prompt": "(例如 /path/to/.eslintrc) 将被上传和下载到指定的路径。",
 13 |   "cmd.otherOptions.downloadCustomFile": "Sync: 导入自定义同步文件到工作区",
 14 |   "cmd.otherOptions.downloadCustomFile.done": "{0} 下载完成。",
 15 |   "cmd.otherOptions.downloadCustomFile.placeholder": "选择你想要的文件下载到你正在使用的工作空间的根目录下。",
 16 |   "cmd.otherOptions.downloadSetting": "Sync: 从公开 Gist 下载配置",
 17 |   "cmd.otherOptions.editLocalSetting": "Sync: 编辑扩展本地设置",
 18 |   "cmd.otherOptions.error.toggleFail": "Sync: 无法切换。",
 19 |   "cmd.otherOptions.joinCommunity": "Sync: 加入社区",
 20 |   "cmd.otherOptions.openIssue": "Sync: 打开 Issue",
 21 |   "cmd.otherOptions.openSettingsPage": "Sync: 打开设置",
 22 |   "cmd.otherOptions.preserve": "Sync: 防止配置在下载后覆盖",
 23 |   "cmd.otherOptions.preserve.info.done1": "Sync: 完成。下载完成后将从 setting.json 中删除 {0}",
 24 |   "cmd.otherOptions.preserve.info.done2": "Sync: 完成。下载完成后扩展将在 settings.json 中保留 {0}:{1} 。",
 25 |   "cmd.otherOptions.preserve.placeholder": "输入 settings.json 中的任意字段以保留",
 26 |   "cmd.otherOptions.preserve.prompt": "例如:输入 'http.proxy' => 在本机存储该配置,并覆盖同步后的配置。如果设置为空,则会移除同步后配置中的这一字段。",
 27 |   "cmd.otherOptions.quietSync.off": "Sync: 将在上传或下载时显示摘要。",
 28 |   "cmd.otherOptions.quietSync.on": "Sync: 将在上传或下载后更新状态栏。",
 29 |   "cmd.otherOptions.releaseNotes": "Sync: 更新日志",
 30 |   "cmd.otherOptions.shareSetting": "Sync: 在公开 Gist 上分享配置",
 31 |   "cmd.otherOptions.shareSetting.beforeConfirm": "Sync: 这将移除当前的 Gist 并将配置发布到新的公开 Gist 。你确定继续吗?",
 32 |   "cmd.otherOptions.title": "Sync: 高级选项",
 33 |   "cmd.otherOptions.toggleAutoDownload": "Sync: 切换启动时自动下载",
 34 |   "cmd.otherOptions.toggleAutoDownload.off": "Sync: VSCode 启动时自动下载已关闭",
 35 |   "cmd.otherOptions.toggleAutoDownload.on": "Sync: VSCode 启动时自动下载已开启",
 36 |   "cmd.otherOptions.toggleAutoUpload": "Sync: 切换配置更新后自动上传",
 37 |   "cmd.otherOptions.toggleAutoUpload.off": "Sync: 自动上传配置已关闭。",
 38 |   "cmd.otherOptions.toggleAutoUpload.on": "Sync: 自动上传配置已开启。重启后生效。",
 39 |   "cmd.otherOptions.toggleForceDownload": "Sync: 开关强制下载",
 40 |   "cmd.otherOptions.toggleForceDownload.off": "Sync: 强制下载已关闭。",
 41 |   "cmd.otherOptions.toggleForceDownload.on": "Sync: 强制下载已开启。",
 42 |   "cmd.otherOptions.toggleForceUpload": "Sync: 切换强制上传",
 43 |   "cmd.otherOptions.toggleForceUpload.off": "Sync: 强制上传已关闭。",
 44 |   "cmd.otherOptions.toggleForceUpload.on": "Sync: 强制上传已开启。",
 45 |   "cmd.otherOptions.toggleSummaryPage": "Sync: 开关同步时显示摘要页面",
 46 |   "cmd.otherOptions.triggerReset": "Sync: 确定要重置设置吗?",
 47 |   "cmd.otherOptions.warning.tokenNotRequire": "Sync:  Settings Sync 将不再要求填写 GitHub 令牌。",
 48 |   "cmd.resetSettings.info.resetting": "Sync: 正在重置你的设置。",
 49 |   "cmd.resetSettings.info.settingClear": "Sync: 设置已清除。",
 50 |   "cmd.resetSettings.title": "Sync: 重置扩展设置",
 51 |   "cmd.updateSettings.error.gistNotSave": "Sync: Gist 没有保存",
 52 |   "cmd.updateSettings.error.newGistCreateFail": "Sync: 无法创建 Gist。",
 53 |   "cmd.updateSettings.error.readGistFail": "Sync: 无法读取 Gist ID:{0}。",
 54 |   "cmd.updateSettings.info.gotLatestVersion": "Sync: 您已经上传了最新版本的已保存设置。",
 55 |   "cmd.updateSettings.info.newGistCreated": "Sync: 已创建新的 Gist。",
 56 |   "cmd.updateSettings.info.readding": "Sync: 正在读取设置和扩展",
 57 |   "cmd.updateSettings.info.shareGist": "Sync: 与其他用户分享 Gist ID 来共享配置",
 58 |   "cmd.updateSettings.info.uploadCanceled": "Sync: 上传已取消。",
 59 |   "cmd.updateSettings.info.uploading": "Sync: 上传/更新您的配置到 GitHub",
 60 |   "cmd.updateSettings.info.uploadingDone": "Sync: 上传完成。Gist ID:{0}。请复制这个 ID 并将其用于其他设备来下载配置。",
 61 |   "cmd.updateSettings.info.uploadingFile": "Sync: 上传文件数据。",
 62 |   "cmd.updateSettings.info.uploadingSuccess": "Sync: 上传成功。",
 63 |   "cmd.updateSettings.title": "Sync: 更新/上传配置",
 64 |   "cmd.updateSettings.warning.OSNotSupported": "同步 Pragma OS 值 {0} 不被支持。行:{1}",
 65 |   "cmd.updateSettings.warning.noToken": "Sync: 设置 GitHub 令牌或从本地同步设置文件中禁用 'downloadPublicGist' 。",
 66 |   "common.action.donate": "现在捐赠",
 67 |   "common.action.joinCommunity": "加入社区",
 68 |   "common.action.openExtPage": "打开扩展主页",
 69 |   "common.action.openExtTutorial": "打开教程",
 70 |   "common.action.releaseNotes": "更新日志",
 71 |   "common.action.support": "支持这个项目",
 72 |   "common.action.writeReview": "去写评论",
 73 |   "common.button.no": "没有",
 74 |   "common.button.yes": "是",
 75 |   "common.error.canNotSave": "Sync: 保存设置失败。请确保你的 setting.json 文件合法 (例如 : 没有逗号尾随)",
 76 |   "common.error.connection": "Sync: 未连接到网络或者连接 GitHub 失败。错误信息已打印到控制台",
 77 |   "common.error.gistNotSave": "Sync: Gist 未保存。",
 78 |   "common.error.invalidGistId": "Sync: Gist Id 无效。请确认你的 Gist : https://gist.github.com/<your_userName>/<Gist_id> 是否有效",
 79 |   "common.error.invalidToken": "Sync: GitHub 令牌无效或已过期。请重新生成。错误信息已打印到控制台",
 80 |   "common.error.message": "Sync: 错误信息已打印在控制台 (帮助 > 切换开发人员工具)。",
 81 |   "common.error.tokenNotSave": "Sync: 令牌未保存。",
 82 |   "common.info.donate": "Sync: 你喜欢这个扩展吗?要不留下评论或捐助我怎么样 ;)",
 83 |   "common.info.excludeFile": "Sync: 你可以在上传和下载中忽略任何文件或文件夹",
 84 |   "common.info.gistSaved": "Sync: Gist 已保存",
 85 |   "common.info.initAutoUpload": "Sync: {0} 秒后开始自动上传",
 86 |   "common.info.installed": "Sync: 配置已创建。感谢您的使用!",
 87 |   "common.info.needHelp": "Sync: 需要帮助来配置此扩展吗?",
 88 |   "common.info.setToken": "Sync: 现现在你可以在 `syncLocalSettings.json` 中手动设置 GitHub 令牌",
 89 |   "common.info.tokenSaved": "Sync: 令牌已保存",
 90 |   "common.info.updateTo": "Sync: 更新至 v{0}",
 91 |   "common.info.updating": "Sync: 正在更新... 请稍候。",
 92 |   "common.placeholder.enterGistId": "请输入 Gist Id",
 93 |   "common.placeholder.enterGithubAccessToken": "请输入 GitHub Token",
 94 |   "common.placeholder.multipleGist": "Gist 名 [ 例如 : Personal Settings ]",
 95 |   "common.prompt.enterGistId": "请输入上一次上传设置的 Gist Id 。你也可以手动添加到 VSCode 的配置文件 (sync.gist 字段) 。按下 [Enter] 确认或者 输入 'esc' 取消",
 96 |   "common.prompt.enterGithubAccessToken": "链接打开了!你可以手动添加到用户目录/syncLocalSettings.json 。按下 [Enter] 确认或者 输入 'esc' 取消",
 97 |   "common.prompt.gistForceUpload": "Sync: 上传将替换GitHub Gist中的设置。 考虑下载设置或强制上传。 你还想强力上传吗?",
 98 |   "common.prompt.gistNewer": "Sync: 自上次下载以来,Gist中的设置已更改。 您是否要将当前的本地设置上传到Gist?",
 99 |   "common.prompt.multipleGist": "如果你有多个 Gist 设置,使你可以识别设置",
100 |   "common.prompt.restartCode": "你是否要重新加载 VSCode 来应用扩展和设置?",
101 |   "ext.config.autoDownload": "设置为 true 在编辑器打开时自动下载远程配置。[需要重启]",
102 |   "ext.config.autoDownload.name": "自动下载",
103 |   "ext.config.autoUpload": "设置为 true 在编辑器打开时自动上传本地配置。[需要重启]",
104 |   "ext.config.autoUpload.name": "自动上传",
105 |   "ext.config.forceDownload": "设置为 true 将会下载远程配置,即便本地已有更新的配置。",
106 |   "ext.config.forceDownload.name": "强制下载",
107 |   "ext.config.forceUpload": "如果即使 Gist 具有较新设置你仍想上传设置,请设置为 true 。",
108 |   "ext.config.forceUpload.name": "强制上传",
109 |   "ext.config.gist": "设置同步使用的 GitHub Gist ID",
110 |   "ext.config.gist.name": "Gist ID",
111 |   "ext.config.gist.placeholder": "请输入 Gist ID",
112 |   "ext.config.host": "如果你是 GitHub 企业用户,设置为 GitHub 企业版服务器。",
113 |   "ext.config.lastDownload": "最后下载时间。如果你要手动下载,请将其设置为空",
114 |   "ext.config.lastUpload": "最后上传时间。如果你要手动下载,请将其设置为空",
115 |   "ext.config.pathPrefix": "如果你是 GitHub 企业用户,设置 GitHub 的 API 前缀。通常是 '/api/v3' 。只在 host 字段设置后生效",
116 |   "ext.config.quietSync": "如果设置为 true ,开启静默模式。上传和下载的概要信息显示在状态栏而非输出面板",
117 |   "ext.config.quietSync.name": "静默同步",
118 |   "ext.config.removeExtensions": "设置为 false 如果你不想在下载时移除扩展。",
119 |   "ext.config.removeExtensions.name": "删除扩展",
120 |   "ext.config.syncExtensions": "设置为 false 如果你不想上传/下载扩展。",
121 |   "ext.config.syncExtensions.name": "同步扩展",
122 |   "ext.config.title": "代码同步配置",
123 |   "ext.globalConfig.askGistDescription.name": "创建 Gist 时询问名称,这可以帮助您在您的多个 Gist 中找到这个配置",
124 |   "ext.globalConfig.autoUploadDelay.name": "自动上传延迟",
125 |   "ext.globalConfig.autoUploadDelay.placeholder": "输入延迟的秒数",
126 |   "ext.globalConfig.downloadPublicGist.name": "下载公开 Gist",
127 |   "ext.globalConfig.gistDescription.name": "Gist 描述说明",
128 |   "ext.globalConfig.gistDescription.placeholder": "请输入描述",
129 |   "ext.globalConfig.githubEnterpriseUrl.name": "GitHub 企业版地址(可选)",
130 |   "ext.globalConfig.githubEnterpriseUrl.placeholder": "输入 GitHub 企业版 URL",
131 |   "ext.globalConfig.hostName.name": "主机名(可选)",
132 |   "ext.globalConfig.hostName.placeholder": "输入主机名",
133 |   "ext.globalConfig.ignoreExtensions.name": "忽略的扩展",
134 |   "ext.globalConfig.ignoreExtensions.placeholder": "每行输入一个扩展名(全名)",
135 |   "ext.globalConfig.ignoreUploadFiles.name": "忽略的文件",
136 |   "ext.globalConfig.ignoreUploadFiles.placeholder": "每行输入一个文件",
137 |   "ext.globalConfig.ignoreUploadFolders.name": "忽略文件夹",
138 |   "ext.globalConfig.ignoredUploadFolders.placeholder": "每行输入一个文件夹",
139 |   "ext.globalConfig.openTokenLink.name": "打开令牌链接",
140 |   "ext.globalConfig.supportedFileExtensions.name": "支持的文件扩展",
141 |   "ext.globalConfig.supportedFileExtensions.placeholder": "每行输入一个文件扩展",
142 |   "ext.globalConfig.token.name": "获取令牌",
143 |   "ext.globalConfig.token.placeholder": "输入令牌"
144 | }
145 | 


--------------------------------------------------------------------------------
/package.nls.zh-tw.json:
--------------------------------------------------------------------------------
  1 | {
  2 |   "cmd.downloadSettings.error.removeExtFail": "Sync: 無法移除一些延伸模組",
  3 |   "cmd.downloadSettings.error.unableSave": "Sync: 無法儲存延伸模組設定檔案。",
  4 |   "cmd.downloadSettings.info.downloaded": "Sync: 下載完成。",
  5 |   "cmd.downloadSettings.info.gotLatestVersion": "Sync: 你已經應用了最新版本的設定",
  6 |   "cmd.downloadSettings.info.readdingOnline": "Sync: 正在讀取線上設定。",
  7 |   "cmd.downloadSettings.title": "Sync: 下載設定",
  8 |   "cmd.howSetting.title": "Sync: 如何設定",
  9 |   "cmd.otherOptions.customizedSync": "Sync: 增加自定義的檔案同步路徑",
 10 |   "cmd.otherOptions.customizedSync.done": "Sync: {0} 已經被註冊。",
 11 |   "cmd.otherOptions.customizedSync.placeholder": "輸入額外上傳檔案的絶對路徑。",
 12 |   "cmd.otherOptions.customizedSync.prompt": "(例如 /path/to/.eslintrc) 將被上傳和下載到指定的路徑。",
 13 |   "cmd.otherOptions.downloadCustomFile": "Sync: 導入自定義同步檔案到工作區",
 14 |   "cmd.otherOptions.downloadCustomFile.done": "{0} 下載完成。",
 15 |   "cmd.otherOptions.downloadCustomFile.placeholder": "選擇你想要的檔案下載到你正在使用的工作空間的根目錄下。",
 16 |   "cmd.otherOptions.downloadSetting": "Sync: 從公開 Gist 下載設定",
 17 |   "cmd.otherOptions.editLocalSetting": "Sync: 編輯本機延伸模組設定",
 18 |   "cmd.otherOptions.error.toggleFail": "Sync: 無法切換。",
 19 |   "cmd.otherOptions.joinCommunity": "Sync: 加入社群",
 20 |   "cmd.otherOptions.openIssue": "Sync: 打開 Issue",
 21 |   "cmd.otherOptions.openSettingsPage": "Sync: 打開設定",
 22 |   "cmd.otherOptions.preserve": "Sync: 保存電腦裡的設定,避免被下載的設定覆蓋",
 23 |   "cmd.otherOptions.preserve.info.done1": "Sync: 完成。下載完成後將從 setting.json 中刪除 {0}",
 24 |   "cmd.otherOptions.preserve.info.done2": "Sync: 完成。下載完成後延伸模組將在 settings.json 中保留 {0}:{1} 。",
 25 |   "cmd.otherOptions.preserve.placeholder": "輸入 settings.json 中的任意欄位以保留",
 26 |   "cmd.otherOptions.preserve.prompt": "例如:輸入 'http.proxy' => 在本機存儲該設定,並覆蓋同步後的設定。如果設定為空白,則會移除同步後設定中的這一欄位。",
 27 |   "cmd.otherOptions.quietSync.off": "Sync: 將在上傳或下載時顯示摘要。",
 28 |   "cmd.otherOptions.quietSync.on": "Sync: 將在上傳或下載後更新狀態欄。",
 29 |   "cmd.otherOptions.releaseNotes": "Sync: 更新日誌",
 30 |   "cmd.otherOptions.shareSetting": "Sync: 在公開 Gist 上分享設定",
 31 |   "cmd.otherOptions.shareSetting.beforeConfirm": "Sync: 這將移除當前的 Gist 並將設定發佈到新的公開 Gist 。你確定繼續嗎?",
 32 |   "cmd.otherOptions.title": "Sync: 進階選項",
 33 |   "cmd.otherOptions.toggleAutoDownload": "Sync: 切換啟動時自動下載",
 34 |   "cmd.otherOptions.toggleAutoDownload.off": "Sync: VSCode 啟動時自動下載已停用",
 35 |   "cmd.otherOptions.toggleAutoDownload.on": "Sync: VSCode 啟動時自動下載已啟用",
 36 |   "cmd.otherOptions.toggleAutoUpload": "Sync: 切換設定更新後自動上傳",
 37 |   "cmd.otherOptions.toggleAutoUpload.off": "Sync: 自動上傳設定已停用。",
 38 |   "cmd.otherOptions.toggleAutoUpload.on": "Sync: 自動上傳設定已啟用。重啟後生效。",
 39 |   "cmd.otherOptions.toggleForceDownload": "Sync: 開關強制下載",
 40 |   "cmd.otherOptions.toggleForceDownload.off": "Sync: 強制下載已停用。",
 41 |   "cmd.otherOptions.toggleForceDownload.on": "Sync: 強制下載已啟用。",
 42 |   "cmd.otherOptions.toggleForceUpload": "Sync: 切換強制上傳",
 43 |   "cmd.otherOptions.toggleForceUpload.off": "Sync: 強制上傳已停用。",
 44 |   "cmd.otherOptions.toggleForceUpload.on": "Sync: 強制上傳已啟用。",
 45 |   "cmd.otherOptions.toggleSummaryPage": "Sync: 開關同步時顯示摘要頁面",
 46 |   "cmd.otherOptions.triggerReset": "Sync: 確定要重設設定嗎?",
 47 |   "cmd.otherOptions.warning.tokenNotRequire": "Sync:  Settings Sync 將不再要求填寫 GitHub 令牌。",
 48 |   "cmd.resetSettings.info.resetting": "Sync: 正在重設你的設定。",
 49 |   "cmd.resetSettings.info.settingClear": "Sync: 設定已清除。",
 50 |   "cmd.resetSettings.title": "Sync: 重設延伸模組設定",
 51 |   "cmd.updateSettings.error.gistNotSave": "Sync: Gist 沒有儲存",
 52 |   "cmd.updateSettings.error.newGistCreateFail": "Sync: 無法創建 Gist。",
 53 |   "cmd.updateSettings.error.readGistFail": "Sync: 無法讀取 Gist ID:{0}。",
 54 |   "cmd.updateSettings.info.gotLatestVersion": "Sync: 您已經上傳了最新版本的已保存設定。",
 55 |   "cmd.updateSettings.info.newGistCreated": "Sync: 已創建新的 Gist。",
 56 |   "cmd.updateSettings.info.readding": "Sync: 正在讀取設定和延伸模組",
 57 |   "cmd.updateSettings.info.shareGist": "Sync: 與其他用戶分享 Gist ID 來共享設定",
 58 |   "cmd.updateSettings.info.uploadCanceled": "Sync: 上傳已取消。",
 59 |   "cmd.updateSettings.info.uploading": "Sync: 上傳/更新您的設定到 GitHub",
 60 |   "cmd.updateSettings.info.uploadingDone": "Sync: 上傳完成。Gist ID:{0}。請複製這個 ID 並將其用於其他裝置來下載設定。",
 61 |   "cmd.updateSettings.info.uploadingFile": "Sync: 上傳檔案資料。",
 62 |   "cmd.updateSettings.info.uploadingSuccess": "Sync: 上傳成功。",
 63 |   "cmd.updateSettings.title": "Sync: 更新/上傳設定",
 64 |   "cmd.updateSettings.warning.OSNotSupported": "不支援同步 Pragma OS 值 {0}。行:{1}",
 65 |   "cmd.updateSettings.warning.noToken": "Sync: 設定 GitHub 令牌或從本機同步設定檔案中禁用 'downloadPublicGist' 。",
 66 |   "common.action.donate": "現在捐贈",
 67 |   "common.action.joinCommunity": "加入社群",
 68 |   "common.action.openExtPage": "打開延伸模組主頁",
 69 |   "common.action.openExtTutorial": "打開教學",
 70 |   "common.action.releaseNotes": "更新日誌",
 71 |   "common.action.support": "支持這個專案",
 72 |   "common.action.writeReview": "寫評論",
 73 |   "common.button.no": "沒有",
 74 |   "common.button.yes": "是",
 75 |   "common.error.canNotSave": "Sync: 儲存設定失敗。請確保你的 setting.json 檔案合法 (例如 : 沒有逗號尾隨)",
 76 |   "common.error.connection": "Sync: 未連接到網絡或者連接 GitHub 失敗。錯誤信息已列印到控制台",
 77 |   "common.error.gistNotSave": "Sync: Gist 未儲存。",
 78 |   "common.error.invalidGistId": "Sync: Gist Id 無效。請確認你的 Gist : https://gist.github.com/<your_userName>/<Gist_id> 是否有效",
 79 |   "common.error.invalidToken": "Sync: GitHub 令牌無效或已過期。請重新生成。錯誤信息已列印到控制台",
 80 |   "common.error.message": "Sync: 錯誤信息已列印在控制台 (幫助 > 切換開發人員工具)。",
 81 |   "common.error.tokenNotSave": "Sync: 令牌未儲存。",
 82 |   "common.info.donate": "Sync: 你喜歡這個延伸模組嗎?要不留下評論或捐助我怎麼樣 :)",
 83 |   "common.info.excludeFile": "Sync: 你可以在上傳和下載中忽略任何檔案或資料夾",
 84 |   "common.info.gistSaved": "Sync: Gist 已儲存",
 85 |   "common.info.initAutoUpload": "Sync: {0} 秒後開始自動上傳",
 86 |   "common.info.installed": "Sync: 已建立設定。感謝您的使用!",
 87 |   "common.info.needHelp": "Sync: 需要幫助來設定此延伸模組嗎?",
 88 |   "common.info.setToken": "Sync: 現現在你可以在 `syncLocalSettings.json` 中手動設定 GitHub 令牌",
 89 |   "common.info.tokenSaved": "Sync: 令牌已儲存",
 90 |   "common.info.updateTo": "Sync: 更新至 v{0}",
 91 |   "common.info.updating": "Sync: 正在更新... 請稍候。",
 92 |   "common.placeholder.enterGistId": "請輸入 Gist Id",
 93 |   "common.placeholder.enterGithubAccessToken": "請輸入 GitHub Token",
 94 |   "common.placeholder.multipleGist": "Gist 名 [ 例如 : Personal Settings ]",
 95 |   "common.prompt.enterGistId": "請輸入上一次上傳設定的 Gist Id 。你也可以手動增加到 VSCode 的設定檔案 (sync.gist 欄位) 。按下 [Enter] 確認或者 輸入 'esc' 取消",
 96 |   "common.prompt.enterGithubAccessToken": "連結打開了!你可以手動增加到用戶目錄/syncLocalSettings.json 。按下 [Enter] 確認或者 輸入 'esc' 取消",
 97 |   "common.prompt.gistForceUpload": "Sync: 上傳將替換GitHub Gist中的設置。 考慮下載設置或強制上傳。 你還想強力上傳嗎?",
 98 |   "common.prompt.gistNewer": "Sync: 自上次下載以來,Gist中的設置已更改。 您是否要將當前的本地設置上傳到Gist?",
 99 |   "common.prompt.multipleGist": "如果你有多個 Gist 設定,使你可以識別設定",
100 |   "common.prompt.restartCode": "你是否要重新啟動 VSCode 以應用延伸模組和設定?",
101 |   "ext.config.autoDownload": "設定為 true 在編輯器打開時自動下載線上設定。[需要重啟]",
102 |   "ext.config.autoDownload.name": "自動下載",
103 |   "ext.config.autoUpload": "設定為 true 在編輯器打開時自動上傳本機設定。[需要重啟]",
104 |   "ext.config.autoUpload.name": "自動上傳",
105 |   "ext.config.forceDownload": "設定為 true 將會下載線上設定,即便本機已有更新的設定。",
106 |   "ext.config.forceDownload.name": "強制下載",
107 |   "ext.config.forceUpload": "如果即使 Gist 具有較新設定你仍想上傳設定,請設定為 true 。",
108 |   "ext.config.forceUpload.name": "強制上傳",
109 |   "ext.config.gist": "設定同步使用的 GitHub Gist ID",
110 |   "ext.config.gist.name": "Gist ID",
111 |   "ext.config.gist.placeholder": "請輸入 Gist ID",
112 |   "ext.config.host": "如果你是 GitHub 企業用戶,設定為 GitHub 企業版伺服器。",
113 |   "ext.config.lastDownload": "最後下載時間。如果你要手動下載,請將其設定為空白",
114 |   "ext.config.lastUpload": "最後上傳時間。如果你要手動下載,請將其設定為空白",
115 |   "ext.config.pathPrefix": "如果你是 GitHub 企業用戶,設定 GitHub 的 API 前綴。通常是 '/api/v3' 。只在 host 欄位設定後生效",
116 |   "ext.config.quietSync": "如果設定為 true ,將顯示結果在狀態欄而非輸出面板",
117 |   "ext.config.quietSync.name": "静音模式同步",
118 |   "ext.config.removeExtensions": "設定為 false 如果你不想在下載時移除延伸模組。",
119 |   "ext.config.removeExtensions.name": "刪除延伸模組",
120 |   "ext.config.syncExtensions": "設定為 false 如果你不想上傳/下載延伸模組。",
121 |   "ext.config.syncExtensions.name": "同步延伸模組",
122 |   "ext.config.title": "Code Settings Sync 設定",
123 |   "ext.globalConfig.askGistDescription.name": "創建 Gist 時詢問名稱,這可以幫助您在您的多個 Gist 中找到這個設定",
124 |   "ext.globalConfig.autoUploadDelay.name": "自動上傳延遲",
125 |   "ext.globalConfig.autoUploadDelay.placeholder": "輸入延遲的秒數",
126 |   "ext.globalConfig.downloadPublicGist.name": "下載公開 Gist",
127 |   "ext.globalConfig.gistDescription.name": "Gist 描述說明",
128 |   "ext.globalConfig.gistDescription.placeholder": "請輸入描述",
129 |   "ext.globalConfig.githubEnterpriseUrl.name": "GitHub 企業版 URL(可選)",
130 |   "ext.globalConfig.githubEnterpriseUrl.placeholder": "輸入 GitHub 企業版 URL",
131 |   "ext.globalConfig.hostName.name": "主機名(可選)",
132 |   "ext.globalConfig.hostName.placeholder": "輸入主機名",
133 |   "ext.globalConfig.ignoreExtensions.name": "忽略的延伸模組",
134 |   "ext.globalConfig.ignoreExtensions.placeholder": "每行輸入一個延伸模組名稱(全名)",
135 |   "ext.globalConfig.ignoreUploadFiles.name": "忽略的檔案",
136 |   "ext.globalConfig.ignoreUploadFiles.placeholder": "每行輸入一個檔案",
137 |   "ext.globalConfig.ignoreUploadFolders.name": "忽略資料夾",
138 |   "ext.globalConfig.ignoredUploadFolders.placeholder": "每行輸入一個資料夾",
139 |   "ext.globalConfig.openTokenLink.name": "打開令牌連結",
140 |   "ext.globalConfig.supportedFileExtensions.name": "支援的檔案延伸模組",
141 |   "ext.globalConfig.supportedFileExtensions.placeholder": "每行輸入一個檔案延伸模組",
142 |   "ext.globalConfig.token.name": "獲取令牌",
143 |   "ext.globalConfig.token.placeholder": "輸入令牌"
144 | }
145 | 


--------------------------------------------------------------------------------
/release-notes.json:
--------------------------------------------------------------------------------
 1 | {
 2 |   "changes": [
 3 |     {
 4 |       "details": "Add content security policy for webviews",
 5 |       "type": "NEW",
 6 |       "color": "success",
 7 |       "author": "ParkourKarthik",
 8 |       "pullRequest": "1020"
 9 |     },
10 |     {
11 |       "details": "Improve UX for the Force Upload",
12 |       "type": "NEW",
13 |       "color": "success",
14 |       "author": "karl-lunarg",
15 |       "pullRequest": "1042"
16 |     },
17 |     {
18 |       "details": "Extension always asks to enable Force Upload",
19 |       "type": "FIX",
20 |       "color": "danger",
21 |       "author": "karl-lunarg",
22 |       "pullRequest": "1026"
23 |     },
24 |     {
25 |       "details": "Languages, Icon and Wiki Improved",
26 |       "type": "NEW",
27 |       "color": "success"
28 |     }, 
29 |     {
30 |       "details": "Github Gist Name Consistency across extension",
31 |       "type": "FIX",
32 |       "color": "danger"
33 |     }, 
34 |     {
35 |       "details": "Snippets Sync. Fixed",
36 |       "type": "FIX",
37 |       "color": "danger"
38 |     },
39 |     {
40 |       "details": "Share Settings Dialog Fixed",
41 |       "type": "FIX",
42 |       "color": "danger"
43 |     },
44 |     {
45 |       "details": "Github Sync Improved",
46 |       "type": "FIX",
47 |       "color": "danger"
48 |     }
49 |     
50 |   ],
51 |   "currentVersion": "v3.4.3"
52 | }
53 | 


--------------------------------------------------------------------------------
/scripts/deploy.sh:
--------------------------------------------------------------------------------
1 | npm install node-pre-gyp
2 | npm i --no-optional
3 | npm dedupe
4 | npm up
5 | npm install -g vsce
6 | printf "Applying Token"
7 | echo "[{\"name\":\"Shan\",\"pat\":\"$VSCE_TOKEN\"}]" > ~/.vsce
8 | vsce publish
9 | 


--------------------------------------------------------------------------------
/src/enums.ts:
--------------------------------------------------------------------------------
 1 | export enum OsType {
 2 |   Windows = "win32",
 3 |   Linux = "linux",
 4 |   Mac = "darwin"
 5 | }
 6 | 
 7 | export enum SettingType {
 8 |   Settings = 1,
 9 |   Launch,
10 |   KeyBindings,
11 |   Locale,
12 |   Extensions
13 | }
14 | 


--------------------------------------------------------------------------------
/src/environmentPath.ts:
--------------------------------------------------------------------------------
  1 | "use strict";
  2 | 
  3 | import { normalize, resolve } from "path";
  4 | import * as vscode from "vscode";
  5 | import { OsType } from "./enums";
  6 | import { state } from "./state";
  7 | 
  8 | export const SUPPORTED_OS: string[] = Object.keys(OsType)
  9 |   .filter(k => !/\d/.test(k))
 10 |   .map(k => k.toLowerCase()); // . ["windows", "linux", "mac"];
 11 | 
 12 | export function osTypeFromString(osName: string): OsType {
 13 |   const capitalized: string =
 14 |     osName[0].toUpperCase() + osName.substr(1).toLowerCase();
 15 |   return OsType[capitalized];
 16 | }
 17 | 
 18 | export class Environment {
 19 |   public static CURRENT_VERSION: number = 343;
 20 |   public static getVersion(): string {
 21 |     return (
 22 |       Environment.CURRENT_VERSION.toString().slice(0, 1) +
 23 |       "." +
 24 |       Environment.CURRENT_VERSION.toString().slice(1, 2) +
 25 |       "." +
 26 |       Environment.CURRENT_VERSION.toString().slice(2, 3)
 27 |     );
 28 |   }
 29 | 
 30 |   // public isInsiders: boolean = false;
 31 |   // public isOss: boolean = false;
 32 |   // public isCoderCom: boolean = false;
 33 |   // public homeDir: string | null = null;
 34 | 
 35 |   public isPortable: boolean = false;
 36 |   public USER_FOLDER: string = null;
 37 | 
 38 |   public CODE_BIN: string;
 39 | 
 40 |   public EXTENSION_FOLDER: string = null;
 41 |   public PATH: string = null;
 42 |   public OsType: OsType = null;
 43 | 
 44 |   public FILE_SETTING: string = null;
 45 |   public FILE_LAUNCH: string = null;
 46 |   public FILE_KEYBINDING: string = null;
 47 |   public FILE_LOCALE: string = null;
 48 |   public FILE_EXTENSION: string = null;
 49 |   public FILE_CLOUDSETTINGS: string = null;
 50 |   public FILE_SYNC_LOCK: string = null;
 51 | 
 52 |   public FILE_CUSTOMIZEDSETTINGS_NAME: string = "syncLocalSettings.json";
 53 |   public FILE_CUSTOMIZEDSETTINGS: string = null;
 54 | 
 55 |   public FILE_SETTING_NAME: string = "settings.json";
 56 |   public FILE_LAUNCH_NAME: string = "launch.json";
 57 |   public FILE_KEYBINDING_NAME: string = "keybindings.json";
 58 |   public FILE_KEYBINDING_MAC: string = "keybindingsMac.json";
 59 |   public FILE_KEYBINDING_DEFAULT: string = "keybindings.json";
 60 |   public FILE_EXTENSION_NAME: string = "extensions.json";
 61 |   public FILE_LOCALE_NAME: string = "locale.json";
 62 |   public FILE_SYNC_LOCK_NAME: string = "sync.lock";
 63 | 
 64 |   public FILE_CLOUDSETTINGS_NAME: string = "cloudSettings";
 65 | 
 66 |   public FOLDER_SNIPPETS: string = null;
 67 | 
 68 |   constructor() {
 69 |     state.context.globalState.update("_", undefined); // Make sure the global state folder exists. This is needed for using this.context.globalStoragePath to access user folder
 70 | 
 71 |     this.isPortable = !!process.env.VSCODE_PORTABLE;
 72 | 
 73 |     this.OsType = process.platform as OsType;
 74 |     if (!this.isPortable) {
 75 |       this.PATH = resolve(state.context.globalStoragePath, "../../..").concat(
 76 |         normalize("/")
 77 |       );
 78 |       this.USER_FOLDER = resolve(this.PATH, "User").concat(normalize("/"));
 79 |       this.EXTENSION_FOLDER = resolve(
 80 |         vscode.extensions.all.filter(
 81 |           extension => !extension.packageJSON.isBuiltin
 82 |         )[0].extensionPath,
 83 |         ".."
 84 |       ).concat(normalize("/")); // Gets first non-builtin extension's path
 85 |     } else {
 86 |       this.PATH = process.env.VSCODE_PORTABLE;
 87 |       this.USER_FOLDER = resolve(this.PATH, "user-data/User").concat(
 88 |         normalize("/")
 89 |       );
 90 |       this.EXTENSION_FOLDER = resolve(this.PATH, "extensions").concat(
 91 |         normalize("/")
 92 |       );
 93 |     }
 94 | 
 95 |     /* Start Legacy Code
 96 | 
 97 |     this.isInsiders = /insiders/.test(this.context.asAbsolutePath(""));
 98 |     this.isOss = /\boss\b/.test(this.context.asAbsolutePath(""));
 99 |     this.isCoderCom =
100 |       vscode.extensions.getExtension("coder.coder") !== undefined;
101 |     const isXdg =
102 |       !this.isInsiders &&
103 |       !this.isCoderCom &&
104 |       process.platform === "linux" &&
105 |       !!process.env.XDG_DATA_HOME;
106 |     this.homeDir = isXdg
107 |       ? process.env.XDG_DATA_HOME
108 |       : process.env[process.platform === "win32" ? "USERPROFILE" : "HOME"];
109 |     const configSuffix = `; $; {isXdg || this.isCoderCom ? "" : "."; }vscode$; {
110 |       this.isInsiders ? "-insiders" : this.isOss ? "-oss" : "";
111 |     }`;
112 | 
113 |     if (!this.isPortable) {
114 |       if (process.platform === "darwin") {
115 |         this.PATH = process.env.HOME + "/Library/Application Support";
116 |         this.OsType = OsType.Mac;
117 |       } else if (process.platform === "linux") {
118 |         if (!this.isCoderCom) {
119 |           this.PATH =
120 |             isXdg && !!process.env.XDG_CONFIG_HOME
121 |               ? process.env.XDG_CONFIG_HOME
122 |               : os.homedir() + "/.config";
123 |         } else {
124 |           this.PATH = "/tmp";
125 |         }
126 |         this.OsType = OsType.Linux;
127 |       } else if (process.platform === "win32") {
128 |         this.PATH = process.env.APPDATA;
129 |         this.OsType = OsType.Windows;
130 |       } else {
131 |         this.PATH = "/var/local";
132 |         this.OsType = OsType.Linux;
133 |       }
134 |     }
135 | 
136 |     if (this.isPortable) {
137 |       this.PATH = process.env.VSCODE_PORTABLE;
138 |       if (process.platform === "darwin") {
139 |         this.OsType = OsType.Mac;
140 |       } else if (process.platform === "linux") {
141 |         this.OsType = OsType.Linux;
142 |       } else if (process.platform === "win32") {
143 |         this.OsType = OsType.Windows;
144 |       } else {
145 |         this.OsType = OsType.Linux;
146 |       }
147 |     }
148 | 
149 |     if (!this.isPortable) {
150 |       const possibleCodePaths = [];
151 |       if (this.isInsiders) {
152 |         possibleCodePaths.push("/Code - Insiders");
153 |       } else if (this.isOss) {
154 |         possibleCodePaths.push("/Code - OSS");
155 |         possibleCodePaths.push("/VSCodium");
156 |       } else {
157 |         possibleCodePaths.push("/Code");
158 |       }
159 |       for (const possibleCodePath of possibleCodePaths) {
160 |         try {
161 |           fs.statSync(this.PATH + possibleCodePath);
162 |           this.PATH = this.PATH + possibleCodePath;
163 |           break;
164 |         } catch (e) {
165 |           console.error("Error :" + possibleCodePath);
166 |           console.error(e);
167 |         }
168 |       }
169 |       this.ExtensionFolder = path.join(
170 |         this.homeDir,
171 |         configSuffix,
172 |         "extensions"
173 |       );
174 |       this.USER_FOLDER = this.PATH.concat("/User/");
175 |     } else {
176 |       this.USER_FOLDER = this.PATH.concat("/user-data/User/");
177 |       this.ExtensionFolder = this.PATH.concat("/extensions/");
178 |     }
179 | 
180 |     End Legacy Code */
181 | 
182 |     this.FILE_EXTENSION = this.USER_FOLDER.concat(this.FILE_EXTENSION_NAME);
183 |     this.FILE_SETTING = this.USER_FOLDER.concat(this.FILE_SETTING_NAME);
184 |     this.FILE_LAUNCH = this.USER_FOLDER.concat(this.FILE_LAUNCH_NAME);
185 |     this.FILE_KEYBINDING = this.USER_FOLDER.concat(this.FILE_KEYBINDING_NAME);
186 |     this.FILE_LOCALE = this.USER_FOLDER.concat(this.FILE_LOCALE_NAME);
187 |     this.FOLDER_SNIPPETS = this.USER_FOLDER.concat("/snippets/");
188 |     this.FILE_CLOUDSETTINGS = this.USER_FOLDER.concat(
189 |       this.FILE_CLOUDSETTINGS_NAME
190 |     );
191 |     this.FILE_CUSTOMIZEDSETTINGS = this.USER_FOLDER.concat(
192 |       this.FILE_CUSTOMIZEDSETTINGS_NAME
193 |     );
194 |     this.FILE_SYNC_LOCK = this.USER_FOLDER.concat(this.FILE_SYNC_LOCK_NAME);
195 |   }
196 | }
197 | 


--------------------------------------------------------------------------------
/src/extension.ts:
--------------------------------------------------------------------------------
 1 | "use strict";
 2 | 
 3 | import * as vscode from "vscode";
 4 | import { Environment } from "./environmentPath";
 5 | import { state } from "./state";
 6 | import { Sync } from "./sync";
 7 | 
 8 | export async function activate(context: vscode.ExtensionContext) {
 9 |   state.context = context;
10 |   state.environment = new Environment();
11 | 
12 |   const sync = new Sync();
13 | 
14 |   sync.bootstrap();
15 | 
16 |   context.subscriptions.push(
17 |     vscode.commands.registerCommand(
18 |       "extension.updateSettings",
19 |       (optArgument?: string) => {
20 |         sync.upload.bind(sync, optArgument)();
21 |       }
22 |     )
23 |   );
24 |   context.subscriptions.push(
25 |     vscode.commands.registerCommand(
26 |       "extension.downloadSettings",
27 |       sync.download.bind(sync)
28 |     )
29 |   );
30 |   context.subscriptions.push(
31 |     vscode.commands.registerCommand(
32 |       "extension.resetSettings",
33 |       sync.reset.bind(sync)
34 |     )
35 |   );
36 |   context.subscriptions.push(
37 |     vscode.commands.registerCommand(
38 |       "extension.HowSettings",
39 |       sync.how.bind(sync)
40 |     )
41 |   );
42 |   context.subscriptions.push(
43 |     vscode.commands.registerCommand(
44 |       "extension.otherOptions",
45 |       sync.advance.bind(sync)
46 |     )
47 |   );
48 | }
49 | 


--------------------------------------------------------------------------------
/src/localize.ts:
--------------------------------------------------------------------------------
 1 | import { existsSync, readFileSync } from "fs-extra";
 2 | import { resolve } from "path";
 3 | import { extensions } from "vscode";
 4 | import { ILanguagePack } from "./models/language-pack.model";
 5 | 
 6 | export class Localize {
 7 |   private bundle = this.resolveLanguagePack();
 8 |   private options: { locale: string };
 9 | 
10 |   public localize(key: string, ...args: string[]): string {
11 |     const message = this.bundle[key] || key;
12 |     return this.format(message, args);
13 |   }
14 | 
15 |   private init() {
16 |     try {
17 |       this.options = {
18 |         ...this.options,
19 |         ...JSON.parse(process.env.VSCODE_NLS_CONFIG || "{}")
20 |       };
21 |     } catch (err) {
22 |       throw err;
23 |     }
24 |   }
25 | 
26 |   private format(message: string, args: string[] = []): string {
27 |     return args.length
28 |       ? message.replace(
29 |           /\{(\d+)\}/g,
30 |           (match, rest: any[]) => args[rest[0]] || match
31 |         )
32 |       : message;
33 |   }
34 | 
35 |   private resolveLanguagePack(): ILanguagePack {
36 |     this.init();
37 | 
38 |     const languageFormat = "package.nls{0}.json";
39 |     const defaultLanguage = languageFormat.replace("{0}", "");
40 | 
41 |     const rootPath = extensions.getExtension("Shan.code-settings-sync")
42 |       .extensionPath;
43 | 
44 |     const resolvedLanguage = this.recurseCandidates(
45 |       rootPath,
46 |       languageFormat,
47 |       this.options.locale
48 |     );
49 | 
50 |     const languageFilePath = resolve(rootPath, resolvedLanguage);
51 | 
52 |     try {
53 |       const defaultLanguageBundle = JSON.parse(
54 |         resolvedLanguage !== defaultLanguage
55 |           ? readFileSync(resolve(rootPath, defaultLanguage), "utf-8")
56 |           : "{}"
57 |       );
58 | 
59 |       const resolvedLanguageBundle = JSON.parse(
60 |         readFileSync(languageFilePath, "utf-8")
61 |       );
62 | 
63 |       return { ...defaultLanguageBundle, ...resolvedLanguageBundle };
64 |     } catch (err) {
65 |       throw err;
66 |     }
67 |   }
68 | 
69 |   private recurseCandidates(
70 |     rootPath: string,
71 |     format: string,
72 |     candidate: string
73 |   ): string {
74 |     const filename = format.replace("{0}", `.${candidate}`);
75 |     const filepath = resolve(rootPath, filename);
76 |     if (existsSync(filepath)) {
77 |       return filename;
78 |     }
79 |     if (candidate.split("-")[0] !== candidate) {
80 |       return this.recurseCandidates(rootPath, format, candidate.split("-")[0]);
81 |     }
82 |     return format.replace("{0}", "");
83 |   }
84 | }
85 | 
86 | export default Localize.prototype.localize.bind(new Localize());
87 | 


--------------------------------------------------------------------------------
/src/lockfile.ts:
--------------------------------------------------------------------------------
 1 | import * as lockfile from "lockfile";
 2 | import { Util } from "./util";
 3 | 
 4 | interface IOptions {
 5 |   wait?: number;
 6 |   pollPeriod?: number;
 7 |   stale?: number;
 8 |   retries?: number;
 9 |   retryWait?: number;
10 | }
11 | 
12 | export default {
13 |   Check,
14 |   Lock,
15 |   Unlock
16 | };
17 | 
18 | export function Check(
19 |   filepath: string,
20 |   options: IOptions = {}
21 | ): Promise<boolean> {
22 |   return Util.promisify(lockfile.check)(filepath, options);
23 | }
24 | 
25 | export function Lock(
26 |   filepath: string,
27 |   options: IOptions = {}
28 | ): Promise<boolean> {
29 |   return Util.promisify(lockfile.lock)(filepath, options);
30 | }
31 | 
32 | export function Unlock(filepath: string): Promise<boolean> {
33 |   return Util.promisify(lockfile.unlock)(filepath);
34 | }
35 | 


--------------------------------------------------------------------------------
/src/models/cloudSettings.model.ts:
--------------------------------------------------------------------------------
1 | import { Environment } from "../environmentPath";
2 | 
3 | export class CloudSettings {
4 |   public lastUpload: Date = null;
5 |   public extensionVersion: string = "v" + Environment.getVersion();
6 | }
7 | 


--------------------------------------------------------------------------------
/src/models/customConfig.model.ts:
--------------------------------------------------------------------------------
 1 | import { Environment } from "../environmentPath";
 2 | 
 3 | export class CustomConfig {
 4 |   public ignoreUploadFiles: string[] = [
 5 |     "state.*",
 6 |     "syncLocalSettings.json",
 7 |     ".DS_Store",
 8 |     "sync.lock",
 9 |     "projects.json",
10 |     "projects_cache_vscode.json",
11 |     "projects_cache_git.json",
12 |     "projects_cache_svn.json",
13 |     "gpm_projects.json",
14 |     "gpm-recentItems.json"
15 |   ];
16 |   public ignoreUploadFolders: string[] = ["workspaceStorage"];
17 |   public ignoreExtensions: string[] = [];
18 |   public gistDescription: string = "Visual Studio Code Settings Sync Gist";
19 |   public version: number = Environment.CURRENT_VERSION;
20 |   public token: string = "";
21 |   public downloadPublicGist: boolean = false;
22 |   public supportedFileExtensions: string[] = ["json", "code-snippets"];
23 |   public openTokenLink: boolean = true;
24 |   public disableUpdateMessage: boolean = false;
25 |   public lastUpload: Date = null;
26 |   public lastDownload: Date = null;
27 |   public githubEnterpriseUrl: string = null;
28 |   public askGistDescription: boolean = false;
29 |   public customFiles: { [key: string]: string } = {};
30 |   public hostName: string = null;
31 |   public universalKeybindings: boolean = false;
32 |   public autoUploadDelay: number = 20;
33 | }
34 | 


--------------------------------------------------------------------------------
/src/models/extensionConfig.model.ts:
--------------------------------------------------------------------------------
 1 | export class ExtensionConfig {
 2 |   public gist = null;
 3 |   public quietSync = false;
 4 |   public removeExtensions = true;
 5 |   public syncExtensions = true;
 6 |   public autoDownload = false;
 7 |   public autoUpload = false;
 8 |   public forceDownload = false;
 9 |   public forceUpload = false;
10 | }
11 | 


--------------------------------------------------------------------------------
/src/models/language-pack.model.ts:
--------------------------------------------------------------------------------
1 | export interface ILanguagePack {
2 |   [key: string]: string;
3 | }
4 | 


--------------------------------------------------------------------------------
/src/models/localConfig.model.ts:
--------------------------------------------------------------------------------
 1 | import { CustomConfig } from "./customConfig.model";
 2 | import { ExtensionConfig } from "./extensionConfig.model";
 3 | 
 4 | export class LocalConfig {
 5 |   public publicGist: boolean = false;
 6 |   public userName: string = null;
 7 |   public name: string = null;
 8 |   public extConfig = new ExtensionConfig();
 9 |   public customConfig = new CustomConfig();
10 | }
11 | 


--------------------------------------------------------------------------------
/src/models/settingType.model.ts:
--------------------------------------------------------------------------------
1 | export enum UISettingType {
2 |   TextInput = "textinput",
3 |   NumberInput = "numberinput",
4 |   Checkbox = "checkbox",
5 |   TextArea = "textarea"
6 | }
7 | 


--------------------------------------------------------------------------------
/src/models/state.model.ts:
--------------------------------------------------------------------------------
 1 | import { ExtensionContext } from "vscode";
 2 | import Commons from "../commons";
 3 | import { Environment } from "../environmentPath";
 4 | 
 5 | export interface IExtensionState {
 6 |   context?: ExtensionContext;
 7 |   environment?: Environment;
 8 |   commons?: Commons;
 9 |   instanceID: string;
10 | }
11 | 


--------------------------------------------------------------------------------
/src/models/webview.model.ts:
--------------------------------------------------------------------------------
 1 | import { WebviewPanel } from "vscode";
 2 | 
 3 | export interface IWebview {
 4 |   name: string;
 5 |   htmlPath: string;
 6 |   htmlContent?: string;
 7 |   webview?: WebviewPanel;
 8 |   replaceables: Array<{}>;
 9 | }
10 | 


--------------------------------------------------------------------------------
/src/pragmaUtil.ts:
--------------------------------------------------------------------------------
  1 | import { OsType } from "./enums";
  2 | import { osTypeFromString, SUPPORTED_OS } from "./environmentPath";
  3 | import localize from "./localize";
  4 | 
  5 | /**
  6 |  * Comment/Uncomment lines if matches OS name or Hostname.
  7 |  * Usage: @sync os=[OS name] host=[hostName]
  8 |  * Notes: Hostname must be defined in sync.host setting. It could be used for parse any JSON valid string.
  9 |  * @export
 10 |  * @class PragmaUtil
 11 |  */
 12 | export default class PragmaUtil {
 13 |   /**
 14 |    * Process @sync pragma statements before file is saved.
 15 |    * Comment lines that don't match with the user OS or host value.
 16 |    * @static
 17 |    * @param {string} newContent a valid JSON string
 18 |    * @returns {string}
 19 |    * @memberof PragmaUtil
 20 |    */
 21 |   public static processBeforeWrite(
 22 |     localContent: string,
 23 |     newContent: string,
 24 |     osType: OsType,
 25 |     hostName: string
 26 |   ): string {
 27 |     const parsedLines: string[] = [];
 28 |     const lines = newContent.split("\n");
 29 |     let osMatch: RegExpMatchArray;
 30 |     let osFromPragma: string;
 31 | 
 32 |     let hostMatch: RegExpMatchArray;
 33 |     let hostFromPragma: string;
 34 | 
 35 |     let envMatch: RegExpMatchArray;
 36 |     let envFromPragma: string;
 37 |     let currentLine: string = "";
 38 | 
 39 |     for (let index = 0; index < lines.length; index++) {
 40 |       let shouldComment = false;
 41 |       currentLine = lines[index];
 42 |       if (this.PragmaRegExp.test(currentLine)) {
 43 |         try {
 44 |           // check OS pragma
 45 |           osMatch = currentLine.match(/os=(\w+)/);
 46 |           if (osMatch !== null) {
 47 |             osFromPragma = osMatch[1].toLowerCase();
 48 | 
 49 |             if (!SUPPORTED_OS.includes(osFromPragma)) {
 50 |               continue;
 51 |             }
 52 |             if (osTypeFromString(osFromPragma) !== osType) {
 53 |               shouldComment = true;
 54 |             }
 55 |           }
 56 |           // check host pragma
 57 |           hostMatch = currentLine.match(/host=(\S+)/);
 58 |           if (hostMatch !== null) {
 59 |             hostFromPragma = hostMatch[1];
 60 |             if (
 61 |               hostName === null ||
 62 |               hostName === "" ||
 63 |               hostFromPragma.toLowerCase() !== hostName.toLowerCase()
 64 |             ) {
 65 |               shouldComment = true;
 66 |             }
 67 |           }
 68 | 
 69 |           // check env pragma
 70 |           envMatch = currentLine.match(/env=(\S+)/);
 71 |           if (envMatch !== null) {
 72 |             envFromPragma = envMatch[1];
 73 |             if (process.env[envFromPragma.toUpperCase()] === undefined) {
 74 |               shouldComment = true;
 75 |             }
 76 |           }
 77 |           parsedLines.push(currentLine);
 78 |           index = this.checkNextLines(
 79 |             lines,
 80 |             parsedLines,
 81 |             index,
 82 |             false,
 83 |             shouldComment
 84 |           );
 85 |         } catch (e) {
 86 |           console.error("Sync: Error processing pragmas ", e.message);
 87 |           continue;
 88 |         }
 89 |       } else if (this.IgnorePragmaRegExp.test(currentLine)) {
 90 |         index = this.checkNextLines(lines, parsedLines, index, true, false);
 91 |       } else {
 92 |         parsedLines.push(currentLine);
 93 |       }
 94 |     }
 95 | 
 96 |     let result = parsedLines.join("\n");
 97 |     const ignoredBlocks = this.getIgnoredBlocks(localContent); // get the settings that must prevail
 98 |     if (ignoredBlocks) {
 99 |       result = result.replace(/{\s*\n/, `{\n${ignoredBlocks}\n\n\n`); // 3 lines breaks to separate from other settings
100 |     }
101 |     // check is a valid JSON
102 | 
103 |     // remove comments and trailing comma
104 |     const uncommented = this.removeAllComments(result).replace(/,\s*\}/g, " }");
105 |     try {
106 |       JSON.parse(uncommented);
107 |     } catch (e) {
108 |       console.error(
109 |         "Sync: Result content is not a valid JSON.",
110 |         e.message,
111 |         uncommented
112 |       );
113 |     }
114 | 
115 |     return result;
116 |   }
117 | 
118 |   /**
119 |    * Remove @sync-ignore settings before upload.
120 |    *
121 |    * @static
122 |    * @param {string} fileContent
123 |    * @returns {string}
124 |    * @memberof PragmaUtil
125 |    */
126 |   public static async processBeforeUpload(
127 |     fileContent: string
128 |   ): Promise<string> {
129 |     const lines = fileContent.split("\n");
130 |     let osMatch: RegExpMatchArray;
131 |     let osFromPragma: string;
132 | 
133 |     let hostMatch: RegExpMatchArray;
134 |     let hostFromPragma: string;
135 | 
136 |     let envMatch: RegExpMatchArray;
137 |     let envFromPragma: string;
138 | 
139 |     const parsedLines: string[] = [];
140 |     let currentLine = "";
141 | 
142 |     for (let index = 0; index < lines.length; index++) {
143 |       currentLine = lines[index];
144 | 
145 |       if (this.IgnorePragmaRegExp.test(currentLine)) {
146 |         index = this.checkNextLines(lines, parsedLines, index, true);
147 |       } else if (this.PragmaRegExp.test(currentLine)) {
148 |         // alert not supported OS
149 |         osMatch = currentLine.match(this.OSPragmaWhiteSpacesSupportRegExp);
150 |         if (osMatch !== null) {
151 |           osFromPragma = osMatch[1] || osMatch[2] || osMatch[3];
152 | 
153 |           if (osFromPragma !== "" && /\s/.test(osFromPragma)) {
154 |             currentLine = currentLine.replace(
155 |               osFromPragma,
156 |               osFromPragma.trimLeft()
157 |             );
158 |           }
159 | 
160 |           const trimmed = osFromPragma.toLowerCase().trim();
161 |           if (!SUPPORTED_OS.includes(trimmed)) {
162 |             console.warn("Sync: Invalid OS", osFromPragma);
163 |             throw new Error(
164 |               localize(
165 |                 "cmd.updateSettings.warning.OSNotSupported",
166 |                 trimmed,
167 |                 index + 1
168 |               )
169 |             );
170 |           }
171 |         }
172 | 
173 |         hostMatch = currentLine.match(this.HostPragmaWhiteSpacesSupportRegExp);
174 |         if (hostMatch !== null) {
175 |           hostFromPragma = hostMatch[1] || hostMatch[2] || hostMatch[3];
176 |           if (hostFromPragma !== "" && /\s/.test(hostFromPragma)) {
177 |             currentLine = currentLine.replace(
178 |               hostFromPragma,
179 |               hostFromPragma.trimLeft()
180 |             );
181 |           }
182 |         }
183 | 
184 |         envMatch = currentLine.match(this.EnvPragmaWhiteSpacesSupportRegExp);
185 |         if (envMatch !== null) {
186 |           envFromPragma = envMatch[1] || envMatch[2] || envMatch[3];
187 |           if (envFromPragma !== "" && /\s/.test(envFromPragma)) {
188 |             currentLine = currentLine.replace(
189 |               envFromPragma,
190 |               envFromPragma.trimLeft()
191 |             );
192 |           }
193 |         }
194 | 
195 |         parsedLines.push(currentLine);
196 |         index = this.checkNextLines(lines, parsedLines, index, false, false);
197 |       } else {
198 |         parsedLines.push(currentLine);
199 |       }
200 |     }
201 |     return parsedLines.join("\n");
202 |   }
203 | 
204 |   public static getIgnoredBlocks(content: string): string {
205 |     content = content.replace(/\@sync ignore/g, "@sync-ignore");
206 |     const ignoredLines: string[] = [];
207 |     const lines = content.split("\n");
208 |     let currentLine = "";
209 |     for (let index = 0; index < lines.length; index++) {
210 |       currentLine = lines[index];
211 |       if (this.IgnorePragmaRegExp.test(currentLine)) {
212 |         ignoredLines.push(currentLine);
213 |         index = this.checkNextLines(
214 |           lines,
215 |           ignoredLines,
216 |           index,
217 |           false,
218 |           false,
219 |           true
220 |         );
221 |       }
222 |     }
223 |     return ignoredLines.join("\n");
224 |   }
225 | 
226 |   public static removeAllComments(text: string): string {
227 |     return text.replace(/(?<!["'].*)\s*(\/\/.+)|(\/\*.+\*\/)(?!["'].*)/g, "");
228 |   }
229 | 
230 |   private static readonly PragmaRegExp: RegExp = /\/{2}[\s\t]*\@sync[\s\t]+(?:os=.+[\s\t]*)?(?:host=.+[\s\t]*)?(?:env=.+[\s\t]*)?/;
231 |   private static readonly IgnorePragmaRegExp: RegExp = /\/{2}[\s\t]*\@sync-ignore/;
232 |   private static readonly HostPragmaWhiteSpacesSupportRegExp = /(?:host=(.+)os=)|(?:host=(.+)env=)|host=(.+)\n?/;
233 |   private static readonly OSPragmaWhiteSpacesSupportRegExp = /(?:os=(.+)host=)|(?:os=(.+)env=)|os=(.+)\n?/;
234 |   private static readonly EnvPragmaWhiteSpacesSupportRegExp = /(?:env=(.+)host=)|(?:env=(.+)os=)|env=(.+)\n?/;
235 |   private static readonly OpenBlockRegExp = /['"]\s*?:\s*[{\[]+\n*/;
236 |   // Use negative lookahead/behind to avoid errors with strings containing closing brackets
237 |   private static readonly CloseBlockRegExp = /(?<!["'].*)[}\]]+(?!["'].*)/;
238 | 
239 |   private static toggleComments(line: string, shouldComment: boolean) {
240 |     const isCommented = line.trim().startsWith("//");
241 |     if (shouldComment) {
242 |       // Replace with RegEx to help match indent size
243 |       return !isCommented ? line.replace(/^(\s*)/, "$1// ") : line;
244 |     } else {
245 |       // Only remove if line is commented
246 |       return isCommented ? line.replace(/\/\/\s*/, "") : line;
247 |     }
248 | 
249 |     return line;
250 |   }
251 | 
252 |   // checks and advance index
253 |   private static checkNextLines(
254 |     lines: string[],
255 |     parsedLines: string[],
256 |     currentIndex: number,
257 |     shouldIgnore: boolean,
258 |     shouldComment: boolean = false,
259 |     checkTrailingComma: boolean = false
260 |   ): number {
261 |     let currentLine = lines[++currentIndex]; // check the next line for comments
262 | 
263 |     if (checkTrailingComma && !currentLine.trim().endsWith(",")) {
264 |       currentLine = currentLine.trimRight() + ",";
265 |     }
266 |     // nothing more to do, just add the line to the parsedLines array
267 |     if (!shouldIgnore) {
268 |       parsedLines.push(this.toggleComments(currentLine, shouldComment));
269 |     }
270 | 
271 |     let openBlocks = this.OpenBlockRegExp.test(currentLine) ? 1 : 0;
272 |     while (openBlocks > 0) {
273 |       currentLine = lines[++currentIndex];
274 |       if (this.OpenBlockRegExp.test(currentLine)) {
275 |         ++openBlocks;
276 |       } else if (this.CloseBlockRegExp.test(currentLine)) {
277 |         --openBlocks;
278 |         if (checkTrailingComma && !currentLine.trim().endsWith(",")) {
279 |           // we add a coma to avoid parse error when we paste the ignored settings at the
280 |           // beginning of the file
281 |           currentLine = currentLine.trimRight() + ",";
282 |         }
283 |       }
284 |       if (!shouldIgnore) {
285 |         parsedLines.push(this.toggleComments(currentLine, shouldComment));
286 |       }
287 |     }
288 | 
289 |     return currentIndex;
290 |   }
291 | }
292 | 


--------------------------------------------------------------------------------
/src/service/autoUpload.service.ts:
--------------------------------------------------------------------------------
  1 | import * as vscode from "vscode";
  2 | import { watch } from "vscode-chokidar";
  3 | import localize from "../localize";
  4 | import lockfile from "../lockfile";
  5 | import { CustomConfig } from "../models/customConfig.model";
  6 | import { state } from "../state";
  7 | import { Util } from "../util";
  8 | import { FileService } from "./file.service";
  9 | 
 10 | export class AutoUploadService {
 11 |   public static GetIgnoredItems(customSettings: CustomConfig) {
 12 |     return [
 13 |       ...customSettings.ignoreUploadFolders.map(folder => `**/${folder}/**`),
 14 |       ...customSettings.ignoreUploadFiles.map(file => `**/${file}`)
 15 |     ];
 16 |   }
 17 | 
 18 |   public watching = false;
 19 | 
 20 |   private watcher = watch(state.environment.USER_FOLDER, {
 21 |     depth: 2,
 22 |     ignored: this.ignored
 23 |   });
 24 | 
 25 |   constructor(private ignored: string[]) {
 26 |     vscode.extensions.onDidChange(async () => {
 27 |       if (this.watching && vscode.window.state.focused) {
 28 |         console.log("Sync: Extensions changed");
 29 |         if (await lockfile.Check(state.environment.FILE_SYNC_LOCK)) {
 30 |           return;
 31 |         } else {
 32 |           await lockfile.Lock(state.environment.FILE_SYNC_LOCK);
 33 |         }
 34 |         const customConfig = await state.commons.GetCustomSettings();
 35 |         if (!customConfig.downloadPublicGist) {
 36 |           await this.InitiateAutoUpload();
 37 |         }
 38 |         await lockfile.Unlock(state.environment.FILE_SYNC_LOCK);
 39 |         return;
 40 |       }
 41 |     });
 42 |   }
 43 | 
 44 |   public async StartWatching() {
 45 |     this.StopWatching();
 46 | 
 47 |     this.watching = true;
 48 | 
 49 |     this.watcher.addListener("change", async (path: string) => {
 50 |       if (this.watching && vscode.window.state.focused) {
 51 |         console.log(`Sync: ${FileService.ExtractFileName(path)} changed`);
 52 |         if (await lockfile.Check(state.environment.FILE_SYNC_LOCK)) {
 53 |           return;
 54 |         } else {
 55 |           await lockfile.Lock(state.environment.FILE_SYNC_LOCK);
 56 |         }
 57 | 
 58 |         const customConfig = await state.commons.GetCustomSettings();
 59 |         if (customConfig) {
 60 |           const fileType: string = path
 61 |             .substring(path.lastIndexOf("."), path.length)
 62 |             .slice(1);
 63 |           if (
 64 |             customConfig.supportedFileExtensions.includes(fileType) &&
 65 |             !customConfig.downloadPublicGist
 66 |           ) {
 67 |             await this.InitiateAutoUpload();
 68 |           }
 69 |         }
 70 |         await lockfile.Unlock(state.environment.FILE_SYNC_LOCK);
 71 |         return;
 72 |       }
 73 |     });
 74 |   }
 75 | 
 76 |   public StopWatching() {
 77 |     if (this.watcher) {
 78 |       this.watcher.removeAllListeners();
 79 |     }
 80 |     this.watching = false;
 81 |   }
 82 | 
 83 |   private async InitiateAutoUpload() {
 84 |     const customSettings = await state.commons.GetCustomSettings();
 85 | 
 86 |     vscode.window.setStatusBarMessage("").dispose();
 87 |     vscode.window.setStatusBarMessage(
 88 |       localize("common.info.initAutoUpload").replace(
 89 |         "{0}",
 90 |         customSettings.autoUploadDelay
 91 |       ),
 92 |       5000
 93 |     );
 94 | 
 95 |     await Util.Sleep(customSettings.autoUploadDelay * 1000);
 96 | 
 97 |     vscode.commands.executeCommand("extension.updateSettings", "forceUpdate");
 98 |   }
 99 | }
100 | 


--------------------------------------------------------------------------------
/src/service/file.service.ts:
--------------------------------------------------------------------------------
  1 | "use strict";
  2 | 
  3 | import * as fs from "fs-extra";
  4 | import * as path from "path";
  5 | import * as recursiveRead from "recursive-readdir";
  6 | import { CustomConfig } from "../models/customConfig.model";
  7 | 
  8 | export class File {
  9 |   constructor(
 10 |     public fileName: string,
 11 |     public content: string,
 12 |     public filePath: string,
 13 |     public gistName: string
 14 |   ) {}
 15 | }
 16 | export class FileService {
 17 |   public static CUSTOMIZED_SYNC_PREFIX = "|customized_sync|";
 18 | 
 19 |   public static async ReadFile(filePath: string): Promise<string> {
 20 |     try {
 21 |       const data = await fs.readFile(filePath, { encoding: "utf8" });
 22 |       return data;
 23 |     } catch (err) {
 24 |       console.error(err);
 25 |       throw err;
 26 |     }
 27 |   }
 28 | 
 29 |   public static async IsDirectory(filepath: string): Promise<boolean> {
 30 |     try {
 31 |       const stat = await fs.lstat(filepath);
 32 |       return stat.isDirectory();
 33 |     } catch (err) {
 34 |       return false;
 35 |     }
 36 |   }
 37 | 
 38 |   public static async GetFile(
 39 |     filePath: string,
 40 |     fileName: string
 41 |   ): Promise<File> {
 42 |     const fileExists: boolean = await FileService.FileExists(filePath);
 43 | 
 44 |     if (!fileExists) {
 45 |       return null;
 46 |     }
 47 | 
 48 |     const content = await FileService.ReadFile(filePath);
 49 | 
 50 |     if (content === null) {
 51 |       return null;
 52 |     }
 53 | 
 54 |     const pathFromUser: string = filePath.substring(
 55 |       filePath.lastIndexOf("User") + 5,
 56 |       filePath.length
 57 |     );
 58 | 
 59 |     const arr: string[] = pathFromUser.indexOf("/")
 60 |       ? pathFromUser.split("/")
 61 |       : pathFromUser.split(path.sep);
 62 | 
 63 |     let gistName: string = "";
 64 | 
 65 |     arr.forEach((element, index) => {
 66 |       if (index < arr.length - 1) {
 67 |         gistName += element + "|";
 68 |       } else {
 69 |         gistName += element;
 70 |       }
 71 |     });
 72 | 
 73 |     const file: File = new File(fileName, content, filePath, gistName);
 74 |     return file;
 75 |   }
 76 | 
 77 |   public static async WriteFile(
 78 |     filePath: string,
 79 |     data: string
 80 |   ): Promise<boolean> {
 81 |     if (!data) {
 82 |       console.error(
 83 |         new Error(
 84 |           "Unable to write file. FilePath :" + filePath + " Data :" + data
 85 |         )
 86 |       );
 87 |       return false;
 88 |     }
 89 |     try {
 90 |       await fs.writeFile(filePath, data);
 91 |       return true;
 92 |     } catch (err) {
 93 |       console.error(err);
 94 |       return false;
 95 |     }
 96 |   }
 97 | 
 98 |   public static async ListFiles(
 99 |     directory: string,
100 |     customSettings: CustomConfig
101 |   ): Promise<File[]> {
102 |     function folderMatcher(file: string, stats: fs.Stats) {
103 |       if (stats.isDirectory()) {
104 |         return customSettings.ignoreUploadFolders.some(fold => {
105 |           return file.split(path.sep).includes(fold);
106 |         });
107 |       }
108 |       return false;
109 |     }
110 |     function fileExtensionMatcher(file: string, stats: fs.Stats) {
111 |       if (stats.isDirectory()) {
112 |         return false;
113 |       }
114 |       const ext = path.extname(file).slice(1);
115 |       if (!customSettings.supportedFileExtensions.includes(ext)) {
116 |         return true;
117 |       }
118 |       return false;
119 |     }
120 |     const files = await recursiveRead(directory, [
121 |       ...customSettings.ignoreUploadFiles,
122 |       folderMatcher,
123 |       fileExtensionMatcher
124 |     ]);
125 |     return Promise.all(
126 |       files.map(file => {
127 |         return FileService.GetFile(file, path.basename(file));
128 |       })
129 |     );
130 |   }
131 | 
132 |   public static async CreateDirTree(
133 |     userFolder: string,
134 |     fileName: string
135 |   ): Promise<string> {
136 |     let fullPath: string = userFolder;
137 |     let result: string;
138 | 
139 |     let paths: string[] = null;
140 |     if (fileName.indexOf("|") > -1) {
141 |       paths = fileName.split("|");
142 |     } else if (fileName.indexOf("//") > -1) {
143 |       paths = fileName.split("//");
144 |     } else if (fileName.indexOf("\\") > -1) {
145 |       paths = fileName.split("\\");
146 |     }
147 | 
148 |     if (paths != null) {
149 |       for (let i = 0; i < paths.length - 1; i++) {
150 |         const element = paths[i];
151 |         fullPath += element + path.sep;
152 |         await FileService.CreateDirectory(fullPath);
153 |       }
154 | 
155 |       result = fullPath + paths[paths.length - 1];
156 |       return result;
157 |     } else {
158 |       result = fullPath + fileName;
159 | 
160 |       return result;
161 |     }
162 |   }
163 | 
164 |   public static async DeleteFile(filePath: string): Promise<boolean> {
165 |     try {
166 |       const stat: boolean = await FileService.FileExists(filePath);
167 |       if (stat) {
168 |         await fs.unlink(filePath);
169 |       }
170 |       return true;
171 |     } catch (err) {
172 |       console.error("Unable to delete file. File Path is :" + filePath);
173 |       return false;
174 |     }
175 |   }
176 | 
177 |   public static async FileExists(filePath: string): Promise<boolean> {
178 |     try {
179 |       await fs.access(filePath, fs.constants.F_OK);
180 |       return true;
181 |     } catch (err) {
182 |       return false;
183 |     }
184 |   }
185 | 
186 |   public static async CreateDirectory(name: string): Promise<boolean> {
187 |     try {
188 |       await fs.mkdir(name);
189 |       return true;
190 |     } catch (err) {
191 |       if (err.code === "EEXIST") {
192 |         return false;
193 |       }
194 |       throw err;
195 |     }
196 |   }
197 | 
198 |   public static async GetCustomFile(
199 |     filePath: string,
200 |     fileName: string
201 |   ): Promise<File> {
202 |     const fileExists: boolean = await FileService.FileExists(filePath);
203 | 
204 |     if (!fileExists) {
205 |       return null;
206 |     }
207 | 
208 |     const content = await FileService.ReadFile(filePath);
209 | 
210 |     if (content === null) {
211 |       return null;
212 |     }
213 | 
214 |     // for identifing Customized Sync file
215 |     const gistName: string = FileService.CUSTOMIZED_SYNC_PREFIX + fileName;
216 | 
217 |     const file: File = new File(fileName, content, filePath, gistName);
218 |     return file;
219 |   }
220 | 
221 |   public static async CreateCustomDirTree(filePath: string): Promise<string> {
222 |     const dir = path.dirname(filePath);
223 |     const fileExists = await FileService.FileExists(dir);
224 | 
225 |     if (!fileExists) {
226 |       // mkdir recursively
227 |       await fs.mkdirs(dir);
228 |     }
229 | 
230 |     return filePath;
231 |   }
232 | 
233 |   public static ExtractFileName(fullPath: string): string {
234 |     return path.basename(fullPath);
235 |   }
236 | 
237 |   public static ConcatPath(...filePaths: string[]): string {
238 |     return filePaths.join(path.sep);
239 |   }
240 | }
241 | 


--------------------------------------------------------------------------------
/src/service/github.oauth.service.ts:
--------------------------------------------------------------------------------
  1 | import * as express from "express";
  2 | import { Server } from "http";
  3 | import fetch from "node-fetch";
  4 | import { URL, URLSearchParams } from "url";
  5 | import Commons from "../commons";
  6 | import { state } from "../state";
  7 | 
  8 | export class GitHubOAuthService {
  9 |   public app: express.Express;
 10 |   public server: Server;
 11 | 
 12 |   constructor(public port: number) {
 13 |     this.app = express();
 14 |     this.app.use(express.json(), express.urlencoded({ extended: false }));
 15 |   }
 16 | 
 17 |   public async StartProcess(cmd?: string) {
 18 |     const customSettings = await state.commons.GetCustomSettings();
 19 |     const host = customSettings.githubEnterpriseUrl
 20 |       ? new URL(customSettings.githubEnterpriseUrl)
 21 |       : new URL("https://github.com");
 22 | 
 23 |     this.server = this.app.listen(this.port);
 24 |     this.app.get("/callback", async (req, res) => {
 25 |       try {
 26 |         const params = new URLSearchParams(
 27 |           await (await this.getToken(req.param("code"), host)).text()
 28 |         );
 29 | 
 30 |         res.send(`
 31 |         <!doctype html>
 32 |         <html lang="en">
 33 |           <head>
 34 |             <meta charset="utf-8">
 35 |             <meta
 36 |               http-equiv="Content-Security-Policy"
 37 |               content="default-src vscode-resource:; form-action vscode-resource:; frame-ancestors vscode-resource:; img-src vscode-resource: https:; script-src 'self' 'unsafe-inline' vscode-resource:; style-src 'self' 'unsafe-inline' vscode-resource:;"
 38 |             />
 39 |             <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
 40 |           </head>
 41 |           <body>
 42 |               <h1>Success! You may now close this tab.</h1>
 43 |               <style>
 44 |                 html, body {
 45 |                   background-color: #1a1a1a;
 46 |                   color: #c3c3c3;
 47 |                   display: flex;
 48 |                   justify-content: center;
 49 |                   align-items: center;
 50 |                   height: 100%;
 51 |                   width: 100%;
 52 |                   margin: 0;
 53 |                 }
 54 |               </style>
 55 |           </body>
 56 |         </html>
 57 |         `);
 58 |         this.server.close();
 59 | 
 60 |         const token = params.get("access_token");
 61 |         this.saveToken(token);
 62 | 
 63 |         const user = await this.getUser(token, host);
 64 | 
 65 |         const gists: any[] = await this.getGists(token, user, host);
 66 | 
 67 |         const gistViewList: any[] = gists.map(m => {
 68 |           return {
 69 |             id: m.id,
 70 |             description: m.description,
 71 |             updated_at: m.updated_at
 72 |           };
 73 |         });
 74 | 
 75 |         state.commons.webviewService.OpenGistSelectionpage(gistViewList, cmd);
 76 |       } catch (err) {
 77 |         const error = new Error(err);
 78 |         Commons.LogException(error, state.commons.ERROR_MESSAGE, true);
 79 |       }
 80 |     });
 81 |   }
 82 | 
 83 |   public getToken(code: string, host: URL) {
 84 |     const params = new URLSearchParams();
 85 |     params.append("client_id", "cfd96460d8b110e2351b");
 86 |     params.append("client_secret", "ed46bd3a0f736e0da57308e86ca5fa3cf8688582");
 87 |     params.append("code", code);
 88 | 
 89 |     const promise = fetch(`https://${host.hostname}/login/oauth/access_token`, {
 90 |       method: "POST",
 91 |       body: params
 92 |     });
 93 | 
 94 |     promise.catch(err => {
 95 |       Commons.LogException(err, "Sync: Invalid GitHub Enterprise URL.", true);
 96 |     });
 97 | 
 98 |     return promise;
 99 |   }
100 | 
101 |   public async getGists(token: string, user: string, host: URL) {
102 |     const promise = fetch(`https://api.${host.hostname}/users/${user}/gists`, {
103 |       method: "GET",
104 |       headers: { Authorization: `token ${token}` }
105 |     });
106 | 
107 |     promise.catch(err => {
108 |       Commons.LogException(err, "Sync: Invalid GitHub Enterprise URL.", true);
109 |     });
110 | 
111 |     const res = await promise;
112 |     const gists = await res.json();
113 |     return gists;
114 |   }
115 | 
116 |   public async saveToken(token: string) {
117 |     const currentSettings = await state.commons.GetCustomSettings();
118 |     currentSettings.token = token;
119 |     state.commons.SetCustomSettings(currentSettings);
120 |   }
121 | 
122 |   public async getUser(token: string, host: URL) {
123 |     const promise = fetch(`https://api.${host.hostname}/user`, {
124 |       method: "GET",
125 |       headers: { Authorization: `token ${token}` }
126 |     });
127 | 
128 |     promise.catch(err => {
129 |       Commons.LogException(err, "Sync: Invalid GitHub Enterprise URL.", true);
130 |     });
131 | 
132 |     const res = await promise;
133 |     const json = await res.json();
134 |     return json.login;
135 |   }
136 | }
137 | 


--------------------------------------------------------------------------------
/src/service/github.service.ts:
--------------------------------------------------------------------------------
  1 | "use strict";
  2 | 
  3 | import * as GitHubApi from "@octokit/rest";
  4 | import * as HttpsProxyAgent from "https-proxy-agent";
  5 | import * as vscode from "vscode";
  6 | import Commons from "../commons";
  7 | import { CloudSettings } from "../models/cloudSettings.model";
  8 | import { state } from "../state";
  9 | import { File } from "./file.service";
 10 | 
 11 | interface IEnv {
 12 |   [key: string]: string | undefined;
 13 |   http_proxy: string;
 14 |   HTTP_PROXY: string;
 15 | }
 16 | 
 17 | interface IFixGistResponse extends Omit<GitHubApi.GistsGetResponse, "files"> {
 18 |   files: any | GitHubApi.GistsGetResponseFiles;
 19 | }
 20 | 
 21 | export class GitHubService {
 22 |   public userName: string = null;
 23 |   public name: string = null;
 24 |   private github: GitHubApi = null;
 25 |   private GIST_JSON_EMPTY: any = {
 26 |     description: "Visual Studio Code Sync Settings Gist",
 27 |     public: false,
 28 |     files: {
 29 |       "settings.json": {
 30 |         content: "// Empty"
 31 |       },
 32 |       "launch.json": {
 33 |         content: "// Empty"
 34 |       },
 35 |       "keybindings.json": {
 36 |         content: "// Empty"
 37 |       },
 38 |       "extensions.json": {
 39 |         content: "// Empty"
 40 |       },
 41 |       "locale.json": {
 42 |         content: "// Empty"
 43 |       },
 44 |       "keybindingsMac.json": {
 45 |         content: "// Empty"
 46 |       },
 47 |       cloudSettings: {
 48 |         content: "// Empty"
 49 |       }
 50 |     }
 51 |   };
 52 | 
 53 |   constructor(userToken: string, basePath: string) {
 54 |     const githubApiConfig: GitHubApi.Options = {};
 55 | 
 56 |     const proxyURL: string =
 57 |       vscode.workspace.getConfiguration("http").get("proxy") ||
 58 |       (process.env as IEnv).http_proxy ||
 59 |       (process.env as IEnv).HTTP_PROXY;
 60 |     if (basePath) {
 61 |       githubApiConfig.baseUrl = basePath;
 62 |     }
 63 | 
 64 |     if (proxyURL) {
 65 |       githubApiConfig.agent = new HttpsProxyAgent(proxyURL);
 66 |     }
 67 | 
 68 |     if (userToken !== null && userToken !== "") {
 69 |       githubApiConfig.auth = `token ${userToken}`;
 70 |     }
 71 |     try {
 72 |       this.github = new GitHubApi(githubApiConfig);
 73 |     } catch (err) {
 74 |       console.error(err);
 75 |     }
 76 |     if (userToken !== null && userToken !== "") {
 77 |       this.github.users
 78 |         .getAuthenticated({})
 79 |         .then(res => {
 80 |           this.userName = res.data.login;
 81 |           this.name = res.data.name;
 82 |           console.log(
 83 |             "Sync : Connected with user : " + "'" + this.userName + "'"
 84 |           );
 85 |         })
 86 |         .catch(err => {
 87 |           console.error(err);
 88 |         });
 89 |     }
 90 |   }
 91 | 
 92 |   public AddFile(list: File[], GIST_JSON_B: any) {
 93 |     for (const file of list) {
 94 |       if (file.content !== "") {
 95 |         GIST_JSON_B.files[file.gistName] = {};
 96 |         GIST_JSON_B.files[file.gistName].content = file.content;
 97 |       }
 98 |     }
 99 |     return GIST_JSON_B;
100 |   }
101 | 
102 |   public async CreateEmptyGIST(
103 |     publicGist: boolean,
104 |     gistDescription: string
105 |   ): Promise<string> {
106 |     if (publicGist) {
107 |       this.GIST_JSON_EMPTY.public = true;
108 |     } else {
109 |       this.GIST_JSON_EMPTY.public = false;
110 |     }
111 |     if (gistDescription !== null && gistDescription !== "") {
112 |       this.GIST_JSON_EMPTY.description = gistDescription;
113 |     }
114 | 
115 |     try {
116 |       const res = await this.github.gists.create(this.GIST_JSON_EMPTY);
117 |       if (res.data && res.data.id) {
118 |         return res.data.id.toString();
119 |       } else {
120 |         console.error("ID is null");
121 |         console.log("Sync : " + "Response from GitHub is: ");
122 |         console.log(res);
123 |       }
124 |     } catch (err) {
125 |       console.error(err);
126 |       throw err;
127 |     }
128 |   }
129 | 
130 |   // This should return GitHubApi.Response<GitHubApi.GistsGetResponse> but Types are wrong
131 |   public async ReadGist(
132 |     GIST: string
133 |   ): Promise<GitHubApi.Response<IFixGistResponse>> {
134 |     const promise = this.github.gists.get({ gist_id: GIST });
135 |     const res = await promise.catch(err => {
136 |       if (String(err).includes("HttpError: Not Found")) {
137 |         return Commons.LogException(err, "Sync: Invalid Gist ID", true);
138 |       }
139 |       Commons.LogException(err, state.commons.ERROR_MESSAGE, true);
140 |     });
141 |     if (res) {
142 |       return res;
143 |     }
144 |   }
145 | 
146 |   public async IsGistNewer(
147 |     GIST: string,
148 |     localLastDownload: Date
149 |   ): Promise<boolean> {
150 |     const gist = await this.ReadGist(GIST);
151 |     if (!gist) {
152 |       return;
153 |     }
154 |     let gistCloudSetting: CloudSettings = null;
155 |     try {
156 |       gistCloudSetting = JSON.parse(gist.data.files.cloudSettings.content);
157 |       const gistLastUpload = new Date(gistCloudSetting.lastUpload);
158 |       if (!localLastDownload) {
159 |         return false;
160 |       }
161 |       return gistLastUpload > new Date(localLastDownload);
162 |     } catch (err) {
163 |       return false;
164 |     }
165 |   }
166 | 
167 |   public UpdateGIST(gistObject: any, files: File[]): any {
168 |     const allFiles: string[] = Object.keys(gistObject.data.files);
169 |     for (const fileName of allFiles) {
170 |       let exists = false;
171 | 
172 |       for (const settingFile of files) {
173 |         if (settingFile.gistName === fileName) {
174 |           exists = true;
175 |         }
176 |       }
177 | 
178 |       if (!exists && !fileName.startsWith("keybindings")) {
179 |         gistObject.data.files[fileName] = null;
180 |       }
181 |     }
182 | 
183 |     gistObject.data = this.AddFile(files, gistObject.data);
184 |     return gistObject;
185 |   }
186 | 
187 |   public async SaveGIST(gistObject: any): Promise<boolean> {
188 |     gistObject.gist_id = gistObject.id;
189 |     // tslint:disable-next-line:comment-format
190 |     //TODO : use github.gists.update when issue is fixed.
191 |     const promise = this.github.request("PATCH /gists/:gist_id", gistObject);
192 |     const res = await promise.catch(err => {
193 |       if (String(err).includes("HttpError: Not Found")) {
194 |         return Commons.LogException(err, "Sync: Invalid Gist ID", true);
195 |       }
196 |       Commons.LogException(err, state.commons.ERROR_MESSAGE, true);
197 |     });
198 | 
199 |     if (res) {
200 |       return true;
201 |     }
202 |   }
203 | }
204 | 


--------------------------------------------------------------------------------
/src/service/plugin.service.ts:
--------------------------------------------------------------------------------
  1 | "use strict";
  2 | import * as vscode from "vscode";
  3 | 
  4 | export class ExtensionInformation {
  5 |   public static fromJSON(text: string) {
  6 |     try {
  7 |       // TODO: JSON.parse may throw error
  8 |       // Throw custom error should be more friendly
  9 |       const obj = JSON.parse(text);
 10 |       const meta = new ExtensionMetadata(
 11 |         obj.meta.galleryApiUrl,
 12 |         obj.meta.id,
 13 |         obj.meta.downloadUrl,
 14 |         obj.meta.publisherId,
 15 |         obj.meta.publisherDisplayName,
 16 |         obj.meta.date
 17 |       );
 18 |       const item = new ExtensionInformation();
 19 |       item.metadata = meta;
 20 |       item.name = obj.name;
 21 |       item.publisher = obj.publisher;
 22 |       item.version = obj.version;
 23 |       return item;
 24 |     } catch (err) {
 25 |       throw new Error(err);
 26 |     }
 27 |   }
 28 | 
 29 |   public static fromJSONList(text: string) {
 30 |     const extList: ExtensionInformation[] = [];
 31 |     try {
 32 |       // TODO: JSON.parse may throw error
 33 |       // Throw custom error should be more friendly
 34 |       const list = JSON.parse(text);
 35 |       list.forEach(obj => {
 36 |         const meta = new ExtensionMetadata(
 37 |           obj.metadata.galleryApiUrl,
 38 |           obj.metadata.id,
 39 |           obj.metadata.downloadUrl,
 40 |           obj.metadata.publisherId,
 41 |           obj.metadata.publisherDisplayName,
 42 |           obj.metadata.date
 43 |         );
 44 |         const item = new ExtensionInformation();
 45 |         item.metadata = meta;
 46 |         item.name = obj.name;
 47 |         item.publisher = obj.publisher;
 48 |         item.version = obj.version;
 49 | 
 50 |         if (item.name !== "code-settings-sync") {
 51 |           extList.push(item);
 52 |         }
 53 |       });
 54 |     } catch (err) {
 55 |       throw new Error(err);
 56 |     }
 57 | 
 58 |     return extList;
 59 |   }
 60 | 
 61 |   public metadata: ExtensionMetadata;
 62 |   public name: string;
 63 |   public version: string;
 64 |   public publisher: string;
 65 | }
 66 | 
 67 | export class ExtensionMetadata {
 68 |   constructor(
 69 |     public galleryApiUrl: string,
 70 |     public id: string,
 71 |     public downloadUrl: string,
 72 |     public publisherId: string,
 73 |     public publisherDisplayName: string,
 74 |     public date: string
 75 |   ) {}
 76 | }
 77 | 
 78 | export class PluginService {
 79 |   public static GetMissingExtensions(
 80 |     remoteExt: string,
 81 |     ignoredExtensions: string[]
 82 |   ) {
 83 |     const remoteList = ExtensionInformation.fromJSONList(remoteExt);
 84 |     const localList = this.CreateExtensionList();
 85 | 
 86 |     return remoteList.filter(
 87 |       ext =>
 88 |         !ignoredExtensions.includes(ext.name) &&
 89 |         !localList.map(e => e.name).includes(ext.name)
 90 |     );
 91 |   }
 92 | 
 93 |   public static GetDeletedExtensions(
 94 |     remoteExtensions: ExtensionInformation[],
 95 |     ignoredExtensions: string[]
 96 |   ) {
 97 |     const localExtensions = this.CreateExtensionList();
 98 | 
 99 |     // for (var i = 0; i < remoteList.length; i++) {
100 | 
101 |     //     var ext = remoteList[i];
102 |     //     var found: boolean = false;
103 | 
104 |     //     for (var j = 0; j < localList.length; j++) {
105 |     //         var localExt = localList[j];
106 |     //         if (ext.name == localExt.name) {
107 |     //             found = true;
108 |     //             break;
109 |     //         }
110 |     //     }
111 |     //     if (!found) {
112 |     //         deletedList.push(localExt);
113 |     //     }
114 | 
115 |     // }
116 | 
117 |     return localExtensions.filter(
118 |       ext =>
119 |         ext.name !== "code-settings-sync" &&
120 |         !remoteExtensions.map(e => e.name).includes(ext.name) &&
121 |         !ignoredExtensions.includes(ext.name)
122 |     );
123 |   }
124 | 
125 |   public static CreateExtensionList() {
126 |     return vscode.extensions.all
127 |       .filter(ext => !ext.packageJSON.isBuiltin)
128 |       .map(ext => {
129 |         const meta = ext.packageJSON.__metadata || {
130 |           id: ext.packageJSON.uuid,
131 |           publisherId: ext.id,
132 |           publisherDisplayName: ext.packageJSON.publisher
133 |         };
134 |         const data = new ExtensionMetadata(
135 |           meta.galleryApiUrl,
136 |           meta.id,
137 |           meta.downloadUrl,
138 |           meta.publisherId,
139 |           meta.publisherDisplayName,
140 |           meta.date
141 |         );
142 |         const info = new ExtensionInformation();
143 |         info.metadata = data;
144 |         info.name = ext.packageJSON.name;
145 |         info.publisher = ext.packageJSON.publisher;
146 |         info.version = ext.packageJSON.version;
147 |         return info;
148 |       });
149 |   }
150 | 
151 |   public static async DeleteExtension(
152 |     extension: ExtensionInformation
153 |   ): Promise<boolean> {
154 |     try {
155 |       await vscode.commands.executeCommand(
156 |         "workbench.extensions.uninstallExtension",
157 |         `${extension.publisher}.${extension.name}`
158 |       );
159 |       return true;
160 |     } catch (err) {
161 |       throw new Error(err);
162 |     }
163 |   }
164 | 
165 |   public static async DeleteExtensions(
166 |     extensionsJson: string,
167 |     ignoredExtensions: string[]
168 |   ): Promise<ExtensionInformation[]> {
169 |     const remoteExtensions = ExtensionInformation.fromJSONList(extensionsJson);
170 |     const toDelete = PluginService.GetDeletedExtensions(
171 |       remoteExtensions,
172 |       ignoredExtensions
173 |     );
174 | 
175 |     return Promise.all(
176 |       toDelete.map(async selectedExtension => {
177 |         try {
178 |           await PluginService.DeleteExtension(selectedExtension);
179 |           return selectedExtension;
180 |         } catch (err) {
181 |           throw new Error(
182 |             `Sync : Unable to delete extension ${selectedExtension.name} ${selectedExtension.version}: ${err}`
183 |           );
184 |         }
185 |       })
186 |     );
187 |   }
188 | 
189 |   public static async InstallExtensions(
190 |     extensions: string,
191 |     ignoredExtensions: string[],
192 |     notificationCallBack: (...data: any[]) => void
193 |   ): Promise<ExtensionInformation[]> {
194 |     let addedExtensions: ExtensionInformation[] = [];
195 |     const missingExtensions = PluginService.GetMissingExtensions(
196 |       extensions,
197 |       ignoredExtensions
198 |     );
199 |     if (missingExtensions.length === 0) {
200 |       notificationCallBack("Sync : No Extensions needs to be installed.");
201 |       return [];
202 |     }
203 |     addedExtensions = await PluginService.InstallWithAPI(
204 |       missingExtensions,
205 |       notificationCallBack
206 |     );
207 |     return addedExtensions;
208 |   }
209 | 
210 |   public static async InstallWithAPI(
211 |     missingExtensions: ExtensionInformation[],
212 |     notificationCallBack: (...data: any[]) => void
213 |   ): Promise<ExtensionInformation[]> {
214 |     const addedExtensions: ExtensionInformation[] = [];
215 |     const missingExtensionsCount = missingExtensions.length;
216 |     notificationCallBack("TOTAL EXTENSIONS : " + missingExtensionsCount);
217 |     notificationCallBack("");
218 |     notificationCallBack("");
219 |     for (const ext of missingExtensions) {
220 |       const name = ext.publisher + "." + ext.name;
221 |       try {
222 |         notificationCallBack("");
223 |         notificationCallBack(`[x] - EXTENSION: ${ext.name} - INSTALLING`);
224 |         await vscode.commands.executeCommand(
225 |           "workbench.extensions.installExtension",
226 |           name
227 |         );
228 |         notificationCallBack("");
229 |         notificationCallBack(`[x] - EXTENSION: ${ext.name} INSTALLED.`);
230 |         notificationCallBack(
231 |           `      ${missingExtensions.indexOf(ext) +
232 |             1} OF ${missingExtensionsCount} INSTALLED`,
233 |           true
234 |         );
235 |         notificationCallBack("");
236 |         addedExtensions.push(ext);
237 |       } catch (err) {
238 |         throw new Error(err);
239 |       }
240 |     }
241 |     return addedExtensions;
242 |   }
243 | }
244 | 


--------------------------------------------------------------------------------
/src/state.ts:
--------------------------------------------------------------------------------
1 | import { IExtensionState } from "./models/state.model";
2 | 
3 | export const state: IExtensionState = {
4 |   instanceID: Math.random().toString()
5 | };
6 | 


--------------------------------------------------------------------------------
/src/util.ts:
--------------------------------------------------------------------------------
 1 | "use strict";
 2 | 
 3 | export class Util {
 4 |   public static async Sleep(ms: number): Promise<number> {
 5 |     return new Promise(resolve => {
 6 |       setTimeout(() => {
 7 |         resolve(ms);
 8 |       }, ms);
 9 |     });
10 |   }
11 |   /**
12 |    * promisify the function
13 |    * it will be remove when vscode use node@^8.0
14 |    * @param fn
15 |    */
16 |   public static promisify(
17 |     fn: (...args: any[]) => any
18 |   ): (...whatever: any[]) => Promise<any> {
19 |     return function(...argv) {
20 |       return new Promise((resolve, reject) => {
21 |         fn.call(this, ...argv, (err, data) => {
22 |           if (err) {
23 |             reject(err);
24 |           } else {
25 |             resolve(data);
26 |           }
27 |         });
28 |       });
29 |     };
30 |   }
31 | }
32 | 


--------------------------------------------------------------------------------
/test/extension.test.ts:
--------------------------------------------------------------------------------
1 | describe("PragmaUtil", () => {
2 |   require("./pragmaUtil");
3 | });
4 | 


--------------------------------------------------------------------------------
/test/index.ts:
--------------------------------------------------------------------------------
1 | import * as testRunner from "vscode/lib/testrunner";
2 | 
3 | testRunner.configure({
4 |   ui: "bdd",
5 |   useColors: true,
6 |   timeout: 5000
7 | });
8 | module.exports = testRunner;
9 | 


--------------------------------------------------------------------------------
/test/pragmaUtil/index.ts:
--------------------------------------------------------------------------------
  1 | import { expect } from "chai";
  2 | import fs = require("fs");
  3 | import { OsType } from "../../src/enums";
  4 | import PragmaUtil from "../../src/pragmaUtil";
  5 | 
  6 | let testSettings = null;
  7 | 
  8 | describe("Process before upload", function() {
  9 |   this.beforeAll(() => {
 10 |     testSettings = fs.readFileSync(
 11 |       __dirname + "/../../../test/pragmaUtil/testSettings.txt",
 12 |       "utf8"
 13 |     );
 14 |   });
 15 | 
 16 |   it("should trim os, host and env", async () => {
 17 |     const result = await PragmaUtil.processBeforeUpload(testSettings);
 18 |     await expect(result).to.match(/@sync os=linux host=trim env=TEST_ENV/);
 19 |   });
 20 | 
 21 |   it("should uncomment all lines", async () => {
 22 |     const commentedSettings = `
 23 |       // @sync os=linux
 24 |       // "window": 1,
 25 |       // @sync os=mac
 26 |       // "server": "http://exmaple.com
 27 |     `;
 28 | 
 29 |     const result = await PragmaUtil.processBeforeUpload(commentedSettings);
 30 |     await expect(result)
 31 |       .to.match(/\s+"window"/)
 32 |       .and.to.match(/\s+"server"/);
 33 |   });
 34 | 
 35 |   it("should uncomment lines before write file for os=linux", () => {
 36 |     const commentedSettings = `{
 37 |       // @sync os=linux
 38 |       // "linux": 1,
 39 |       // @sync os=mac
 40 |         "mac": 1
 41 |     }`;
 42 |     const processed = PragmaUtil.processBeforeWrite(
 43 |       commentedSettings,
 44 |       commentedSettings,
 45 |       OsType.Linux,
 46 |       null
 47 |     );
 48 |     expect(processed)
 49 |       .to.match(/\s+"linux"/)
 50 |       .and.to.match(/\s+\/\/\s+"mac"/);
 51 |   });
 52 | 
 53 |   it("should not comment os=linux settings lines", async () => {
 54 |     let processed = await PragmaUtil.processBeforeUpload(testSettings);
 55 |     processed = PragmaUtil.processBeforeWrite(
 56 |       processed,
 57 |       processed,
 58 |       OsType.Linux,
 59 |       null
 60 |     );
 61 |     expect(processed).to.match(/\s+"not_commented"/);
 62 |   });
 63 | 
 64 |   it("should leave only settings that matches with os=mac host=mac2 env=TEST_ENV", async () => {
 65 |     const processed = await PragmaUtil.processBeforeUpload(testSettings);
 66 |     // tslint:disable-next-line:no-string-literal
 67 |     process.env["TEST_ENV"] = "1";
 68 |     await expect(
 69 |       PragmaUtil.processBeforeWrite(processed, processed, OsType.Mac, "mac2")
 70 |     )
 71 |       .to.match(/\n\s+"mac2"/)
 72 |       .and.match(/\n\s+"mactest"/);
 73 |   });
 74 | 
 75 |   it("should remove all comments and parse JSON", () => {
 76 |     const possibleJson = PragmaUtil.removeAllComments(testSettings);
 77 |     expect(JSON.parse.bind(null, possibleJson)).to.not.throw();
 78 |   });
 79 | 
 80 |   it("should parse multi-line settings", () => {
 81 |     const commentedSettings = `{
 82 |       // @sync os=linux
 83 |       "multi": {
 84 |             "setting": false,
 85 |             "settingWithBrackets": "{} []",
 86 |             "multi": {
 87 |             }
 88 |       },
 89 |       // @sync os=mac
 90 |       "mac": 1
 91 |     }`;
 92 |     const processed = PragmaUtil.processBeforeWrite(
 93 |       commentedSettings,
 94 |       commentedSettings,
 95 |       OsType.Mac,
 96 |       null
 97 |     );
 98 |     expect(processed)
 99 |       .to.match(/\/{2}\s+"multi"/)
100 |       .and.to.match(/\/{2}\s+"setting"/)
101 |       .and.to.match(/\/{2}\s+"settingWithBrackets"/)
102 |       .and.to.match(/\/{2}\s+},/)
103 |       .and.to.match(/\s+"mac"/);
104 |   });
105 | });
106 | 


--------------------------------------------------------------------------------
/test/pragmaUtil/testSettings.txt:
--------------------------------------------------------------------------------
 1 | {
 2 | 
 3 |     // @sync os=windows host=h1
 4 |     "setting.test": 1,
 5 | 
 6 |     // @sync os=windows host=h2
 7 |     "setting.test": 2,
 8 | 
 9 |     // @sync os=  linux host=  trim env= TEST_ENV 
10 |     //"setting.test": 3,
11 | 
12 |     // @sync os=linux
13 |     "not_commented": 4,
14 | 
15 |     // @sync host=_mac1_ os=mac
16 |     "setting.test": 5,
17 | 
18 |     // @sync host=mac2 os=mac env=TEST_ENV
19 |     //"mac2": 3,
20 | 
21 |     // @sync host=mac2
22 |     //"server": "http://example.com",
23 | 
24 |     // @sync os=mac
25 |     "mactest": "",
26 | 
27 |     // @sync host=test1
28 |     "onlyHost": "",    
29 | 
30 |     // @sync-ignore
31 |     "test4": 12,
32 | 
33 |     // @sync ignore
34 |     "test5": 12
35 | }


--------------------------------------------------------------------------------
/test/service/fileService/dummyrc:
--------------------------------------------------------------------------------
1 | {
2 |   "hoge": true,
3 | }


--------------------------------------------------------------------------------
/test/service/fileService/fileService.test.ts:
--------------------------------------------------------------------------------
 1 | import { expect } from "chai";
 2 | 
 3 | import { File, FileService } from "../../../src/service/file.service";
 4 | 
 5 | describe("FileService", () => {
 6 |   it("should get custom file info", async () => {
 7 |     const expected = new File(
 8 |       "dummyrc",
 9 |       '{\n  "hoge": true,\n}',
10 |       __dirname + "/../../../../test/service/fileService/dummyrc",
11 |       "|customized_sync|dummyrc"
12 |     );
13 |     const actual = await FileService.GetCustomFile(
14 |       __dirname + "/../../../../test/service/fileService/dummyrc", // __dirname => out/src/test/service
15 |       "dummyrc"
16 |     );
17 |     expect(actual).to.deep.equals(expected);
18 |   });
19 | 
20 |   it("should return null if file does not exists", async () => {
21 |     const actual = await FileService.GetCustomFile(
22 |       __dirname + "/../../../../test/service/fileService/hoge",
23 |       "hoge"
24 |     );
25 |     expect(actual).to.be.equals(null);
26 |   });
27 | 
28 |   it("should join by path separator", () => {
29 |     const actual = FileService.ConcatPath(
30 |       "/User/path/to",
31 |       "hoge/piyo",
32 |       "hoge.txt"
33 |     );
34 |     expect(actual).to.be.equals("/User/path/to/hoge/piyo/hoge.txt");
35 |   });
36 | });
37 | 


--------------------------------------------------------------------------------
/tsconfig.json:
--------------------------------------------------------------------------------
 1 | {
 2 |   "compilerOptions": {
 3 |     "module": "commonjs",
 4 |     "target": "es5",
 5 |     "outDir": "out",
 6 |     "lib": ["es2015", "es2016", "es2017", "es2018", "esnext"],
 7 |     "sourceMap": true,
 8 |     "rootDir": ".",
 9 |     "noUnusedLocals": true,
10 |     "noUnusedParameters": true
11 |   },
12 |   "exclude": ["node_modules", ".vscode-test"]
13 | }
14 | 


--------------------------------------------------------------------------------
/tslint.json:
--------------------------------------------------------------------------------
 1 | {
 2 |   "extends": [
 3 |     "tslint:recommended",
 4 |     "tslint-plugin-prettier"
 5 |   ],
 6 |   "rules": {
 7 |     "prefer-for-of": false,
 8 |     "prettier": [
 9 |       true,
10 |       {
11 |         "singleQuote": false
12 |       }
13 |     ],
14 |     "max-classes-per-file": false,
15 |     "object-literal-sort-keys": false,
16 |     "trailing-comma": false,
17 |     "arrow-parens": false,
18 |     "no-console": false,
19 |     "object-literal-key-quotes": false,
20 |     "max-line-length": {
21 |       "options": {
22 |         "limit": 260
23 |       }
24 |     }
25 |   },
26 |   "linterOptions": {
27 |     "exclude": []
28 |   }
29 | }


--------------------------------------------------------------------------------
/ui/gist-selection/gist-selection.html:
--------------------------------------------------------------------------------
 1 | <!DOCTYPE html>
 2 | <html lang="en">
 3 |   <head>
 4 |     <meta charset="utf-8" />
 5 |     <meta
 6 |       name="viewport"
 7 |       content="width=device-width, initial-scale=1, shrink-to-fit=no"
 8 |     />
 9 |     <meta
10 |       http-equiv="Content-Security-Policy"
11 |       content="default-src vscode-resource:; script-src 'unsafe-inline' vscode-resource:; style-src 'unsafe-inline' vscode-resource:;"
12 |     />
13 |     <link
14 |       rel="stylesheet"
15 |       href="@PWD/ui/shared/vendor/bootstrap/css/bootstrap.min.css"
16 |     />
17 |     <link
18 |       rel="stylesheet"
19 |       href="@PWD/ui/shared/vendor/fontawesome/css/fontawesome.min.css"
20 |     />
21 |     <link
22 |       rel="stylesheet"
23 |       href="@PWD/ui/shared/vendor/fontawesome/css/solid.min.css"
24 |     />
25 |     <script>
26 |       const pwd = `@PWD`;
27 |     </script>
28 |     <link rel="stylesheet" href="@PWD/ui/shared/styles.css" />
29 |   </head>
30 |   <body class="container d-flex h-100">
31 |     <div class="mx-auto text-center">
32 |       <page-header></page-header>
33 |       <h3 class="mx-auto mt-2 mb-3 text-white-50a">
34 |         Select Your Existing Gist
35 |       </h3>
36 |       <div id="selectionContainer" class="list-group mx-auto text-left"></div>
37 |       <div id="skipContainer"></div>
38 |     </div>
39 |     <div
40 |       class="modal fade"
41 |       id="modal"
42 |       tabindex="-1"
43 |       role="dialog"
44 |       aria-labelledby="exampleModalCenterTitle"
45 |       aria-hidden="true"
46 |     >
47 |       <div class="modal-dialog modal-dialog-centered" role="document">
48 |         <div class="modal-content">
49 |           <div class="modal-header">
50 |             <h5 class="modal-title" id="exampleModalCenterTitle">
51 |               Saved Gist ID!
52 |             </h5>
53 |           </div>
54 |           <div class="modal-body">
55 |             The Gist ID has been saved to the configuration. You may now close
56 |             this tab.
57 |           </div>
58 |           <div class="modal-footer">
59 |             <button
60 |               type="button"
61 |               class="btn btn-secondary"
62 |               data-dismiss="modal"
63 |             >
64 |               Back
65 |             </button>
66 |             <button
67 |               type="button"
68 |               class="btn btn-primary"
69 |               onclick="vscode.postMessage({close: true});"
70 |             >
71 |               Close Tab
72 |             </button>
73 |           </div>
74 |         </div>
75 |       </div>
76 |     </div>
77 |     <script
78 |       defer
79 |       src="@PWD/ui/shared/vendor/jquery/jquery-3.3.1.slim.min.js"
80 |     ></script>
81 |     <script defer src="@PWD/ui/shared/vendor/popper.js/popper.min.js"></script>
82 |     <script
83 |       defer
84 |       src="@PWD/ui/shared/vendor/bootstrap/js/bootstrap.min.js"
85 |     ></script>
86 |     <script defer src="@PWD/ui/shared/page-header.js"></script>
87 |     <script defer src="@PWD/ui/shared/fonts.js"></script>
88 |     <font-injector></font-injector>
89 |     <script defer>
90 |       const gists = JSON.parse(`@GISTS`);
91 |       const skip = @SKIP;
92 |     </script>
93 |     <script defer src="@PWD/ui/gist-selection/gist-selection.js"></script>
94 |   </body>
95 | </html>
96 | 


--------------------------------------------------------------------------------
/ui/gist-selection/gist-selection.js:
--------------------------------------------------------------------------------
 1 | //import { debug } from "vscode";
 2 | 
 3 | // @ts-nocheck
 4 | function appendHTML(parent, html) {
 5 |   var div = document.createElement("div");
 6 |   div.innerHTML = html;
 7 |   while (div.children.length > 0) {
 8 |     parent.appendChild(div.children[0]);
 9 |   }
10 |   div.remove();
11 | }
12 | 
13 | const vscode = acquireVsCodeApi();
14 | /* https://stackoverflow.com/questions/3177836/how-to-format-time-since-xxx-e-g-4-minutes-ago-similar-to-stack-exchange-site */
15 | function timeSince(date) {
16 |   var seconds = Math.floor((new Date() - date) / 1000);
17 | 
18 |   var interval = Math.floor(seconds / 31536000);
19 | 
20 |   if (interval > 1) {
21 |     return interval + " years";
22 |   }
23 |   interval = Math.floor(seconds / 2592000);
24 |   if (interval > 1) {
25 |     return interval + " months";
26 |   }
27 |   interval = Math.floor(seconds / 86400);
28 |   if (interval > 1) {
29 |     return interval + " days";
30 |   }
31 |   interval = Math.floor(seconds / 3600);
32 |   if (interval > 1) {
33 |     return interval + " hours";
34 |   }
35 |   interval = Math.floor(seconds / 60);
36 |   if (interval > 1) {
37 |     return interval + " minutes";
38 |   }
39 |   return Math.floor(seconds) + " seconds";
40 | }
41 | 
42 | function appendHTML(parent, html) {
43 |   var div = document.createElement("div");
44 |   div.innerHTML = html;
45 |   while (div.children.length > 0) {
46 |     parent.appendChild(div.children[0]);
47 |   }
48 |   div.remove();
49 | }
50 | 
51 | function saveGistId(id) {
52 |   vscode.postMessage({ id });
53 |   $("#modal").modal();
54 | }
55 | 
56 | const selectionContainer = document.querySelector("#selectionContainer");
57 | 
58 | document
59 |   .querySelector(".modal-content")
60 |   .classList.add(
61 |     document.body.className.includes("vscode-dark") ? "bg-dark" : "bg-light"
62 |   );
63 | 
64 | const skipContainer = document.querySelector("#skipContainer");
65 | appendHTML(skipContainer, skip);
66 | 
67 | const selectionTemplate = `
68 | <button type="button" onclick="saveGistId('@id')" class="list-group-item list-group-item-action">@description (@id) – Updated @timestamp ago</button>`;
69 | 
70 | if (!gists.length) {
71 |   appendHTML(
72 |     selectionContainer,
73 |     "<p>No Gists found on your account. Skip this window and upload the settings to create a new Gist.</p>"
74 |   );
75 | } else {
76 |   gists
77 |   .sort((a, b) => new Date(b.updated_at) - new Date(a.updated_at))
78 |   .forEach(gist => {
79 |     const html = selectionTemplate
80 |       .replace(new RegExp("@description", "g"), gist.description)
81 |       .replace(new RegExp("@id", "g"), gist.id)
82 |       .replace(
83 |         new RegExp("@timestamp", "g"),
84 |         timeSince(new Date(gist.updated_at))
85 |       );
86 |     appendHTML(selectionContainer, html);
87 |   });
88 | }
89 | 
90 | 


--------------------------------------------------------------------------------
/ui/landing-page/landing-page.html:
--------------------------------------------------------------------------------
  1 | <!DOCTYPE html>
  2 | <html lang="en">
  3 |   <head>
  4 |     <meta charset="utf-8" />
  5 |     <meta
  6 |       name="viewport"
  7 |       content="width=device-width, initial-scale=1, shrink-to-fit=no"
  8 |     />
  9 |     <meta
 10 |       http-equiv="Content-Security-Policy"
 11 |       content="default-src vscode-resource:; script-src 'unsafe-inline' vscode-resource:; style-src 'unsafe-inline' vscode-resource:; img-src data: vscode-resource:;"
 12 |     />
 13 |     <link
 14 |       rel="stylesheet"
 15 |       href="@PWD/ui/shared/vendor/bootstrap/css/bootstrap.min.css"
 16 |     />
 17 |     <link
 18 |       rel="stylesheet"
 19 |       href="@PWD/ui/shared/vendor/fontawesome/css/fontawesome.min.css"
 20 |     />
 21 |     <link
 22 |       rel="stylesheet"
 23 |       href="@PWD/ui/shared/vendor/fontawesome/css/solid.min.css"
 24 |     />
 25 |     <script>
 26 |       const pwd = `@PWD`;
 27 |     </script>
 28 |     <link rel="stylesheet" href="@PWD/ui/shared/styles.css" />
 29 |   </head>
 30 |   <body class="container d-flex h-100 mx-auto my-8 text-center">
 31 |     <page-header></page-header>
 32 |     <div class="row content-row">
 33 |       <div class="col text-left mt-2 scrollable" id="notes">
 34 |         <h3 class="mx-auto pt-2 pb-4 text-white-50a text-center">
 35 |           What's New in
 36 |           <b>
 37 |             <a
 38 |               id="current-version"
 39 |               href="https://github.com/shanalikhan/code-settings-sync/blob/master/CHANGELOG.md"
 40 |               >vX.X.X
 41 |             </a>
 42 |           </b>
 43 |         </h3>
 44 |       </div>
 45 |       <div class="col mt-2 scrollable">
 46 |         <div>
 47 |           <h3 class="mx-auto mt-2 text-white-50a text-left">
 48 |             Configuration
 49 |           </h3>
 50 |           <p class="mx-auto mt-2 mb-3 text-white-50a text-left">
 51 |             Login via GitHub to setup Settings Sync, or configure the settings
 52 |             manually.
 53 |           </p>
 54 |           <div class="container p-0 mb-3">
 55 |             <div class="row">
 56 |               <div class="col">
 57 |                 <a
 58 |                   href="#"
 59 |                   onclick="sendCommand('loginWithGitHub')"
 60 |                   title="Login with GitHub"
 61 |                   class="btn btn-primary font-weight-bold"
 62 |                 >
 63 |                   Login with GitHub
 64 |                 </a>
 65 |               </div>
 66 |               <div class="col">
 67 |                 <a
 68 |                   href="#"
 69 |                   onclick="sendCommand('editConfiguration')"
 70 |                   title="Edit Configuration"
 71 |                   class="btn btn-primary font-weight-bold"
 72 |                 >
 73 |                   Edit Configuration
 74 |                 </a>
 75 |               </div>
 76 |             </div>
 77 |           </div>
 78 |           <div class="text-left my-2">
 79 |             <a
 80 |               href="#"
 81 |               onclick="sendCommand('downloadPublicGist')"
 82 |               title="Download Public Gist"
 83 |               >Download Public Gist</a
 84 |             >
 85 |           </div>
 86 |         </div>
 87 |         <div>
 88 |           <h3 class="mx-auto mb-3 text-white-50a text-left">
 89 |             Show Your Support
 90 |           </h3>
 91 |           <p class="mx-auto mt-2 mb-3 text-white-50a text-left">
 92 |             While being free and open source, if you find
 93 |             <b>Settings Sync</b>
 94 |             useful, please consider supporting it by donating via PayPal or Open
 95 |             Collective.
 96 |           </p>
 97 |           <div class="container p-0 mb-3">
 98 |             <div class="row">
 99 |               <div class="col">
100 |                 <a
101 |                   href="https://opencollective.com/code-settings-sync"
102 |                   title="Become a Sponsor"
103 |                   class="btn btn-primary font-weight-bold"
104 |                   >Become a Sponsor</a
105 |                 >
106 |               </div>
107 |               <div class="col">
108 |                 <a
109 |                   href="https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=4W3EWHHBSYMM8&lc=IE&item_name=Code%20Settings%20Sync&item_number=visual%20studio%20code%20settings%20sync&currency_code=USD&bn=PP%2dDonationsBF%3abtn_donate_SM%2egif%3aNonHosted"
110 |                   title="Donate via PayPal"
111 |                   class="btn btn-primary font-weight-bold"
112 |                   >Donate via PayPal</a
113 |                 >
114 |               </div>
115 |             </div>
116 |           </div>
117 |           <div class="text-left mt-2">
118 |             <a
119 |               href="https://marketplace.visualstudio.com/items?itemName=Shan.code-settings-sync&ssr=false#review-details"
120 |               >Write a Review</a
121 |             ><br />
122 |             <a href="https://github.com/shanalikhan/code-settings-sync"
123 |               >Star or Fork Settings Sync on GitHub</a
124 |             ><br />
125 |             <a href="https://twitter.com/itsShanKhan">Follow me on Twitter</a
126 |             ><br />
127 |           </div>
128 |         </div>
129 |       </div>
130 |     </div>
131 |     <footer class="footer row text-left">
132 |       <div class="col col-one">
133 |         <h3 class="mx-auto mb-3 text-white-50a">
134 |           Need Help?
135 |         </h3>
136 |         <a href="https://shanalikhan.github.io/">Homepage</a><br />
137 |         <a href="https://github.com/shanalikhan/code-settings-sync/issues"
138 |           >Questions & Issues</a
139 |         >
140 |         <br />
141 |         <a
142 |           href="https://github.com/shanalikhan/code-settings-sync/blob/master/CONTRIBUTING.md"
143 |           >Contribute</a
144 |         >
145 |         <br />
146 |       </div>
147 |       <div class="col col-two">
148 |         <h3 class="mb-3">Sponsors</h3>
149 |         <p class="mx-auto mt-2 mb-3 text-white-50a">
150 |           Contact me on
151 |           <a href="https://twitter.com/itsShanKhan">Twitter</a> or
152 |           <a href="https://github.com/shanalikhan">GitHub</a>
153 |         </p>
154 |       </div>
155 |     </footer>
156 |     <form class="form dock-bottom-right">
157 |       <div class="custom-control custom-checkbox">
158 |         <input
159 |           class="custom-control-input checkbox"
160 |           type="checkbox"
161 |           id="customCheck1"
162 |           onclick="sendCommand('dontShowThisAgain', !this.checked)"
163 |         />
164 |         <label for="customCheck1" class="custom-control-label">
165 |           Show this page on startup
166 |         </label>
167 |       </div>
168 |     </form>
169 |     <script defer src="@PWD/ui/shared/page-header.js"></script>
170 |     <script defer src="@PWD/ui/shared/fonts.js"></script>
171 |     <font-injector></font-injector>
172 |     <script defer>
173 |       const releaseNotes = JSON.parse(`@RELEASE_NOTES`);
174 |       const checked = "@CHECKED";
175 |     </script>
176 |     <script defer src="@PWD/ui/landing-page/landing-page.js"></script>
177 |   </body>
178 | </html>
179 | 


--------------------------------------------------------------------------------
/ui/landing-page/landing-page.js:
--------------------------------------------------------------------------------
 1 | // @ts-nocheck
 2 | const vscode = acquireVsCodeApi();
 3 | 
 4 | function sendCommand(command, data) {
 5 |   vscode.postMessage({
 6 |     command,
 7 |     data
 8 |   });
 9 | }
10 | 
11 | function appendHTML(parent, html) {
12 |   var div = document.createElement("div");
13 |   div.innerHTML = html;
14 |   while (div.children.length > 0) {
15 |     parent.appendChild(div.children[0]);
16 |   }
17 |   div.remove();
18 | }
19 | 
20 | const releaseNoteTemplate = `<h5 class="change text-white-50a mx-auto mt-2 mb-2"><span class="badge badge-@COLOR mr-2">@TYPE</span>@NOTE @EXTRA</h5>`;
21 | 
22 | const notesElement = document.querySelector("#notes");
23 | releaseNotes.changes.forEach(change => {
24 |   const html = releaseNoteTemplate
25 |     .replace(new RegExp("@NOTE", "g"), change.details)
26 |     .replace(new RegExp("@TYPE", "g"), change.type)
27 |     .replace(new RegExp("@COLOR", "g"), change.color)
28 |     .replace(
29 |       new RegExp("@EXTRA", "g"),
30 |       change.author && change.pullRequest
31 |         ? `(Thanks to <a href='https://github.com/${change.author}'>@${change.author}</a> for PR <a href='https://github.com/shanalikhan/code-settings-sync/pull/${change.pullRequest}'>#${change.pullRequest}</a>)`
32 |         : ""
33 |     );
34 |   appendHTML(notesElement, html);
35 | });
36 | 
37 | const currentVersionElement = document.querySelector("#current-version");
38 | currentVersionElement.innerHTML = releaseNotes.currentVersion;
39 | 
40 | document.querySelector("#customCheck1").checked = checked === "true";
41 | 


--------------------------------------------------------------------------------
/ui/settings/settings.html:
--------------------------------------------------------------------------------
 1 | <!DOCTYPE html>
 2 | <html lang="en">
 3 |   <head>
 4 |     <meta charset="utf-8" />
 5 |     <meta
 6 |       name="viewport"
 7 |       content="width=device-width, initial-scale=1, shrink-to-fit=no"
 8 |     />
 9 |     <meta
10 |       http-equiv="Content-Security-Policy"
11 |       content="default-src vscode-resource:; script-src 'unsafe-inline' vscode-resource:; style-src 'unsafe-inline' vscode-resource:; img-src data: vscode-resource:;"
12 |     />
13 |     <link
14 |       rel="stylesheet"
15 |       href="@PWD/ui/shared/vendor/bootstrap/css/bootstrap.min.css"
16 |     />
17 |     <link
18 |       rel="stylesheet"
19 |       href="@PWD/ui/shared/vendor/fontawesome/css/fontawesome.min.css"
20 |     />
21 |     <link
22 |       rel="stylesheet"
23 |       href="@PWD/ui/shared/vendor/fontawesome/css/solid.min.css"
24 |     />
25 |     <script>
26 |       const pwd = "@PWD";
27 |     </script>
28 |     <link rel="stylesheet" href="@PWD/ui/shared/styles.css" />
29 |   </head>
30 |   <body class="container d-flex h-100 mx-auto text-center">
31 |     <page-header></page-header>
32 |     <div class="row content-row text-left">
33 |       <div class="col mt-2 scrollable">
34 |         <h3 class="mx-auto mt-2 text-white-50a text-center">
35 |           Environment Settings
36 |         </h3>
37 |         <form id="environmentSettings"></form>
38 |         <p id="saveStatus" class="text-white-50a" style="font-size: 3rem"></p>
39 |       </div>
40 |       <div class="col mt-2 scrollable">
41 |         <h3 class="mx-auto mt-2 text-white-50a text-center">
42 |           Global Settings
43 |         </h3>
44 |         <form id="globalSettings"></form>
45 |       </div>
46 |     </div>
47 |     <script defer src="@PWD/ui/shared/vendor/lodash/lodash.min.js"></script>
48 |     <script
49 |       defer
50 |       src="@PWD/ui/shared/vendor/jquery/jquery-3.3.1.slim.min.js"
51 |     ></script>
52 |     <script defer src="@PWD/ui/shared/vendor/popper.js/popper.min.js"></script>
53 |     <script
54 |       defer
55 |       src="@PWD/ui/shared/vendor/bootstrap/js/bootstrap.min.js"
56 |     ></script>
57 |     <script defer src="@PWD/ui/shared/page-header.js"></script>
58 |     <script defer src="@PWD/ui/shared/fonts.js"></script>
59 |     <font-injector></font-injector>
60 |     <script defer>
61 |       const globalData = JSON.parse(`@GLOBAL_DATA`);
62 |       const envData = JSON.parse(`@ENV_DATA`);
63 |       const globalMap = JSON.parse(`@GLOBAL_MAP`);
64 |       const envMap = JSON.parse(`@ENV_MAP`);
65 |     </script>
66 |     <script defer src="@PWD/ui/settings/settings.js"></script>
67 |   </body>
68 | </html>
69 | 


--------------------------------------------------------------------------------
/ui/settings/settings.js:
--------------------------------------------------------------------------------
  1 | // @ts-nocheck
  2 | 
  3 | function appendHTML(parent, html) {
  4 |   var div = document.createElement("div");
  5 |   div.innerHTML = html;
  6 |   while (div.children.length > 0) {
  7 |     parent.appendChild(div.children[0]);
  8 |   }
  9 |   div.remove();
 10 | }
 11 | 
 12 | const vscode = acquireVsCodeApi();
 13 | 
 14 | const textInputTemplate = `<div class="form-group mb-4">
 15 |             <label for="setting:@correspondingSetting" class="text-white-50a"
 16 |               >@name</label
 17 |             >
 18 |             @tooltip
 19 |             <input
 20 |               type="text"
 21 |               class="form-control text"
 22 |               id="setting:@correspondingSetting"
 23 |               placeholder="@placeholder"
 24 |               setting="@correspondingSetting"
 25 |               settingType="@settingType"
 26 |             />
 27 |           </div>`;
 28 | 
 29 | const textInputGroupTemplate = `<div class="mb-4">
 30 |           <label for="setting:@correspondingSetting" class="text-white-50a"
 31 |             >@name</label
 32 |           >
 33 |           @tooltip
 34 |           <div class="input-group">
 35 |             <input
 36 |               type="text"
 37 |               class="form-control text"
 38 |               id="setting:@correspondingSetting"
 39 |               placeholder="@placeholder"
 40 |               setting="@correspondingSetting"
 41 |               settingType="@settingType"
 42 |             />
 43 |             <div class="input-group-append">
 44 |               <button class="btn btn-primary" @disabled onclick="@action" type="button" id="button-addon2">View</button>
 45 |             </div>
 46 |           </div>
 47 |         </div>`;
 48 | 
 49 | const numberInputTemplate = `<div class="form-group mb-4">
 50 |             <label for="setting:@correspondingSetting" class="text-white-50a"
 51 |               >@name</label
 52 |             >
 53 |             @tooltip
 54 |             <input
 55 |               type="number"
 56 |               class="form-control number"
 57 |               id="setting:@correspondingSetting"
 58 |               placeholder="@placeholder"
 59 |               setting="@correspondingSetting"
 60 |               settingType="@settingType"
 61 |             />
 62 |           </div>`;
 63 | 
 64 | const checkboxTemplate = `<div class="custom-control custom-checkbox my-1 mr-sm-2 mb-4">
 65 |             <input
 66 |               class="custom-control-input checkbox"
 67 |               type="checkbox"
 68 |               id="setting:@correspondingSetting"
 69 |               setting="@correspondingSetting"
 70 |               settingType="@settingType"
 71 |             />
 72 |             <label
 73 |               for="setting:@correspondingSetting"
 74 |               class="custom-control-label text-white-50a"
 75 |             >@name</label>
 76 |             @tooltip
 77 |           </div>`;
 78 | 
 79 | const textareaTemplate = `<div class="form-group mb-3">
 80 |             <label
 81 |               for="setting:@correspondingSetting"
 82 |               class="text-white-50a"
 83 |               >@name</label>
 84 |               @tooltip
 85 |             <textarea
 86 |               class="form-control textarea"
 87 |               id="setting:@correspondingSetting"
 88 |               data-min-rows="1"
 89 |               placeholder="@placeholder"
 90 |               setting="@correspondingSetting"
 91 |               settingType="@settingType"
 92 |             ></textarea>
 93 |           </div>`;
 94 | 
 95 | const globalParent = document.getElementById("globalSettings");
 96 | const envParent = document.getElementById("environmentSettings");
 97 | const saveStatus = document.getElementById("saveStatus");
 98 | 
 99 | globalMap.forEach(settingMap => {
100 |   let template;
101 |   switch (settingMap.type) {
102 |     case "textinput":
103 |       template = textInputTemplate;
104 |       break;
105 |     case "numberinput":
106 |       template = numberInputTemplate;
107 |       break;
108 |     case "checkbox":
109 |       template = checkboxTemplate;
110 |       break;
111 |     case "textarea":
112 |       template = textareaTemplate;
113 |       break;
114 |   }
115 |   const html = template
116 |     .replace(new RegExp("@name", "g"), settingMap.name)
117 |     .replace(new RegExp("@placeholder", "g"), settingMap.placeholder)
118 |     .replace(
119 |       new RegExp("@correspondingSetting", "g"),
120 |       settingMap.correspondingSetting
121 |     )
122 |     .replace(new RegExp("@tooltip"), "")
123 |     .replace(new RegExp("@settingType", "g"), "global");
124 |   appendHTML(globalParent, html);
125 | });
126 | 
127 | envMap.forEach(envMap => {
128 |   let template;
129 |   switch (envMap.type) {
130 |     case "textinput":
131 |       template = textInputTemplate;
132 |       break;
133 |     case "numberinput":
134 |       template = textInputTemplate;
135 |       break;
136 |     case "checkbox":
137 |       template = checkboxTemplate;
138 |       break;
139 |   }
140 |   const isInputGroup = envMap.correspondingSetting === "gist";
141 |   let disabledStatus = "";
142 |   if (isInputGroup) {
143 |     template = textInputGroupTemplate;
144 |     if (!_.get(envData, "gist") || !_.get(globalData, "token")) {
145 |       disabledStatus = "disabled";
146 |     }
147 |   }
148 |   const html = template
149 |     .replace(new RegExp("@name", "g"), envMap.name)
150 |     .replace(new RegExp("@placeholder", "g"), envMap.placeholder)
151 |     .replace(
152 |       new RegExp("@correspondingSetting", "g"),
153 |       envMap.correspondingSetting
154 |     )
155 |     .replace(
156 |       new RegExp("@tooltip"),
157 |       `
158 |       <a
159 |         class="text-white-50a fas fa-info-circle"
160 |         data-toggle="tooltip" 
161 |         data-placement="right" 
162 |         title="${envMap.tooltip}">
163 |       </a>
164 |       `
165 |     )
166 |     .replace(new RegExp("@settingType", "g"), "env")
167 |     .replace(
168 |       new RegExp("@action", "g"),
169 |       `inputGroupAction('${envMap.correspondingSetting}')`
170 |     )
171 |     .replace(new RegExp("@disabled", "g"), disabledStatus);
172 |   appendHTML(envParent, html);
173 | });
174 | 
175 | $(document).ready(function() {
176 |   save();
177 |   $('[data-toggle="tooltip"]').tooltip({ container: "html" });
178 |   $(".text")
179 |     .each((i, el) => {
180 |       if ($(el).attr("settingType") === "global") {
181 |         $(el).val(_.get(globalData, $(el).attr("setting")));
182 |       } else {
183 |         $(el).val(envData[$(el).attr("setting")]);
184 |       }
185 |     })
186 |     .change(function() {
187 |       save();
188 |       let val = $(this).val();
189 |       vscode.postMessage({
190 |         command: $(this).attr("setting"),
191 |         text: val,
192 |         type: $(this).attr("settingType")
193 |       });
194 |     });
195 |   $(".number")
196 |     .each((i, el) => {
197 |       if ($(el).attr("settingType") === "global") {
198 |         $(el).val(_.get(globalData, $(el).attr("setting")));
199 |       } else {
200 |         $(el).val(envData[$(el).attr("setting")]);
201 |       }
202 |     })
203 |     .change(function() {
204 |       save();
205 |       let val = Number($(this).val());
206 |       vscode.postMessage({
207 |         command: $(this).attr("setting"),
208 |         text: val,
209 |         type: $(this).attr("settingType")
210 |       });
211 |     });
212 |   $(".checkbox")
213 |     .each((i, el) => {
214 |       if ($(el).attr("settingType") === "global") {
215 |         $(el).prop("checked", _.get(globalData, $(el).attr("setting")));
216 |       } else {
217 |         $(el).prop("checked", envData[$(el).attr("setting")]);
218 |       }
219 |     })
220 |     .change(function() {
221 |       save();
222 |       let val = $(this).is(":checked");
223 |       vscode.postMessage({
224 |         command: $(this).attr("setting"),
225 |         text: val,
226 |         type: $(this).attr("settingType")
227 |       });
228 |     });
229 |   $(".textarea")
230 |     .each((i, el) => {
231 |       let str = "";
232 |       const items = _.get(globalData, $(el).attr("setting"));
233 |       items.forEach(item => (str += item + "\n"));
234 |       $(el).val(str.slice(0, -1));
235 |       $(el).prop("rows", items.length);
236 |     })
237 |     .change(function() {
238 |       save();
239 |       let val = [];
240 |       $(this)
241 |         .val()
242 |         .split("\n")
243 |         .forEach(item => {
244 |           if (item !== "") {
245 |             val.push(item);
246 |           }
247 |         });
248 |       vscode.postMessage({
249 |         command: $(this).attr("setting"),
250 |         text: val,
251 |         type: "global"
252 |       });
253 |     });
254 | });
255 | 
256 | function save() {
257 |   saveStatus.innerHTML = `<i class="spinner-border dock-bottom-left"></i>`;
258 |   setTimeout(
259 |     () =>
260 |       (saveStatus.innerHTML = `<i class="fas fa-check dock-bottom-left"></i>`),
261 |     1000
262 |   );
263 | }
264 | 
265 | function inputGroupAction(setting) {
266 |   if (setting === "gist") {
267 |     vscode.postMessage("openGist");
268 |   }
269 | }
270 | 


--------------------------------------------------------------------------------
/ui/shared/fonts.js:
--------------------------------------------------------------------------------
 1 | // @ts-nocheck
 2 | 
 3 | document.querySelector("font-injector").innerHTML = `<style>
 4 | @font-face {
 5 |   font-family: Roboto;
 6 |   src: url(${pwd}/ui/shared/vendor/google/Roboto-Bold.ttf);
 7 |   font-weight: 700;
 8 | }
 9 | @font-face {
10 |   font-family: Roboto;
11 |   src: url(${pwd}/ui/shared/vendor/google/Roboto-Regular.ttf);
12 |   font-weight: 400;
13 | }
14 | @font-face {
15 |   font-family: "Open Sans";
16 |   src: url(${pwd}/ui/shared/vendor/google/OpenSans-Bold.ttf);
17 |   font-weight: 700;
18 | }
19 | </style>`;
20 | 


--------------------------------------------------------------------------------
/ui/shared/page-header.js:
--------------------------------------------------------------------------------
 1 | // @ts-nocheck
 2 | 
 3 | document.querySelector("page-header").innerHTML = `
 4 | <h1 class="pb-4">
 5 | <img
 6 | src="${pwd}/images/white-cloud.png"
 7 | width="100"
 8 | class="my-auto logo"
 9 | alt="Settings Sync"
10 | />
11 | Settings Sync
12 | </h1>
13 | <h2 class="mx-auto pt-2">
14 | <b>Synchronize</b> settings, snippets, themes, icons, launch,
15 | keybindings, workspaces and extensions across machines
16 | using GitHub Gist.
17 | </h2>
18 | <br/>`;
19 | 


--------------------------------------------------------------------------------
/ui/shared/styles.css:
--------------------------------------------------------------------------------
  1 | html,
  2 | body {
  3 |   height: 100%;
  4 |   width: 100%;
  5 |   display: flex;
  6 |   flex-direction: column;
  7 |   font-family: "Roboto", sans-serif;
  8 |   letter-spacing: 0.0625em;
  9 | }
 10 | 
 11 | body.vscode-dark {
 12 |   background-color: #1b1b1b;
 13 |   color: #e9e9e9;
 14 | }
 15 | 
 16 | body.vscode-light {
 17 |   background-color: #fff;
 18 |   color: #1b1b1b;
 19 | }
 20 | 
 21 | .vscode-light .logo {
 22 |   -webkit-filter: invert(1) opacity(0.5);
 23 |   filter: invert(1) opacity(0.5);
 24 | }
 25 | 
 26 | .tooltip {
 27 |   display: block;
 28 | }
 29 | 
 30 | .content-row {
 31 |   flex-grow: 1;
 32 |   overflow-y: hidden;
 33 |   padding-bottom: 1rem;
 34 | }
 35 | 
 36 | .modal-header {
 37 |   border-bottom: none;
 38 | }
 39 | 
 40 | .modal-footer {
 41 |   border-top: none;
 42 | }
 43 | 
 44 | .modal-body {
 45 |   padding: 0rem 1rem;
 46 | }
 47 | 
 48 | .footer > .col-one {
 49 |   padding-left: 0;
 50 | }
 51 | 
 52 | .footer > .col-two {
 53 |   padding-right: 0;
 54 | }
 55 | 
 56 | .footer {
 57 |   margin: 0;
 58 | }
 59 | 
 60 | .scrollable {
 61 |   overflow-y: auto;
 62 | }
 63 | 
 64 | .content {
 65 |   background-color: burlywood;
 66 |   overflow: scroll;
 67 | }
 68 | 
 69 | :root {
 70 |   --btn: #0e629c;
 71 |   --btn-hover: #15496e;
 72 |   --btn-click: #0e3450;
 73 |   --link: dodgerblue;
 74 |   --link-hover: rgb(15, 109, 204);
 75 | }
 76 | 
 77 | .dock-bottom-left {
 78 |   position: fixed;
 79 |   bottom: 4rem;
 80 |   left: 4rem;
 81 | }
 82 | 
 83 | .dock-bottom-right {
 84 |   position: fixed;
 85 |   bottom: 1rem;
 86 |   right: 1rem;
 87 |   background-color: rgb(42, 42, 42);
 88 |   border-radius: 1.5rem;
 89 |   padding-left: 1rem;
 90 |   padding-right: 1rem;
 91 |   padding-top: 0.5rem;
 92 |   padding-bottom: 0.5rem;
 93 | }
 94 | 
 95 | .logo {
 96 |   padding-right: 0.5rem;
 97 |   filter: opacity(0.5);
 98 | }
 99 | 
100 | .change {
101 |   line-height: 150%;
102 | }
103 | 
104 | .badge-success {
105 |   color: #fff;
106 |   background-color: #73c991;
107 | }
108 | 
109 | .badge-danger {
110 |   color: #fff;
111 |   background-color: #ce4f59;
112 | }
113 | 
114 | .badge {
115 |   vertical-align: 2px;
116 |   line-height: 120%;
117 |   width: 6rem;
118 | }
119 | 
120 | body {
121 |   position: relative;
122 |   min-height: 35rem;
123 |   background-position: center;
124 |   background-repeat: no-repeat;
125 |   background-attachment: scroll;
126 |   background-size: cover;
127 |   margin-top: 40px;
128 |   margin-bottom: 40px;
129 | }
130 | 
131 | body h1 {
132 |   font-size: 3.5rem;
133 |   line-height: 2.5rem;
134 |   font-weight: bold;
135 |   color: #808080 !important;
136 |   font-family: "Open Sans";
137 |   display: flex;
138 |   align-items: center; /* align vertical */
139 |   justify-content: center; /* align horizontal */
140 | }
141 | 
142 | body h2 {
143 |   /* max-width: 20rem; */
144 |   font-size: 1rem;
145 | }
146 | 
147 | body h3 {
148 |   /* max-width: 20rem; */
149 |   font-size: 1.5rem;
150 | }
151 | 
152 | .btn {
153 |   -webkit-box-shadow: 0 0.1875rem 0.1875rem 0 rgba(0, 0, 0, 0.1) !important;
154 |   box-shadow: 0 0.1875rem 0.1875rem 0 rgba(0, 0, 0, 0.1) !important;
155 |   padding: 1rem;
156 |   font-size: 80%;
157 |   text-transform: uppercase;
158 |   letter-spacing: 0.15rem;
159 |   border: 0;
160 |   width: 100%;
161 |   height: 100%;
162 |   display: flex;
163 |   justify-content: center; /* align horizontal */
164 |   align-items: center; /* align vertical */
165 | }
166 | 
167 | .btn-primary {
168 |   color: #fff !important;
169 | }
170 | 
171 | .btn-primary,
172 | .btn-primary:focus {
173 |   background-color: var(--btn) !important;
174 | }
175 | 
176 | .btn-primary:hover,
177 | .btn-primary:active {
178 |   background-color: var(--btn-hover) !important;
179 | }
180 | 
181 | .text,
182 | .textarea,
183 | .number {
184 |   -webkit-box-shadow: 0 0.1875rem 0.1875rem 0 rgba(0, 0, 0, 0.1) !important;
185 |   box-shadow: 0 0.1875rem 0.1875rem 0 rgba(0, 0, 0, 0.1) !important;
186 |   padding: 1.25rem 2rem;
187 |   height: auto;
188 |   border: 0;
189 | }
190 | 
191 | a {
192 |   color: var(--link);
193 | }
194 | 
195 | a:focus,
196 | a:hover {
197 |   text-decoration: none;
198 |   color: var(--link-hover);
199 | }
200 | 


--------------------------------------------------------------------------------
/ui/shared/vendor/fontawesome/css/solid.min.css:
--------------------------------------------------------------------------------
1 | /*!
2 |  * Font Awesome Free 5.9.0 by @fontawesome - https://fontawesome.com
3 |  * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
4 |  */
5 | @font-face{font-family:"Font Awesome 5 Free";font-style:normal;font-weight:900;font-display:auto;src:url(../webfonts/fa-solid-900.ttf) format("truetype")}.fa,.fas{font-family:"Font Awesome 5 Free";font-weight:900}


--------------------------------------------------------------------------------
/ui/shared/vendor/fontawesome/webfonts/fa-solid-900.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/shanalikhan/code-settings-sync/eb332ba5e8180680e613e94be89119119c5638d1/ui/shared/vendor/fontawesome/webfonts/fa-solid-900.ttf


--------------------------------------------------------------------------------
/ui/shared/vendor/google/OpenSans-Bold.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/shanalikhan/code-settings-sync/eb332ba5e8180680e613e94be89119119c5638d1/ui/shared/vendor/google/OpenSans-Bold.ttf


--------------------------------------------------------------------------------
/ui/shared/vendor/google/Roboto-Bold.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/shanalikhan/code-settings-sync/eb332ba5e8180680e613e94be89119119c5638d1/ui/shared/vendor/google/Roboto-Bold.ttf


--------------------------------------------------------------------------------
/ui/shared/vendor/google/Roboto-Regular.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/shanalikhan/code-settings-sync/eb332ba5e8180680e613e94be89119119c5638d1/ui/shared/vendor/google/Roboto-Regular.ttf


--------------------------------------------------------------------------------